Skip to content

Commit 6bf65cb

Browse files
committed
Additional sanity check, minor fixup
1 parent 6ea8019 commit 6bf65cb

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

sqlmesh/core/model/common.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def _is_metadata_macro(name: str, appears_in_metadata_expression: bool) -> bool:
128128

129129
var_name = args[0].this.lower()
130130
used_variables[var_name] = _is_metadata_var(
131-
name, macro_func_or_var, is_metadata
131+
var_name, macro_func_or_var, is_metadata
132132
)
133133
elif id(macro_func_or_var) not in visited_macro_funcs:
134134
var_refs, _expr_under_metadata_macro_func, _visited_macro_funcs = (
@@ -138,11 +138,16 @@ def _is_metadata_macro(name: str, appears_in_metadata_expression: bool) -> bool:
138138
visited_macro_funcs.update(_visited_macro_funcs)
139139
outermost_macro_func_ancestor_by_var |= {var_ref: name for var_ref in var_refs}
140140
elif macro_func_or_var.__class__ is d.MacroVar:
141-
name = macro_func_or_var.name.lower()
142-
if name in macros:
143-
used_macros[name] = (macros[name], _is_metadata_macro(name, is_metadata))
144-
elif name in variables or name in blueprint_variables:
145-
used_variables[name] = _is_metadata_var(name, macro_func_or_var, is_metadata)
141+
var_name = macro_func_or_var.name.lower()
142+
if var_name in macros:
143+
used_macros[var_name] = (
144+
macros[var_name],
145+
_is_metadata_macro(var_name, is_metadata),
146+
)
147+
elif var_name in variables or var_name in blueprint_variables:
148+
used_variables[var_name] = _is_metadata_var(
149+
var_name, macro_func_or_var, is_metadata
150+
)
146151
elif (
147152
isinstance(macro_func_or_var, (exp.Identifier, d.MacroStrReplace, d.MacroSQL))
148153
) and "@" in macro_func_or_var.name:
@@ -249,6 +254,12 @@ def _add_variables_to_python_env(
249254

250255
non_metadata_used_variables = set(used_variables) - metadata_used_variables
251256

257+
if overlapping_variables := (non_metadata_used_variables & metadata_used_variables):
258+
raise ConfigError(
259+
f"Variables {', '.join(overlapping_variables)} are both metadata and non-metadata, "
260+
"which is unexpected. Please file an issue at https://github.com/TobikoData/sqlmesh/issues/new."
261+
)
262+
252263
metadata_variables = {
253264
k: v for k, v in (variables or {}).items() if k in metadata_used_variables
254265
}

tests/core/test_model.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9385,6 +9385,12 @@ def entrypoint(evaluator):
93859385
python_env = model.python_env
93869386

93879387
assert python_env.get(c.SQLMESH_VARS) == Executable.value({"x": gateway_no})
9388+
9389+
if model_name == "test_model_sql":
9390+
assert c.SQLMESH_BLUEPRINT_VARS not in python_env
9391+
else:
9392+
assert c.SQLMESH_BLUEPRINT_VARS in python_env
9393+
93889394
assert context.fetchdf(f"from {model.fqn}").to_dict() == {"x": {0: gateway_no}}
93899395

93909396
multi_variable_blueprint_example = tmp_path / "models" / "multi_variable_blueprint_example.sql"

0 commit comments

Comments
 (0)