@@ -48,51 +48,64 @@ def make_python_env(
4848
4949 expressions = ensure_list (expressions )
5050 for expression in expressions :
51- if not isinstance (expression , d .Jinja ):
52- for macro_func_or_var in expression .find_all (d .MacroFunc , d .MacroVar , exp .Identifier ):
53- if macro_func_or_var .__class__ is d .MacroFunc :
54- name = macro_func_or_var .this .name .lower ()
55- if name in macros :
56- used_macro = macros [name ]
57- if callable (used_macro ) and expression .meta .get ("metadata_only" ):
58- setattr (used_macro .func , c .SQLMESH_METADATA , True )
59-
60- used_macros [name ] = used_macro
61- if name == c .VAR :
62- args = macro_func_or_var .this .expressions
63- if len (args ) < 1 :
64- raise_config_error ("Macro VAR requires at least one argument" , path )
65- if not args [0 ].is_string :
66- raise_config_error (
67- f"The variable name must be a string literal, '{ args [0 ].sql ()} ' was given instead" ,
68- path ,
69- )
70- used_variables .add (args [0 ].this .lower ())
71- elif macro_func_or_var .__class__ is d .MacroVar :
72- name = macro_func_or_var .name .lower ()
73- if name in macros :
74- used_macros [name ] = macros [name ]
75- elif name in variables :
76- used_variables .add (name )
77- elif (
78- isinstance (macro_func_or_var , (exp .Identifier , d .MacroStrReplace , d .MacroSQL ))
79- ) and "@" in macro_func_or_var .name :
80- for _ , identifier , braced_identifier , _ in MacroStrTemplate .pattern .findall (
81- macro_func_or_var .name
82- ):
83- var_name = braced_identifier or identifier
84- if var_name in variables :
85- used_variables .add (var_name )
51+ if isinstance (expression , d .Jinja ):
52+ continue
53+
54+ for macro_func_or_var in expression .find_all (d .MacroFunc , d .MacroVar , exp .Identifier ):
55+ if macro_func_or_var .__class__ is d .MacroFunc :
56+ name = macro_func_or_var .this .name .lower ()
57+ if name not in macros :
58+ continue
59+
60+ # If this macro has been seen before as a non-metadata macro, prioritize that
61+ used_macros [name ] = (
62+ macros [name ],
63+ (used_macros .get (name ) or (None , expression .meta .get ("is_metadata" )))[1 ],
64+ )
65+ if name == c .VAR :
66+ args = macro_func_or_var .this .expressions
67+ if len (args ) < 1 :
68+ raise_config_error ("Macro VAR requires at least one argument" , path )
69+ if not args [0 ].is_string :
70+ raise_config_error (
71+ f"The variable name must be a string literal, '{ args [0 ].sql ()} ' was given instead" ,
72+ path ,
73+ )
74+ used_variables .add (args [0 ].this .lower ())
75+ elif macro_func_or_var .__class__ is d .MacroVar :
76+ name = macro_func_or_var .name .lower ()
77+ if name in macros :
78+ # If this macro has been seen before as a non-metadata macro, prioritize that
79+ used_macros [name ] = (
80+ macros [name ],
81+ (used_macros .get (name ) or (None , expression .meta .get ("is_metadata" )))[1 ],
82+ )
83+ elif name in variables :
84+ used_variables .add (name )
85+ elif (
86+ isinstance (macro_func_or_var , (exp .Identifier , d .MacroStrReplace , d .MacroSQL ))
87+ ) and "@" in macro_func_or_var .name :
88+ for _ , identifier , braced_identifier , _ in MacroStrTemplate .pattern .findall (
89+ macro_func_or_var .name
90+ ):
91+ var_name = braced_identifier or identifier
92+ if var_name in variables :
93+ used_variables .add (var_name )
8694
8795 for macro_ref in jinja_macro_references or set ():
8896 if macro_ref .package is None and macro_ref .name in macros :
89- used_macros [macro_ref .name ] = macros [macro_ref .name ]
97+ used_macros [macro_ref .name ] = ( macros [macro_ref .name ], None )
9098
91- for name , used_macro in used_macros .items ():
99+ for name , ( used_macro , is_metadata ) in used_macros .items ():
92100 if isinstance (used_macro , Executable ):
93101 python_env [name ] = used_macro
94102 elif not hasattr (used_macro , c .SQLMESH_BUILTIN ) and name not in python_env :
103+ used_macro_func = used_macro .func
104+ previous_is_metadata = getattr (used_macro_func , c .SQLMESH_METADATA , None )
105+
106+ setattr (used_macro_func , c .SQLMESH_METADATA , is_metadata )
95107 build_env (used_macro .func , env = env , name = name , path = module_path )
108+ setattr (used_macro_func , c .SQLMESH_METADATA , previous_is_metadata )
96109
97110 python_env .update (serialize_env (env , path = module_path ))
98111 return _add_variables_to_python_env (
0 commit comments