{"record":{"id":"2ca8a1f351176346","repo":"apache/superset","slug":"error-in-jinja-expression-in-datetime-column-ms","errorCode":null,"errorMessage":"Error in jinja expression in datetime column: %(msg)s","messagePattern":"Error in jinja expression in datetime column: (.+?)","errorType":"validation","errorClass":"QueryObjectValidationError","httpStatus":400,"severity":"error","filePath":"superset/connectors/sqla/models.py","lineNumber":1270,"sourceCode":"        \"\"\"\n        label = label or utils.DTTM_ALIAS\n\n        pdf = self.python_date_format\n        is_epoch = pdf in (\"epoch_s\", \"epoch_ms\")\n        column_spec = self.db_engine_spec.get_column_spec(\n            self.type, db_extra=self.db_extra\n        )\n        type_ = column_spec.sqla_type if column_spec else DateTime\n        if not self.expression and not time_grain and not is_epoch:\n            sqla_col = column(self.column_name, type_=type_)\n            return self.database.make_sqla_column_compatible(sqla_col, label)\n        if 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 datetime column: %(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.database,\n                        self.table.catalog if self.table else None,\n                        self.table.schema if self.table else None,\n                    )\n            expression = self._validate_stored_expression(expression)\n            col = literal_column(expression, type_=type_)\n        else:\n            col = column(self.column_name, type_=type_)\n        time_expr = self.db_engine_spec.get_timestamp_expr(col, pdf, time_grain)","sourceCodeStart":1252,"sourceCodeEnd":1288,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/connectors/sqla/models.py#L1252-L1288","documentation":"QueryObjectValidationError raised in TableColumn.get_time_column (models.py:1270) when Jinja processing of a temporal column's expression fails with SupersetSyntaxErrorException. This path is used when the column serves as the time/datetime axis (with expression, time grain, or epoch handling); its Jinja must render before Superset can build the timestamp expression.","triggerScenarios":"A dataset column marked is_dttm whose SQL expression contains Jinja that fails to render when a chart uses it as the time column with a time grain (e.g. {{ render_time('x') }} macro missing, or filter-dependent macro in a context without those filters).","commonSituations":"Templated time columns designed for dashboard filter context being used in alerts/reports or thumbnail generation where the filter context is absent; macro renamed or removed; malformed Jinja in the temporal expression.","solutions":["Fix or guard the Jinja in the temporal column's expression so it renders in every context (default values for filter-dependent macros).","If the macro is not needed for the temporal expression, remove the Jinja and use plain SQL.","Re-run the chart with the dashboard filters present to confirm the macro itself is sound; then make it resilient for headless contexts."],"exampleFix":"-- before (temporal column expression)\nDATE_TRUNC('day', {{ event_time_col }})\n\n-- after\nDATE_TRUNC('day', {{ event_time_col | default(\"created_at\", true) }})","handlingStrategy":"try-catch","validationCode":"from jinja2.sandbox import SandboxedEnvironment\n\ndef temporal_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    time_col = table_column.get_time_column(time_grain='P1D', template_processor=processor)\nexcept QueryObjectValidationError as ex:\n    if \"datetime column\" in str(ex):\n        # the temporal column's Jinja is broken at the dataset level\n        flag_dataset_for_maintenance(table_column.table_id)\n    raise","preventionTips":["Keep temporal column expressions static when possible; Jinja in time columns multiplies failure modes.","Guard macro defaults so headless renders succeed.","Include a no-filter-context render test for every templated time column."],"tags":["jinja","time-column","dataset","superset"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}