Skip to content

Commit a3fccd9

Browse files
authored
fix(snowflake): generate SELECT for UNNEST without JOIN or FROM (#5138)
1 parent 305c09b commit a3fccd9

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

sqlglot/dialects/snowflake.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,13 +1224,15 @@ def unnest_sql(self, expression: exp.Unnest) -> str:
12241224
unnest_alias = expression.args.get("alias")
12251225
offset = expression.args.get("offset")
12261226

1227+
value = seq_get(unnest_alias.columns if unnest_alias else [], 0) or exp.to_identifier(
1228+
"value"
1229+
)
12271230
columns = [
12281231
exp.to_identifier("seq"),
12291232
exp.to_identifier("key"),
12301233
exp.to_identifier("path"),
12311234
offset.pop() if isinstance(offset, exp.Expression) else exp.to_identifier("index"),
1232-
seq_get(unnest_alias.columns if unnest_alias else [], 0)
1233-
or exp.to_identifier("value"),
1235+
value,
12341236
exp.to_identifier("this"),
12351237
]
12361238

@@ -1246,7 +1248,10 @@ def unnest_sql(self, expression: exp.Unnest) -> str:
12461248
explode = f"TABLE(FLATTEN({table_input}))"
12471249
alias = self.sql(unnest_alias)
12481250
alias = f" AS {alias}" if alias else ""
1249-
return f"{explode}{alias}"
1251+
value = (
1252+
f"{value} FROM " if not isinstance(expression.parent, (exp.From, exp.Join)) else ""
1253+
)
1254+
return f"{value}{explode}{alias}"
12501255

12511256
def show_sql(self, expression: exp.Show) -> str:
12521257
terse = "TERSE " if expression.args.get("terse") else ""

tests/dialects/test_snowflake.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,15 @@ def test_null_treatment(self):
11021102
"snowflake": r"SELECT FIRST_VALUE(TABLE1.COLUMN1) IGNORE NULLS OVER (PARTITION BY RANDOM_COLUMN1, RANDOM_COLUMN2 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS MY_ALIAS FROM TABLE1"
11031103
},
11041104
)
1105+
self.validate_all(
1106+
"SELECT * FROM foo WHERE 'str' IN (SELECT value FROM TABLE(FLATTEN(INPUT => vals)) AS _u(seq, key, path, index, value, this))",
1107+
read={
1108+
"bigquery": "SELECT * FROM foo WHERE 'str' IN UNNEST(vals)",
1109+
},
1110+
write={
1111+
"snowflake": "SELECT * FROM foo WHERE 'str' IN (SELECT value FROM TABLE(FLATTEN(INPUT => vals)) AS _u(seq, key, path, index, value, this))",
1112+
},
1113+
)
11051114

11061115
def test_staged_files(self):
11071116
# Ensure we don't treat staged file paths as identifiers (i.e. they're not normalized)

0 commit comments

Comments
 (0)