Skip to content

Commit 3d315be

Browse files
authored
Fix!: render {% raw %}...{% endraw %} correctly (#5237)
1 parent 254e9e1 commit 3d315be

File tree

4 files changed

+25
-23
lines changed

4 files changed

+25
-23
lines changed

examples/sushi/models/customer_revenue_by_day.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ WITH order_total AS (
2121
LEFT JOIN sushi.items AS i
2222
ON oi.item_id = i.id AND oi.event_date = i.event_date
2323
WHERE
24-
oi.event_date BETWEEN CAST('{{ start_ds }}' as DATE) AND CAST('{{ end_ds }}' as DATE)
24+
oi.event_date BETWEEN @start_date AND @end_date
2525
GROUP BY
2626
oi.order_id,
2727
oi.event_date
@@ -35,7 +35,7 @@ FROM sushi.orders AS o
3535
LEFT JOIN order_total AS ot
3636
ON o.id = ot.order_id AND o.event_date = ot.event_date
3737
WHERE
38-
o.event_date BETWEEN CAST('{{ start_ds }}' as DATE) AND CAST('{{ end_ds }}' as DATE)
38+
o.event_date BETWEEN @start_date AND @end_date
3939
GROUP BY
4040
o.customer_id,
4141
o.event_date

examples/sushi/models/waiter_as_customer_by_day.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ SELECT
2727
FROM sushi.waiters AS w
2828
JOIN sushi.customers as c ON w.waiter_id = c.customer_id
2929
JOIN sushi.waiter_names as wn ON w.waiter_id = wn.id
30-
WHERE w.event_date BETWEEN @start_date AND @end_date;
30+
WHERE w.event_date BETWEEN CAST('{{ start_ds }}' as DATE) AND @end_date;
3131

3232
JINJA_END;

sqlmesh/core/macros.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from datetime import datetime, date
1313

1414
import sqlglot
15-
from jinja2 import Environment
1615
from sqlglot import Generator, exp, parse_one
1716
from sqlglot.executor.env import ENV
1817
from sqlglot.executor.python import Python
@@ -40,7 +39,6 @@
4039
)
4140
from sqlmesh.utils.date import DatetimeRanges, to_datetime, to_date
4241
from sqlmesh.utils.errors import MacroEvalError, SQLMeshError
43-
from sqlmesh.utils.jinja import JinjaMacroRegistry, has_jinja
4442
from sqlmesh.utils.metaprogramming import (
4543
Executable,
4644
SqlValue,
@@ -193,7 +191,6 @@ def __init__(
193191
self.columns_to_types_called = False
194192
self.default_catalog = default_catalog
195193

196-
self._jinja_env: t.Optional[Environment] = None
197194
self._schema = schema
198195
self._resolve_table = resolve_table
199196
self._resolve_tables = resolve_tables
@@ -282,12 +279,6 @@ def evaluate_macros(
282279
if node.this != text:
283280
changed = True
284281
return exp.to_identifier(text, quoted=node.quoted or None)
285-
if node.is_string:
286-
text = node.this
287-
if has_jinja(text):
288-
changed = True
289-
node.set("this", self.jinja_env.from_string(node.this).render())
290-
return node
291282
if isinstance(node, MacroFunc):
292283
changed = True
293284
return self.evaluate(node)
@@ -436,14 +427,6 @@ def parse_one(
436427
"""
437428
return sqlglot.maybe_parse(sql, dialect=self.dialect, into=into, **opts)
438429

439-
@property
440-
def jinja_env(self) -> Environment:
441-
if not self._jinja_env:
442-
jinja_env_methods = {**self.locals, **self.env}
443-
del jinja_env_methods["self"]
444-
self._jinja_env = JinjaMacroRegistry().build_environment(**jinja_env_methods)
445-
return self._jinja_env
446-
447430
def columns_to_types(self, model_name: TableName | exp.Column) -> t.Dict[str, exp.DataType]:
448431
"""Returns the columns-to-types mapping corresponding to the specified model."""
449432

tests/core/test_model.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,11 +2566,15 @@ def test_parse(assert_exp_eq):
25662566
dialect '',
25672567
);
25682568
2569+
JINJA_QUERY_BEGIN;
2570+
25692571
SELECT
25702572
id::INT AS id,
25712573
ds
25722574
FROM x
2573-
WHERE ds BETWEEN '{{ start_ds }}' AND @end_ds
2575+
WHERE ds BETWEEN '{{ start_ds }}' AND @end_ds;
2576+
2577+
JINJA_END;
25742578
"""
25752579
)
25762580
model = load_sql_based_model(expressions, dialect="hive")
@@ -2580,8 +2584,8 @@ def test_parse(assert_exp_eq):
25802584
}
25812585
assert not model.annotated
25822586
assert model.dialect == ""
2583-
assert isinstance(model.query, exp.Select)
2584-
assert isinstance(SqlModel.parse_raw(model.json()).query, exp.Select)
2587+
assert isinstance(model.query, d.JinjaQuery)
2588+
assert isinstance(SqlModel.parse_raw(model.json()).query, d.JinjaQuery)
25852589
assert_exp_eq(
25862590
model.render_query(),
25872591
"""
@@ -11543,3 +11547,18 @@ def test_text_diff_optimize_query():
1154311547
diff = model1.text_diff(model2)
1154411548
assert diff, "Expected diff to show optimize_query change"
1154511549
assert "+ optimize_query" in diff.lower()
11550+
11551+
11552+
def test_raw_jinja_raw_tag():
11553+
expressions = d.parse(
11554+
"""
11555+
MODEL (name test);
11556+
11557+
JINJA_QUERY_BEGIN;
11558+
SELECT {% raw %} '{{ foo }}' {% endraw %} AS col;
11559+
JINJA_END;
11560+
"""
11561+
)
11562+
11563+
model = load_sql_based_model(expressions)
11564+
assert model.render_query().sql() == "SELECT '{{ foo }}' AS \"col\""

0 commit comments

Comments
 (0)