From c52a50b8d720d641e4b6f122fdafdea0e44a0b5e Mon Sep 17 00:00:00 2001 From: Chris Rericha Date: Tue, 9 Sep 2025 09:36:50 -0400 Subject: [PATCH 1/3] Chore: Separate jinja rendering and parsing try blocks for more precise error output --- sqlmesh/core/renderer.py | 18 +++++++++++------- tests/core/test_model.py | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/sqlmesh/core/renderer.py b/sqlmesh/core/renderer.py index 3502118e14..f810f18845 100644 --- a/sqlmesh/core/renderer.py +++ b/sqlmesh/core/renderer.py @@ -239,17 +239,21 @@ def _resolve_table(table: str | exp.Table) -> str: logger.debug( f"Rendered Jinja expression for model '{self._model_fqn}' at '{self._path}': '{rendered_expression}'" ) - if rendered_expression.strip(): + except ParsetimeAdapterCallError: + raise + except Exception as ex: + raise ConfigError(f"Could not render jinja at '{self._path}'.\n{ex}") from ex + + if rendered_expression.strip(): + try: expressions = [e for e in parse(rendered_expression, read=self._dialect) if e] if not expressions: raise ConfigError(f"Failed to parse an expression:\n{self._expression}") - except ParsetimeAdapterCallError: - raise - except Exception as ex: - raise ConfigError( - f"Could not render or parse jinja at '{self._path}'.\n{ex}" - ) from ex + except ParsetimeAdapterCallError: + raise + except Exception as ex: + raise ConfigError(f"Could not parse jinja at '{self._path}'.\n{ex}") from ex if this_model: render_kwargs["this_model"] = this_model diff --git a/tests/core/test_model.py b/tests/core/test_model.py index a3159c8f0a..5ee7f5e152 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -8588,6 +8588,23 @@ def test_comments_in_jinja_query(): model.render_query() +def test_jinja_render_parse_error(): + expressions = d.parse( + """ + MODEL (name db.test_model); + + JINJA_QUERY_BEGIN; + {{ unknown_macro() }} + JINJA_END; + """ + ) + + model = load_sql_based_model(expressions) + + with pytest.raises(ConfigError, match=r"Could not render jinja"): + model.render_query() + + def test_jinja_render_debug_logging(caplog): """Test that rendered Jinja expressions are logged for debugging.""" import logging @@ -8609,7 +8626,7 @@ def test_jinja_render_debug_logging(caplog): model = load_sql_based_model(expressions) # Attempt to render - this should fail due to invalid SQL syntax - with pytest.raises(ConfigError, match=r"Could not render or parse jinja"): + with pytest.raises(ConfigError, match=r"Could not parse jinja"): model.render_query() # Check that the rendered Jinja was logged From ab05c738b59a6faea9f62b33265cc6f1d2098fd9 Mon Sep 17 00:00:00 2001 From: Chris Rericha Date: Tue, 9 Sep 2025 09:39:35 -0400 Subject: [PATCH 2/3] Remove ParseTimeADapterCallError exception from sqlglot parsing try block --- sqlmesh/core/renderer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sqlmesh/core/renderer.py b/sqlmesh/core/renderer.py index f810f18845..d867d1492c 100644 --- a/sqlmesh/core/renderer.py +++ b/sqlmesh/core/renderer.py @@ -250,8 +250,6 @@ def _resolve_table(table: str | exp.Table) -> str: if not expressions: raise ConfigError(f"Failed to parse an expression:\n{self._expression}") - except ParsetimeAdapterCallError: - raise except Exception as ex: raise ConfigError(f"Could not parse jinja at '{self._path}'.\n{ex}") from ex From 3e6641426351234ff1123ed6ea9118e1e6370608 Mon Sep 17 00:00:00 2001 From: Chris Rericha Date: Tue, 9 Sep 2025 10:58:18 -0400 Subject: [PATCH 3/3] Improve parse error message --- sqlmesh/core/renderer.py | 4 +++- tests/core/test_model.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sqlmesh/core/renderer.py b/sqlmesh/core/renderer.py index d867d1492c..34fa5095e4 100644 --- a/sqlmesh/core/renderer.py +++ b/sqlmesh/core/renderer.py @@ -251,7 +251,9 @@ def _resolve_table(table: str | exp.Table) -> str: if not expressions: raise ConfigError(f"Failed to parse an expression:\n{self._expression}") except Exception as ex: - raise ConfigError(f"Could not parse jinja at '{self._path}'.\n{ex}") from ex + raise ConfigError( + f"Could not parse the rendered jinja at '{self._path}'.\n{ex}" + ) from ex if this_model: render_kwargs["this_model"] = this_model diff --git a/tests/core/test_model.py b/tests/core/test_model.py index 5ee7f5e152..a252418a79 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -8626,7 +8626,7 @@ def test_jinja_render_debug_logging(caplog): model = load_sql_based_model(expressions) # Attempt to render - this should fail due to invalid SQL syntax - with pytest.raises(ConfigError, match=r"Could not parse jinja"): + with pytest.raises(ConfigError, match=r"Could not parse the rendered jinja"): model.render_query() # Check that the rendered Jinja was logged