Skip to content

Commit 89d459f

Browse files
committed
Fix bugs
1 parent 4fa0d07 commit 89d459f

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
@@ -562,17 +562,17 @@ def views(self) -> t.List[str]:
562562

563563
def var(self, var_name: str, default: t.Optional[t.Any] = None) -> t.Optional[t.Any]:
564564
"""Returns the value of the specified variable, or the default value if it doesn't exist."""
565-
return (
566-
self.locals.get(c.SQLMESH_VARS) or self.locals.get(c.SQLMESH_VARS_METADATA) or {}
567-
).get(var_name.lower(), default)
565+
return {
566+
**(self.locals.get(c.SQLMESH_VARS) or {}),
567+
**(self.locals.get(c.SQLMESH_VARS_METADATA) or {}),
568+
}.get(var_name.lower(), default)
568569

569570
def blueprint_var(self, var_name: str, default: t.Optional[t.Any] = None) -> t.Optional[t.Any]:
570571
"""Returns the value of the specified blueprint variable, or the default value if it doesn't exist."""
571-
return (
572-
self.locals.get(c.SQLMESH_BLUEPRINT_VARS)
573-
or self.locals.get(c.SQLMESH_BLUEPRINT_VARS_METADATA)
574-
or {}
575-
).get(var_name.lower(), default)
572+
return {
573+
**(self.locals.get(c.SQLMESH_BLUEPRINT_VARS) or {}),
574+
**(self.locals.get(c.SQLMESH_BLUEPRINT_VARS_METADATA) or {}),
575+
}.get(var_name.lower(), default)
576576

577577
@property
578578
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
@@ -10049,11 +10049,14 @@ def test_vars_are_taken_into_account_when_propagating_metadata_status(tmp_path:
1004910049
test_model = tmp_path / "models/test_model.sql"
1005010050
test_model.parent.mkdir(parents=True, exist_ok=True)
1005110051
test_model.write_text(
10052-
"MODEL (name test_model, kind FULL);"
10052+
"MODEL (name test_model, kind FULL, blueprints ((v4 := 4, v5 := 5)));"
1005310053
"@m1_with_var();" # metadata macro, references v1 internally => v1 metadata
1005410054
"@m2_without_var(@v2, @v3);" # metadata macro => v2 metadata, v3 metadata
10055-
"@m3_without_var(@v3);" # non-metadata macro => v3 is not metadata, ^ changes
10056-
"SELECT 1 AS c"
10055+
"@m3_without_var(@v3);" # non-metadata macro, references v4 => v3, v4 are not metadata
10056+
"SELECT 1 AS c;"
10057+
"ON_VIRTUAL_UPDATE_BEGIN;"
10058+
"@m3_without_var(@v5);" # non-metadata macro, metadata context => v5 metadata
10059+
"ON_VIRTUAL_UPDATE_END;"
1005710060
)
1005810061

1005910062
macro_code = """
@@ -10070,6 +10073,7 @@ def m2_without_var(evaluator, *args):
1007010073
1007110074
@macro()
1007210075
def m3_without_var(evaluator, *args):
10076+
evaluator.var("v4")
1007310077
return None"""
1007410078

1007510079
test_macros = tmp_path / "macros/test_macros.py"
@@ -10084,11 +10088,10 @@ def m3_without_var(evaluator, *args):
1008410088
paths=tmp_path,
1008510089
)
1008610090
model = ctx.get_model("test_model")
10087-
empty_executable = Executable(payload="")
1008810091

1008910092
python_env = model.python_env
1009010093

10091-
assert len(python_env) == 5
10094+
assert len(python_env) == 7
1009210095
assert "m1_with_var" in python_env
1009310096
assert "m2_without_var" in python_env
1009410097
assert "m3_without_var" in python_env
@@ -10099,6 +10102,40 @@ def m3_without_var(evaluator, *args):
1009910102
assert variables == Executable.value({"v1": 1, "v3": 3})
1010010103
assert metadata_variables == Executable.value({"v2": 2}, is_metadata=True)
1010110104

10105+
blueprint_variables = python_env.get(c.SQLMESH_BLUEPRINT_VARS)
10106+
blueprint_metadata_variables = python_env.get(c.SQLMESH_BLUEPRINT_VARS_METADATA)
10107+
10108+
assert blueprint_variables == Executable.value({"v4": SqlValue(sql="4")})
10109+
assert blueprint_metadata_variables == Executable.value(
10110+
{"v5": SqlValue(sql="5")}, is_metadata=True
10111+
)
10112+
10113+
macro_evaluator = MacroEvaluator(python_env=python_env)
10114+
10115+
assert macro_evaluator.locals == {
10116+
"runtime_stage": "loading",
10117+
"default_catalog": None,
10118+
c.SQLMESH_VARS: {"v1": 1, "v3": 3},
10119+
c.SQLMESH_VARS_METADATA: {"v2": 2},
10120+
c.SQLMESH_BLUEPRINT_VARS: {"v4": exp.Literal.number("4")},
10121+
c.SQLMESH_BLUEPRINT_VARS_METADATA: {"v5": exp.Literal.number("5")},
10122+
}
10123+
assert macro_evaluator.var("v1") == 1
10124+
assert macro_evaluator.var("v2") == 2
10125+
assert macro_evaluator.var("v3") == 3
10126+
assert macro_evaluator.blueprint_var("v4") == exp.Literal.number("4")
10127+
assert macro_evaluator.blueprint_var("v5") == exp.Literal.number("5")
10128+
10129+
query_with_vars = macro_evaluator.transform(
10130+
parse_one("SELECT " + ", ".join(f"@v{var}, @VAR('v{var}')" for var in [1, 2, 3]))
10131+
)
10132+
assert t.cast(exp.Expression, query_with_vars).sql() == "SELECT 1, 1, 2, 2, 3, 3"
10133+
10134+
query_with_blueprint_vars = macro_evaluator.transform(
10135+
parse_one("SELECT " + ", ".join(f"@v{var}, @BLUEPRINT_VAR('v{var}')" for var in [4, 5]))
10136+
)
10137+
assert t.cast(exp.Expression, query_with_blueprint_vars).sql() == "SELECT 4, 4, 5, 5"
10138+
1010210139

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

0 commit comments

Comments
 (0)