Skip to content

Commit dcf2cb9

Browse files
authored
fix(optimizer)!: annotate fields of UNNEST(STRUCT) with ALIAS for bq (tobymao#6830)
* fix(optimizer)!: annotate fields of UNNEST(STRUCT) with ALIAS for bq * add test
1 parent d8f266b commit dcf2cb9

File tree

2 files changed

+57
-11
lines changed

2 files changed

+57
-11
lines changed

sqlglot/optimizer/annotate_types.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,6 @@ def _get_scope_selects(self, scope: Scope) -> t.Dict[str, t.Dict[str, t.Any]]:
307307

308308
if (
309309
isinstance(expression, exp.Unnest)
310-
and not alias_column_names
311310
and expression.type
312311
and expression.type.is_type(exp.DataType.Type.STRUCT)
313312
):

tests/test_optimizer.py

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,12 +1572,18 @@ def test_unnest_struct_field_annotation(self):
15721572
SELECT first_name, last_name
15731573
FROM data, UNNEST(users)
15741574
""",
1575-
read="bigquery",
1576-
)
1577-
)
1575+
dialect="bigquery",
1576+
),
1577+
dialect="bigquery",
1578+
),
1579+
dialect="bigquery",
1580+
)
1581+
self.assertEqual(
1582+
expression.selects[0].type, exp.DataType.build("VARCHAR", dialect="bigquery")
1583+
)
1584+
self.assertEqual(
1585+
expression.selects[1].type, exp.DataType.build("VARCHAR", dialect="bigquery")
15781586
)
1579-
self.assertEqual(expression.selects[0].type, exp.DataType.build("VARCHAR"))
1580-
self.assertEqual(expression.selects[1].type, exp.DataType.build("VARCHAR"))
15811587

15821588
expression = annotate_types(
15831589
optimizer.qualify.qualify(
@@ -1586,16 +1592,57 @@ def test_unnest_struct_field_annotation(self):
15861592
SELECT person
15871593
FROM UNNEST([STRUCT('Charlie' AS name, 40 AS age)]) AS person
15881594
""",
1589-
read="bigquery",
1590-
)
1591-
)
1595+
dialect="bigquery",
1596+
),
1597+
dialect="bigquery",
1598+
),
1599+
dialect="bigquery",
15921600
)
15931601
select_type = expression.selects[0].type
15941602
self.assertTrue(select_type.is_type(exp.DataType.Type.STRUCT))
15951603
self.assertEqual(len(select_type.expressions), 2)
15961604
fields = {col_def.name: col_def.kind for col_def in select_type.expressions}
1597-
self.assertEqual(fields.get("name"), exp.DataType.build("VARCHAR"))
1598-
self.assertEqual(fields.get("age"), exp.DataType.build("INT"))
1605+
self.assertEqual(fields.get("name"), exp.DataType.build("VARCHAR", dialect="bigquery"))
1606+
self.assertEqual(fields.get("age"), exp.DataType.build("INT", dialect="bigquery"))
1607+
1608+
expression = annotate_types(
1609+
optimizer.qualify.qualify(
1610+
parse_one(
1611+
"""
1612+
WITH data AS (
1613+
SELECT [STRUCT('Bob' AS first_name, 'Smith' AS last_name)] AS users
1614+
)
1615+
SELECT first_name, last_name
1616+
FROM data, UNNEST(users) AS p
1617+
""",
1618+
dialect="bigquery",
1619+
),
1620+
dialect="bigquery",
1621+
),
1622+
dialect="bigquery",
1623+
)
1624+
self.assertEqual(
1625+
expression.selects[0].type, exp.DataType.build("VARCHAR", dialect="bigquery")
1626+
)
1627+
self.assertEqual(
1628+
expression.selects[1].type, exp.DataType.build("VARCHAR", dialect="bigquery")
1629+
)
1630+
1631+
expression = annotate_types(
1632+
optimizer.qualify.qualify(
1633+
parse_one(
1634+
"""
1635+
SELECT name
1636+
FROM UNNEST([STRUCT('Charlie' AS name, 40 AS age)]) AS person
1637+
""",
1638+
dialect="bigquery",
1639+
),
1640+
dialect="bigquery",
1641+
),
1642+
dialect="bigquery",
1643+
)
1644+
select_type = expression.selects[0].type
1645+
self.assertTrue(select_type.is_type(exp.DataType.build("VARCHAR", dialect="bigquery")))
15991646

16001647
def test_map_annotation(self):
16011648
# ToMap annotation

0 commit comments

Comments
 (0)