{"record":{"id":"e09683802a799826","repo":"apache/superset","slug":"error-in-jinja-expression-in-metric-expression","errorCode":null,"errorMessage":"Error in jinja expression in metric expression: %(msg)s","messagePattern":"Error in jinja expression in metric expression: (.+?)","errorType":"validation","errorClass":"QueryObjectValidationError","httpStatus":400,"severity":"error","filePath":"superset/connectors/sqla/models.py","lineNumber":1383,"sourceCode":"            self.table.database,\n            self.table.catalog,\n            self.table.schema,\n            self.table.db_engine_spec.engine,\n        )\n\n    def get_sqla_col(\n        self,\n        label: str | None = None,\n        template_processor: BaseTemplateProcessor | None = None,\n    ) -> Column:\n        label = label or self.metric_name\n        expression = self.expression\n        if template_processor:\n            try:\n                expression = template_processor.process_template(expression)\n            except SupersetSyntaxErrorException as ex:\n                msg = str(ex)\n                raise QueryObjectValidationError(\n                    _(\n                        \"Error in jinja expression in metric expression: %(msg)s\",\n                        msg=msg,\n                    )\n                ) from ex\n            if expression != self.expression:\n                # Re-check the rendered expression before embedding it.\n                expression = validate_rendered_expression(\n                    expression,\n                    self.table.database,\n                    self.table.catalog,\n                    self.table.schema,\n                )\n\n        if expression:\n            expression = self._validate_stored_expression(expression)\n        sqla_col: ColumnClause = literal_column(expression)\n        return self.table.database.make_sqla_column_compatible(sqla_col, label)","sourceCodeStart":1365,"sourceCodeEnd":1401,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/connectors/sqla/models.py#L1365-L1401","documentation":"QueryObjectValidationError raised in SqlMetric.get_sqla_col (models.py:1383) when Jinja processing of a saved metric's SQL expression throws SupersetSyntaxErrorException. Metrics stored on the dataset (as opposed to adhoc metrics) can contain Jinja; the expression is rendered before being turned into a literal_column in the query.","triggerScenarios":"A dataset metric whose expression embeds Jinja (e.g. SUM({{ column_for_total }}) or filter_values-dependent logic) that fails at render time — undefined macro, syntax error, or sandbox restriction — when any chart aggregates that metric.","commonSituations":"Metric Jinja authored for interactive dashboards breaking under reports/alerts/thumbnails where runtime filter context is missing; typos in macros; upgrade tightening the sandbox so previously-rendering filters now raise.","solutions":["Edit the metric in the dataset editor and fix/guard the Jinja (|default for filter_values, remove undefined macros).","Read %(msg)s — it pinpoints which part of the template failed.","If Jinja is unnecessary for the metric, replace with plain SQL so rendering cannot fail.","For context-dependent metrics, prefer two variants: one plain for scheduled artifacts, one templated for interactive use."],"exampleFix":"-- before (metric SQL expression)\nSUM({{ filter_values('amount_col')[0] }})\n\n-- after\nSUM({{ filter_values('amount_col') | default(['amount'], true) | first }})","handlingStrategy":"try-catch","validationCode":"from jinja2.sandbox import SandboxedEnvironment\n\ndef metric_expression_renders(expression: str) -> bool:\n    try:\n        SandboxedEnvironment().from_string(expression).render({})\n        return True\n    except Exception:\n        return False","typeGuard":null,"tryCatchPattern":"from superset.exceptions import QueryObjectValidationError\n\ntry:\n    metric_col = sql_metric.get_sqla_col(template_processor=processor)\nexcept QueryObjectValidationError as ex:\n    if \"metric expression\" in str(ex):\n        flag_stored_metric(sql_metric.metric_name, ex)\n    raise","preventionTips":["Prefer plain SQL in stored metrics; use Jinja only when the value must be context-dependent.","Default-guard filter_values-based metric Jinja.","Smoke-test all dataset metrics with an empty filter context after authoring."],"tags":["jinja","metric","dataset","superset"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}