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..a45e1e1e67 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(), '''SELECT '1970-01-01' AS "col"''')