{"record":{"id":"b9b008520ca57631","repo":"apache/superset","slug":"created-by-fk-or-editor-only-supports-eq-got-b9b008","errorCode":null,"errorMessage":"created_by_fk_or_editor only supports 'eq'; got '{c.opr}'","messagePattern":"created_by_fk_or_editor only supports 'eq'; got '(.+?)'","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"superset/daos/report.py","lineNumber":83,"sourceCode":"            if c.col == \"editor\":\n                from superset.subjects.models import report_schedule_editors, Subject\n\n                operator_enum = ColumnOperatorEnum(c.opr)\n                subq = (\n                    select(report_schedule_editors.c.report_schedule_id)\n                    .join(\n                        Subject.__table__,\n                        Subject.__table__.c.id == report_schedule_editors.c.subject_id,\n                    )\n                    .where(\n                        Subject.__table__.c.type == 1,\n                        operator_enum.apply(Subject.__table__.c.user_id, c.value),\n                    )\n                )\n                query = query.filter(ReportSchedule.id.in_(subq))\n            elif c.col == \"created_by_fk_or_editor\":\n                if c.opr != \"eq\":\n                    raise ValueError(\n                        f\"created_by_fk_or_editor only supports 'eq'; got '{c.opr}'\"\n                    )\n                from superset.subjects.models import report_schedule_editors, Subject\n\n                editor_subq = (\n                    select(report_schedule_editors.c.report_schedule_id)\n                    .join(\n                        Subject.__table__,\n                        Subject.__table__.c.id == report_schedule_editors.c.subject_id,\n                    )\n                    .where(\n                        Subject.__table__.c.type == 1,\n                        Subject.__table__.c.user_id == c.value,\n                    )\n                )\n                query = query.filter(\n                    or_(\n                        ReportSchedule.created_by_fk == c.value,","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/daos/report.py#L65-L101","documentation":"Raised in ReportDAO's filter hook while processing the synthetic filter column 'created_by_fk_or_editor'. This pseudo-column lets report schedules be filtered by creator OR by listed editors (via the report_schedule_editors/Subject join), but only equality filtering is implemented, so any other FilterOperator ('in', 'neq', 'like', ...) triggers this ValueError. Because it escapes as an unhandled ValueError, callers typically see a 500 rather than a 400.","triggerScenarios":"GET /api/v1/report with filters=[{'col':'created_by_fk_or_editor','opr':'in','value':[1,2]}] or opr='neq'; any API client or UI that maps an editor/creator dropdown to a multi-select 'in' filter on this column.","commonSituations":"Custom report-management UIs that allow multi-select owner filtering; programmatic integrations reusing generic FilterOperators when building report queries; upgrades that introduced the pseudo-column while older assumptions about arbitrary operators persisted.","solutions":["Use opr='eq' with a single user id when filtering on created_by_fk_or_editor.","If you need multi-value semantics, issue separate eq requests and merge results, or filter on a different real column.","To support more operators, extend the branch in superset/daos/report.py to translate the operator onto the subquery (e.g. Subject.user_id.in_) and add tests.","Validate the operator client-side against {'eq'} before sending the filter."],"exampleFix":"# before\nfilters=[{'col': 'created_by_fk_or_editor', 'opr': 'in', 'value': [1, 2]}]  # ValueError\n\n# after\nfilters=[{'col': 'created_by_fk_or_editor', 'opr': 'eq', 'value': current_user_id}]","handlingStrategy":"validation","validationCode":"def report_owner_filter(user_id: int):\n    return [{'col': 'created_by_fk_or_editor', 'opr': 'eq', 'value': user_id}]","typeGuard":null,"tryCatchPattern":"try:\n    reports = ReportDAO.fetch(...)  # applies created_by_fk_or_editor filter\nexcept ValueError as err:\n    if 'only supports' in str(err):\n        filters = [f for f in filters if f['col'] != 'created_by_fk_or_editor' or f['opr'] == 'eq']\n        retry with sanitized filters","preventionTips":["Treat created_by_fk_or_editor as eq-only in client models and validators.","Add client-side filter validation for pseudo-columns before calling report APIs.","When adding pseudo-columns, also extend API filter schemas so bad operators return 400 not 500."],"tags":["reports","filter","api-misuse","validation","dao"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}