Fix: unnest complex closes #2284 · tobymao/sqlglot@06e0869 (original) (raw)
`@@ -188,22 +188,27 @@ def new_name(names: t.Set[str], name: str) -> str:
`
188
188
` )
`
189
189
``
190
190
`# we use list here because expression.selects is mutated inside the loop
`
191
``
`-
for select in list(expression.selects):
`
192
``
`-
to_replace = select
`
193
``
`-
pos_alias = ""
`
194
``
`-
explode_alias = ""
`
195
``
-
196
``
`-
if isinstance(select, exp.Alias):
`
197
``
`-
explode_alias = select.alias
`
198
``
`-
select = select.this
`
199
``
`-
elif isinstance(select, exp.Aliases):
`
200
``
`-
pos_alias = select.aliases[0].name
`
201
``
`-
explode_alias = select.aliases[1].name
`
202
``
`-
select = select.this
`
203
``
-
204
``
`-
if isinstance(select, (exp.Explode, exp.Posexplode)):
`
205
``
`-
is_posexplode = isinstance(select, exp.Posexplode)
`
206
``
`-
explode_arg = select.this
`
``
191
`+
for select in expression.selects.copy():
`
``
192
`+
explode = select.find(exp.Explode, exp.Posexplode)
`
``
193
+
``
194
`+
if isinstance(explode, (exp.Explode, exp.Posexplode)):
`
``
195
`+
pos_alias = ""
`
``
196
`+
explode_alias = ""
`
``
197
+
``
198
`+
if isinstance(select, exp.Alias):
`
``
199
`+
explode_alias = select.alias
`
``
200
`+
alias = select
`
``
201
`+
elif isinstance(select, exp.Aliases):
`
``
202
`+
pos_alias = select.aliases[0].name
`
``
203
`+
explode_alias = select.aliases[1].name
`
``
204
`+
alias = select.replace(exp.alias_(select.this, "", copy=False))
`
``
205
`+
else:
`
``
206
`+
alias = select.replace(exp.alias_(select, ""))
`
``
207
`+
explode = alias.find(exp.Explode, exp.Posexplode)
`
``
208
`+
assert explode
`
``
209
+
``
210
`+
is_posexplode = isinstance(explode, exp.Posexplode)
`
``
211
`+
explode_arg = explode.this
`
207
212
``
208
213
`# This ensures that we won't use [POS]EXPLODE's argument as a new selection
`
209
214
`if isinstance(explode_arg, exp.Column):
`
`@@ -220,26 +225,25 @@ def new_name(names: t.Set[str], name: str) -> str:
`
220
225
`if not pos_alias:
`
221
226
`pos_alias = new_name(taken_select_names, "pos")
`
222
227
``
``
228
`+
alias.set("alias", exp.to_identifier(explode_alias))
`
``
229
+
223
230
`column = exp.If(
`
224
231
`this=exp.column(series_alias).eq(exp.column(pos_alias)),
`
225
232
`true=exp.column(explode_alias),
`
226
``
`-
).as_(explode_alias)
`
``
233
`+
)
`
``
234
+
``
235
`+
explode.replace(column)
`
227
236
``
228
237
`if is_posexplode:
`
229
238
`expressions = expression.expressions
`
230
``
`-
index = expressions.index(to_replace)
`
231
``
`-
expressions.pop(index)
`
232
``
`-
expressions.insert(index, column)
`
233
239
`expressions.insert(
`
234
``
`-
index + 1,
`
``
240
`+
expressions.index(alias) + 1,
`
235
241
`exp.If(
`
236
242
`this=exp.column(series_alias).eq(exp.column(pos_alias)),
`
237
243
`true=exp.column(pos_alias),
`
238
244
` ).as_(pos_alias),
`
239
245
` )
`
240
246
`expression.set("expressions", expressions)
`
241
``
`-
else:
`
242
``
`-
to_replace.replace(column)
`
243
247
``
244
248
`if not arrays:
`
245
249
`if expression.args.get("from"):
`