Skip to content

Commit 53abda3

Browse files
committed
Fix bugs
1 parent fe7924a commit 53abda3

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed

sqlmesh/core/macros.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -533,17 +533,17 @@ def views(self) -> t.List[str]:
533533

534534
def var(self, var_name: str, default: t.Optional[t.Any] = None) -> t.Optional[t.Any]:
535535
"""Returns the value of the specified variable, or the default value if it doesn't exist."""
536-
return (
537-
self.locals.get(c.SQLMESH_VARS) or self.locals.get(c.SQLMESH_VARS_METADATA) or {}
538-
).get(var_name.lower(), default)
536+
return {
537+
**(self.locals.get(c.SQLMESH_VARS) or {}),
538+
**(self.locals.get(c.SQLMESH_VARS_METADATA) or {}),
539+
}.get(var_name.lower(), default)
539540

540541
def blueprint_var(self, var_name: str, default: t.Optional[t.Any] = None) -> t.Optional[t.Any]:
541542
"""Returns the value of the specified blueprint variable, or the default value if it doesn't exist."""
542-
return (
543-
self.locals.get(c.SQLMESH_BLUEPRINT_VARS)
544-
or self.locals.get(c.SQLMESH_BLUEPRINT_VARS_METADATA)
545-
or {}
546-
).get(var_name.lower(), default)
543+
return {
544+
**(self.locals.get(c.SQLMESH_BLUEPRINT_VARS) or {}),
545+
**(self.locals.get(c.SQLMESH_BLUEPRINT_VARS_METADATA) or {}),
546+
}.get(var_name.lower(), default)
547547

548548
@property
549549
def variables(self) -> t.Dict[str, t.Any]:

sqlmesh/core/model/common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ def _add_variables_to_python_env(
241241
)
242242
if metadata_blueprint_variables:
243243
python_env[c.SQLMESH_BLUEPRINT_VARS_METADATA] = Executable.value(
244-
blueprint_variables, sort_root_dict=True, is_metadata=True
244+
metadata_blueprint_variables, sort_root_dict=True, is_metadata=True
245245
)
246246

247247
return python_env

tests/core/test_model.py

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10017,11 +10017,14 @@ def test_vars_are_taken_into_account_when_propagating_metadata_status(tmp_path:
1001710017
test_model = tmp_path / "models/test_model.sql"
1001810018
test_model.parent.mkdir(parents=True, exist_ok=True)
1001910019
test_model.write_text(
10020-
"MODEL (name test_model, kind FULL);"
10020+
"MODEL (name test_model, kind FULL, blueprints ((v4 := 4, v5 := 5)));"
1002110021
"@m1_with_var();" # metadata macro, references v1 internally => v1 metadata
1002210022
"@m2_without_var(@v2, @v3);" # metadata macro => v2 metadata, v3 metadata
10023-
"@m3_without_var(@v3);" # non-metadata macro => v3 is not metadata, ^ changes
10024-
"SELECT 1 AS c"
10023+
"@m3_without_var(@v3);" # non-metadata macro, references v4 => v3, v4 are not metadata
10024+
"SELECT 1 AS c;"
10025+
"ON_VIRTUAL_UPDATE_BEGIN;"
10026+
"@m3_without_var(@v5);" # non-metadata macro, metadata context => v5 metadata
10027+
"ON_VIRTUAL_UPDATE_END;"
1002510028
)
1002610029

1002710030
macro_code = """
@@ -10038,6 +10041,7 @@ def m2_without_var(evaluator, *args):
1003810041
1003910042
@macro()
1004010043
def m3_without_var(evaluator, *args):
10044+
evaluator.var("v4")
1004110045
return None"""
1004210046

1004310047
test_macros = tmp_path / "macros/test_macros.py"
@@ -10052,11 +10056,10 @@ def m3_without_var(evaluator, *args):
1005210056
paths=tmp_path,
1005310057
)
1005410058
model = ctx.get_model("test_model")
10055-
empty_executable = Executable(payload="")
1005610059

1005710060
python_env = model.python_env
1005810061

10059-
assert len(python_env) == 5
10062+
assert len(python_env) == 7
1006010063
assert "m1_with_var" in python_env
1006110064
assert "m2_without_var" in python_env
1006210065
assert "m3_without_var" in python_env
@@ -10067,6 +10070,40 @@ def m3_without_var(evaluator, *args):
1006710070
assert variables == Executable.value({"v1": 1, "v3": 3})
1006810071
assert metadata_variables == Executable.value({"v2": 2}, is_metadata=True)
1006910072

10073+
blueprint_variables = python_env.get(c.SQLMESH_BLUEPRINT_VARS)
10074+
blueprint_metadata_variables = python_env.get(c.SQLMESH_BLUEPRINT_VARS_METADATA)
10075+
10076+
assert blueprint_variables == Executable.value({"v4": SqlValue(sql="4")})
10077+
assert blueprint_metadata_variables == Executable.value(
10078+
{"v5": SqlValue(sql="5")}, is_metadata=True
10079+
)
10080+
10081+
macro_evaluator = MacroEvaluator(python_env=python_env)
10082+
10083+
assert macro_evaluator.locals == {
10084+
"runtime_stage": "loading",
10085+
"default_catalog": None,
10086+
c.SQLMESH_VARS: {"v1": 1, "v3": 3},
10087+
c.SQLMESH_VARS_METADATA: {"v2": 2},
10088+
c.SQLMESH_BLUEPRINT_VARS: {"v4": exp.Literal.number("4")},
10089+
c.SQLMESH_BLUEPRINT_VARS_METADATA: {"v5": exp.Literal.number("5")},
10090+
}
10091+
assert macro_evaluator.var("v1") == 1
10092+
assert macro_evaluator.var("v2") == 2
10093+
assert macro_evaluator.var("v3") == 3
10094+
assert macro_evaluator.blueprint_var("v4") == exp.Literal.number("4")
10095+
assert macro_evaluator.blueprint_var("v5") == exp.Literal.number("5")
10096+
10097+
query_with_vars = macro_evaluator.transform(
10098+
parse_one("SELECT " + ", ".join(f"@v{var}, @VAR('v{var}')" for var in [1, 2, 3]))
10099+
)
10100+
assert t.cast(exp.Expression, query_with_vars).sql() == "SELECT 1, 1, 2, 2, 3, 3"
10101+
10102+
query_with_blueprint_vars = macro_evaluator.transform(
10103+
parse_one("SELECT " + ", ".join(f"@v{var}, @BLUEPRINT_VAR('v{var}')" for var in [4, 5]))
10104+
)
10105+
assert t.cast(exp.Expression, query_with_blueprint_vars).sql() == "SELECT 4, 4, 5, 5"
10106+
1007010107

1007110108
def test_non_metadata_object_takes_precedence_over_metadata_only_object(tmp_path: Path) -> None:
1007210109
init_example_project(tmp_path, engine_type="duckdb", template=ProjectTemplate.EMPTY)

0 commit comments

Comments
 (0)