@@ -10053,11 +10053,14 @@ def test_vars_are_taken_into_account_when_propagating_metadata_status(tmp_path:
1005310053 test_model = tmp_path / "models/test_model.sql"
1005410054 test_model .parent .mkdir (parents = True , exist_ok = True )
1005510055 test_model .write_text (
10056- "MODEL (name test_model, kind FULL);"
10056+ "MODEL (name test_model, kind FULL, blueprints ((v4 := 4, v5 := 5)) );"
1005710057 "@m1_with_var();" # metadata macro, references v1 internally => v1 metadata
1005810058 "@m2_without_var(@v2, @v3);" # metadata macro => v2 metadata, v3 metadata
10059- "@m3_without_var(@v3);" # non-metadata macro => v3 is not metadata, ^ changes
10060- "SELECT 1 AS c"
10059+ "@m3_without_var(@v3);" # non-metadata macro, references v4 => v3, v4 are not metadata
10060+ "SELECT 1 AS c;"
10061+ "ON_VIRTUAL_UPDATE_BEGIN;"
10062+ "@m3_without_var(@v5);" # non-metadata macro, metadata context => v5 metadata
10063+ "ON_VIRTUAL_UPDATE_END;"
1006110064 )
1006210065
1006310066 macro_code = """
@@ -10074,6 +10077,7 @@ def m2_without_var(evaluator, *args):
1007410077
1007510078@macro()
1007610079def m3_without_var(evaluator, *args):
10080+ evaluator.var("v4")
1007710081 return None"""
1007810082
1007910083 test_macros = tmp_path / "macros/test_macros.py"
@@ -10088,11 +10092,10 @@ def m3_without_var(evaluator, *args):
1008810092 paths = tmp_path ,
1008910093 )
1009010094 model = ctx .get_model ("test_model" )
10091- empty_executable = Executable (payload = "" )
1009210095
1009310096 python_env = model .python_env
1009410097
10095- assert len (python_env ) == 5
10098+ assert len (python_env ) == 7
1009610099 assert "m1_with_var" in python_env
1009710100 assert "m2_without_var" in python_env
1009810101 assert "m3_without_var" in python_env
@@ -10103,6 +10106,40 @@ def m3_without_var(evaluator, *args):
1010310106 assert variables == Executable .value ({"v1" : 1 , "v3" : 3 })
1010410107 assert metadata_variables == Executable .value ({"v2" : 2 }, is_metadata = True )
1010510108
10109+ blueprint_variables = python_env .get (c .SQLMESH_BLUEPRINT_VARS )
10110+ blueprint_metadata_variables = python_env .get (c .SQLMESH_BLUEPRINT_VARS_METADATA )
10111+
10112+ assert blueprint_variables == Executable .value ({"v4" : SqlValue (sql = "4" )})
10113+ assert blueprint_metadata_variables == Executable .value (
10114+ {"v5" : SqlValue (sql = "5" )}, is_metadata = True
10115+ )
10116+
10117+ macro_evaluator = MacroEvaluator (python_env = python_env )
10118+
10119+ assert macro_evaluator .locals == {
10120+ "runtime_stage" : "loading" ,
10121+ "default_catalog" : None ,
10122+ c .SQLMESH_VARS : {"v1" : 1 , "v3" : 3 },
10123+ c .SQLMESH_VARS_METADATA : {"v2" : 2 },
10124+ c .SQLMESH_BLUEPRINT_VARS : {"v4" : exp .Literal .number ("4" )},
10125+ c .SQLMESH_BLUEPRINT_VARS_METADATA : {"v5" : exp .Literal .number ("5" )},
10126+ }
10127+ assert macro_evaluator .var ("v1" ) == 1
10128+ assert macro_evaluator .var ("v2" ) == 2
10129+ assert macro_evaluator .var ("v3" ) == 3
10130+ assert macro_evaluator .blueprint_var ("v4" ) == exp .Literal .number ("4" )
10131+ assert macro_evaluator .blueprint_var ("v5" ) == exp .Literal .number ("5" )
10132+
10133+ query_with_vars = macro_evaluator .transform (
10134+ parse_one ("SELECT " + ", " .join (f"@v{ var } , @VAR('v{ var } ')" for var in [1 , 2 , 3 ]))
10135+ )
10136+ assert t .cast (exp .Expression , query_with_vars ).sql () == "SELECT 1, 1, 2, 2, 3, 3"
10137+
10138+ query_with_blueprint_vars = macro_evaluator .transform (
10139+ parse_one ("SELECT " + ", " .join (f"@v{ var } , @BLUEPRINT_VAR('v{ var } ')" for var in [4 , 5 ]))
10140+ )
10141+ assert t .cast (exp .Expression , query_with_blueprint_vars ).sql () == "SELECT 4, 4, 5, 5"
10142+
1010610143
1010710144def test_non_metadata_object_takes_precedence_over_metadata_only_object (tmp_path : Path ) -> None :
1010810145 init_example_project (tmp_path , engine_type = "duckdb" , template = ProjectTemplate .EMPTY )
0 commit comments