Skip to content

Commit 2ab08af

Browse files
Fix: Add guards in render definition for on virtual update statements (#4293)
1 parent f3dd3d6 commit 2ab08af

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

sqlmesh/core/model/definition.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,12 +1319,14 @@ def render_definition(
13191319
result.extend(self.render_pre_statements())
13201320
result.append(self.render_query() or self.query)
13211321
result.extend(self.render_post_statements())
1322-
result.extend(self.render_on_virtual_update())
1322+
if virtual_update := self.render_on_virtual_update():
1323+
result.append(d.VirtualUpdateStatement(expressions=virtual_update))
13231324
else:
13241325
result.extend(self.pre_statements)
13251326
result.append(self.query)
13261327
result.extend(self.post_statements)
1327-
result.extend(self.on_virtual_update)
1328+
if self.on_virtual_update:
1329+
result.append(d.VirtualUpdateStatement(expressions=self.on_virtual_update))
13281330

13291331
return result
13301332

tests/core/test_context.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,25 +1290,30 @@ def test_rendered_diff():
12901290

12911291
plan = ctx.plan("dev", auto_apply=True, no_prompts=True, diff_rendered=True)
12921292

1293-
assert '''@@ -4,13 +4,13 @@
1294-
1295-
CREATE TABLE IF NOT EXISTS "foo" AS
1296-
(
1297-
SELECT
1298-
- FALSE OR TRUE
1299-
+ TRUE
1300-
)
1301-
SELECT
1302-
- 6 AS "_col_0"
1303-
+ 7 AS "_col_0"
1304-
CREATE TABLE IF NOT EXISTS "foo2" AS
1305-
(
1306-
SELECT
1307-
- TRUE AND FALSE
1308-
+ TRUE
1309-
)
1310-
-DROP VIEW "test"
1311-
+DROP VIEW IF EXISTS "test"''' in plan.context_diff.text_diff('"test"')
1293+
assert plan.context_diff.text_diff('"test"') == (
1294+
"--- \n\n"
1295+
"+++ \n\n"
1296+
"@@ -4,15 +4,15 @@\n\n"
1297+
' CREATE TABLE IF NOT EXISTS "foo" AS\n'
1298+
" (\n"
1299+
" SELECT\n"
1300+
"- FALSE OR TRUE\n"
1301+
"+ TRUE\n"
1302+
" )\n"
1303+
" SELECT\n"
1304+
'- 6 AS "_col_0"\n'
1305+
'+ 7 AS "_col_0"\n'
1306+
' CREATE TABLE IF NOT EXISTS "foo2" AS\n'
1307+
" (\n"
1308+
" SELECT\n"
1309+
"- TRUE AND FALSE\n"
1310+
"+ TRUE\n"
1311+
" )\n"
1312+
" ON_VIRTUAL_UPDATE_BEGIN;\n"
1313+
'-DROP VIEW "test";\n'
1314+
'+DROP VIEW IF EXISTS "test";\n'
1315+
" ON_VIRTUAL_UPDATE_END;"
1316+
)
13121317

13131318

13141319
def test_plan_enable_preview_default(sushi_context: Context, sushi_dbt_context: Context):

tests/core/test_model.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,6 +1642,43 @@ def test_render_definition_partitioned_by():
16421642
)
16431643

16441644

1645+
def test_render_definition_with_virtual_update_statements():
1646+
# model has virtual update statements
1647+
model = load_sql_based_model(
1648+
d.parse(
1649+
f"""
1650+
MODEL (
1651+
name db.table,
1652+
kind FULL
1653+
);
1654+
1655+
select 1 as a;
1656+
1657+
ON_VIRTUAL_UPDATE_BEGIN;
1658+
GRANT SELECT ON VIEW @this_model TO ROLE role_name
1659+
ON_VIRTUAL_UPDATE_END;
1660+
"""
1661+
)
1662+
)
1663+
1664+
assert model.on_virtual_update == [
1665+
exp.Grant(
1666+
privileges=[exp.GrantPrivilege(this=exp.Var(this="SELECT"))],
1667+
kind="VIEW",
1668+
securable=exp.Table(this=d.MacroVar(this="this_model")),
1669+
principals=[
1670+
exp.GrantPrincipal(this=exp.Identifier(this="role_name", quoted=False), kind="ROLE")
1671+
],
1672+
)
1673+
]
1674+
assert (
1675+
model.render_definition()[-1].sql(pretty=True)
1676+
== """ON_VIRTUAL_UPDATE_BEGIN;
1677+
GRANT SELECT ON VIEW @this_model TO ROLE role_name;
1678+
ON_VIRTUAL_UPDATE_END;"""
1679+
)
1680+
1681+
16451682
def test_cron():
16461683
daily = _Node(name="x", cron="@daily")
16471684
assert to_datetime(daily.cron_prev("2020-01-01")) == to_datetime("2019-12-31")

0 commit comments

Comments
 (0)