Skip to content

Commit a7c43fe

Browse files
Fix: Support on-virtual-update statements in sqlmesh format (#3998)
1 parent ddaa030 commit a7c43fe

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

sqlmesh/core/dialect.py

+11
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,16 @@ def _props_sql(self: Generator, expressions: t.List[exp.Expression]) -> str:
644644
return "\n".join(props)
645645

646646

647+
def _on_virtual_update_sql(self: Generator, expressions: t.List[exp.Expression]) -> str:
648+
statements = "\n".join(
649+
self.sql(expression)
650+
if isinstance(expression, JinjaStatement)
651+
else f"{self.sql(expression)};"
652+
for expression in expressions
653+
)
654+
return f"{ON_VIRTUAL_UPDATE_BEGIN};\n{statements}\n{ON_VIRTUAL_UPDATE_END};"
655+
656+
647657
def _sqlmesh_ddl_sql(self: Generator, expression: Model | Audit | Metric, name: str) -> str:
648658
return "\n".join([f"{name} (", _props_sql(self, expression.expressions), ")"])
649659

@@ -1004,6 +1014,7 @@ def extend_sqlglot() -> None:
10041014
JinjaQuery: lambda self, e: f"{JINJA_QUERY_BEGIN};\n{e.name}\n{JINJA_END};",
10051015
JinjaStatement: lambda self,
10061016
e: f"{JINJA_STATEMENT_BEGIN};\n{e.name}\n{JINJA_END};",
1017+
VirtualUpdateStatement: lambda self, e: _on_virtual_update_sql(self, e),
10071018
MacroDef: lambda self, e: f"@DEF({self.sql(e.this)}, {self.sql(e.expression)})",
10081019
MacroFunc: _macro_func_sql,
10091020
MacroStrReplace: lambda self, e: f"@{self.sql(e.this)}",

tests/core/test_dialect.py

+37
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,43 @@ def test_format_model_expressions():
220220
CAST(1 AS INT) AS bla"""
221221
)
222222

223+
x = format_model_expressions(
224+
parse(
225+
"""MODEL(name foo);
226+
SELECT CAST(1 AS INT) AS bla;
227+
on_virtual_update_begin;
228+
CREATE OR REPLACE VIEW test_view FROM demo_db.table;GRANT SELECT ON VIEW @this_model TO ROLE owner_name;
229+
JINJA_STATEMENT_BEGIN; GRANT SELECT ON VIEW {{this_model}} TO ROLE admin; JINJA_END;
230+
GRANT REFERENCES, SELECT ON FUTURE VIEWS IN DATABASE demo_db TO ROLE owner_name;
231+
@resolve_parent_name('parent');GRANT SELECT ON VIEW demo_db.table /* sqlglot.meta replace=false */ TO ROLE admin;
232+
ON_VIRTUAL_update_end;"""
233+
)
234+
)
235+
236+
assert (
237+
x
238+
== """MODEL (
239+
name foo
240+
);
241+
242+
SELECT
243+
1::INT AS bla;
244+
245+
ON_VIRTUAL_UPDATE_BEGIN;
246+
CREATE OR REPLACE VIEW test_view AS
247+
SELECT
248+
*
249+
FROM demo_db.table;
250+
GRANT SELECT ON VIEW @this_model TO ROLE owner_name;
251+
JINJA_STATEMENT_BEGIN;
252+
GRANT SELECT ON VIEW {{this_model}} TO ROLE admin;
253+
JINJA_END;
254+
GRANT REFERENCES, SELECT ON FUTURE VIEWS IN DATABASE demo_db TO ROLE owner_name;
255+
@resolve_parent_name('parent');
256+
GRANT SELECT ON VIEW demo_db.table /* sqlglot.meta replace=false */ TO ROLE admin;
257+
ON_VIRTUAL_UPDATE_END;"""
258+
)
259+
223260

224261
def test_macro_format():
225262
assert parse_one("@EACH(ARRAY(1,2), x -> x)").sql() == "@EACH(ARRAY(1, 2), x -> x)"

0 commit comments

Comments
 (0)