Skip to content

Commit 633e64e

Browse files
authored
fix: robust cluster_by config parsing (#5478)
1 parent 6919e69 commit 633e64e

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

sqlmesh/dbt/model.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,13 @@ def to_sqlmesh(
601601
clustered_by = []
602602
for c in self.cluster_by:
603603
try:
604-
clustered_by.append(d.parse_one(c, dialect=model_dialect))
604+
cluster_expr = exp.maybe_parse(
605+
c, into=exp.Cluster, prefix="CLUSTER BY", dialect=model_dialect
606+
)
607+
for expr in cluster_expr.expressions:
608+
clustered_by.append(
609+
expr.this if isinstance(expr, exp.Ordered) else expr
610+
)
605611
except SqlglotError as e:
606612
raise ConfigError(
607613
f"Failed to parse model '{self.canonical_name(context)}' cluster_by field '{c}' in '{self.path}': {e}"

tests/dbt/test_transformation.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,6 +2306,60 @@ def test_model_cluster_by():
23062306
)
23072307
assert model.to_sqlmesh(context).clustered_by == []
23082308

2309+
model = ModelConfig(
2310+
name="model",
2311+
alias="model",
2312+
package_name="package",
2313+
target_schema="test",
2314+
cluster_by="Bar, qux",
2315+
sql="SELECT * FROM baz",
2316+
materialized=Materialization.TABLE.value,
2317+
)
2318+
assert model.to_sqlmesh(context).clustered_by == [
2319+
exp.to_column('"BAR"'),
2320+
exp.to_column('"QUX"'),
2321+
]
2322+
2323+
model = ModelConfig(
2324+
name="model",
2325+
alias="model",
2326+
package_name="package",
2327+
target_schema="test",
2328+
cluster_by=['"Bar,qux"'],
2329+
sql="SELECT * FROM baz",
2330+
materialized=Materialization.TABLE.value,
2331+
)
2332+
assert model.to_sqlmesh(context).clustered_by == [
2333+
exp.to_column('"Bar,qux"'),
2334+
]
2335+
2336+
model = ModelConfig(
2337+
name="model",
2338+
alias="model",
2339+
package_name="package",
2340+
target_schema="test",
2341+
cluster_by='"Bar,qux"',
2342+
sql="SELECT * FROM baz",
2343+
materialized=Materialization.TABLE.value,
2344+
)
2345+
assert model.to_sqlmesh(context).clustered_by == [
2346+
exp.to_column('"Bar,qux"'),
2347+
]
2348+
2349+
model = ModelConfig(
2350+
name="model",
2351+
alias="model",
2352+
package_name="package",
2353+
target_schema="test",
2354+
cluster_by=["to_date(Bar),qux"],
2355+
sql="SELECT * FROM baz",
2356+
materialized=Materialization.TABLE.value,
2357+
)
2358+
assert model.to_sqlmesh(context).clustered_by == [
2359+
exp.TsOrDsToDate(this=exp.to_column('"BAR"')),
2360+
exp.to_column('"QUX"'),
2361+
]
2362+
23092363

23102364
def test_snowflake_dynamic_table():
23112365
context = DbtContext()

0 commit comments

Comments
 (0)