From fac6a09e0d669e80cac2bdeca303c825c13d820e Mon Sep 17 00:00:00 2001 From: Chris Rericha Date: Thu, 30 Oct 2025 16:46:26 -0400 Subject: [PATCH 1/2] Fix: Make macro evaluator locals available from macro calls in jinja --- sqlmesh/core/renderer.py | 15 +++++++-------- tests/core/test_model.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/sqlmesh/core/renderer.py b/sqlmesh/core/renderer.py index 9e750159be..0cbf9b6e94 100644 --- a/sqlmesh/core/renderer.py +++ b/sqlmesh/core/renderer.py @@ -196,7 +196,14 @@ def _resolve_table(table: str | exp.Table) -> str: **kwargs, } + if this_model: + render_kwargs["this_model"] = this_model + + macro_evaluator.locals.update(render_kwargs) + variables = kwargs.pop("variables", {}) + if variables: + macro_evaluator.locals.setdefault(c.SQLMESH_VARS, {}).update(variables) expressions = [self._expression] if isinstance(self._expression, d.Jinja): @@ -268,14 +275,6 @@ def _resolve_table(table: str | exp.Table) -> str: f"Could not parse the rendered jinja at '{self._path}'.\n{ex}" ) from ex - if this_model: - render_kwargs["this_model"] = this_model - - macro_evaluator.locals.update(render_kwargs) - - if variables: - macro_evaluator.locals.setdefault(c.SQLMESH_VARS, {}).update(variables) - for definition in self._macro_definitions: try: macro_evaluator.evaluate(definition) diff --git a/tests/core/test_model.py b/tests/core/test_model.py index 1ada9bd4a5..7c378f3819 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -12158,3 +12158,21 @@ def test_grants_empty_values(): def test_grants_table_type(kind: t.Union[str, _ModelKind], expected: DataObjectType): model = create_sql_model("test_table", parse_one("SELECT 1 as id"), kind=kind) assert model.grants_table_type == expected + + +def test_model_macro_using_locals_called_from_jinja(assert_exp_eq) -> None: + @macro() + def execution_date(evaluator): + return f"""'{evaluator.locals.get("execution_date")}'""" + + expressions = d.parse( + """ + MODEL (name db.table); + + JINJA_QUERY_BEGIN; + SELECT {{ execution_date() }} AS col; + JINJA_END; + """ + ) + model = load_sql_based_model(expressions) + assert_exp_eq(model.render_query(variables={"default": 42}), '''SELECT '1970-01-01' AS "col"''') From 9f4d40df91dbca3a71036551ca23d1d9d0fb73c3 Mon Sep 17 00:00:00 2001 From: Chris Rericha Date: Thu, 30 Oct 2025 17:24:27 -0400 Subject: [PATCH 2/2] Update test not to include variable --- tests/core/test_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/test_model.py b/tests/core/test_model.py index 7c378f3819..a45e1e1e67 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -12175,4 +12175,4 @@ def execution_date(evaluator): """ ) model = load_sql_based_model(expressions) - assert_exp_eq(model.render_query(variables={"default": 42}), '''SELECT '1970-01-01' AS "col"''') + assert_exp_eq(model.render_query(), '''SELECT '1970-01-01' AS "col"''')