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"):

`