Skip to content

Commit c5e4b17

Browse files
treyspgeorgesittas
andauthored
Fix: load dbt model containing only a comment and non-sql jinja (#5368)
Co-authored-by: Jo <[email protected]>
1 parent 341cc3c commit c5e4b17

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

sqlmesh/core/renderer.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from functools import partial
77
from pathlib import Path
88

9-
from sqlglot import exp, parse
9+
from sqlglot import exp, Dialect
1010
from sqlglot.errors import SqlglotError
1111
from sqlglot.helper import ensure_list
1212
from sqlglot.optimizer.annotate_types import annotate_types
@@ -249,15 +249,24 @@ def _resolve_table(table: str | exp.Table) -> str:
249249
) from ex
250250

251251
if rendered_expression.strip():
252-
try:
253-
expressions = [e for e in parse(rendered_expression, read=self._dialect) if e]
254-
255-
if not expressions:
256-
raise ConfigError(f"Failed to parse an expression:\n{self._expression}")
257-
except Exception as ex:
258-
raise ConfigError(
259-
f"Could not parse the rendered jinja at '{self._path}'.\n{ex}"
260-
) from ex
252+
# ensure there is actual SQL and not just comments and non-SQL jinja
253+
dialect = Dialect.get_or_raise(self._dialect)
254+
tokens = dialect.tokenize(rendered_expression)
255+
256+
if tokens:
257+
try:
258+
expressions = [
259+
e for e in dialect.parser().parse(tokens, rendered_expression) if e
260+
]
261+
262+
if not expressions:
263+
raise ConfigError(
264+
f"Failed to parse an expression:\n{rendered_expression}"
265+
)
266+
except Exception as ex:
267+
raise ConfigError(
268+
f"Could not parse the rendered jinja at '{self._path}'.\n{ex}"
269+
) from ex
261270

262271
if this_model:
263272
render_kwargs["this_model"] = this_model

tests/dbt/test_model.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,3 +873,24 @@ def test_load_model_dbt_node_name(tmp_path: Path) -> None:
873873
# Verify that node_name is the equivalent dbt one
874874
model = context.snapshots[model_fqn].model
875875
assert model.dbt_name == "model.test_project.simple_model"
876+
877+
878+
@pytest.mark.slow
879+
def test_jinja_config_no_query(tmp_path, create_empty_project):
880+
project_dir, model_dir = create_empty_project()
881+
882+
# model definition contains only a comment and non-SQL jinja
883+
model_contents = "/* comment */ {{ config(materialized='table') }}"
884+
model_file = model_dir / "comment_config_model.sql"
885+
with open(model_file, "w", encoding="utf-8") as f:
886+
f.write(model_contents)
887+
888+
schema_yaml = {"version": 2, "models": [{"name": "comment_config_model"}]}
889+
schema_file = model_dir / "schema.yml"
890+
with open(schema_file, "w", encoding="utf-8") as f:
891+
YAML().dump(schema_yaml, f)
892+
893+
context = Context(paths=project_dir)
894+
895+
# loads without error and contains empty query (which will error at runtime)
896+
assert not context.snapshots['"local"."main"."comment_config_model"'].model.render_query()

0 commit comments

Comments
 (0)