Skip to content

Commit bb002d6

Browse files
fix: is_select with UNION (apache#25290)
1 parent e1ddba9 commit bb002d6

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

superset/sql_parse.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -229,13 +229,17 @@ def _check_cte_is_select(self, oxide_parse: list[dict[str, Any]]) -> bool:
229229
:param oxide_parse: parsed CTE
230230
:return: True if CTE is a SELECT statement
231231
"""
232+
233+
def is_body_select(body: dict[str, Any]) -> bool:
234+
if op := body.get("SetOperation"):
235+
return is_body_select(op["left"]) and is_body_select(op["right"])
236+
return all(key == "Select" for key in body.keys())
237+
232238
for query in oxide_parse:
233239
parsed_query = query["Query"]
234240
cte_tables = self._get_cte_tables(parsed_query)
235241
for cte_table in cte_tables:
236-
is_select = all(
237-
key == "Select" for key in cte_table["query"]["body"].keys()
238-
)
242+
is_select = is_body_select(cte_table["query"]["body"])
239243
if not is_select:
240244
return False
241245
return True

tests/unit_tests/sql_parse_tests.py

+10
Original file line numberDiff line numberDiff line change
@@ -1623,3 +1623,13 @@ def test_is_select() -> None:
16231623
Test `is_select`.
16241624
"""
16251625
assert not ParsedQuery("SELECT 1; DROP DATABASE superset").is_select()
1626+
assert ParsedQuery(
1627+
"with base as(select id from table1 union all select id from table2) select * from base"
1628+
).is_select()
1629+
assert ParsedQuery(
1630+
"""
1631+
WITH t AS (
1632+
SELECT 1 UNION ALL SELECT 2
1633+
)
1634+
SELECT * FROM t"""
1635+
).is_select()

0 commit comments

Comments
 (0)