Skip to content

Commit 572ba34

Browse files
Copilotjoocer
andcommitted
Add 190 SQL edge cases to battery test files
Co-authored-by: joocer <[email protected]>
1 parent 4933fff commit 572ba34

File tree

5 files changed

+352
-1
lines changed

5 files changed

+352
-1
lines changed

tests/integration/sql_battery/test_casts_battery.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,63 @@
4444
("SELECT 1 FROM testdata.tweets WHERE str_timestamp || '.000000' == CAST(ts_timestamp AS VARCHAR)", 100000, 1, None),
4545
("SELECT 1 FROM testdata.tweets WHERE CAST(int_timestamp * 1_000_000 AS TIMESTAMP) == ts_timestamp", 100000, 1, None),
4646

47+
# Additional CAST edge cases - NULL handling
48+
("SELECT CAST(NULL AS INTEGER)", 1, 1, None),
49+
("SELECT CAST(NULL AS VARCHAR)", 1, 1, None),
50+
("SELECT CAST(NULL AS DOUBLE)", 1, 1, None),
51+
("SELECT CAST(NULL AS BOOLEAN)", 1, 1, None),
52+
("SELECT CAST(NULL AS TIMESTAMP)", 1, 1, None),
53+
54+
# BOOLEAN casts
55+
("SELECT CAST(1 AS BOOLEAN)", 1, 1, None),
56+
("SELECT CAST(0 AS BOOLEAN)", 1, 1, None),
57+
("SELECT CAST('true' AS BOOLEAN)", 1, 1, None),
58+
("SELECT CAST('false' AS BOOLEAN)", 1, 1, None),
59+
("SELECT CAST(TRUE AS VARCHAR)", 1, 1, None),
60+
("SELECT CAST(FALSE AS VARCHAR)", 1, 1, None),
61+
("SELECT CAST(TRUE AS INTEGER)", 1, 1, None),
62+
("SELECT CAST(FALSE AS INTEGER)", 1, 1, None),
63+
64+
# VARCHAR casts with special characters
65+
("SELECT CAST('hello world' AS VARCHAR)", 1, 1, None),
66+
("SELECT CAST('123' AS INTEGER)", 1, 1, None),
67+
("SELECT CAST('123.456' AS DOUBLE)", 1, 1, None),
68+
("SELECT CAST('2023-01-01' AS TIMESTAMP)", 1, 1, None),
69+
70+
# Numeric edge cases
71+
("SELECT CAST(0 AS VARCHAR)", 1, 1, None),
72+
("SELECT CAST(-0 AS VARCHAR)", 1, 1, None),
73+
("SELECT CAST(0.0 AS VARCHAR)", 1, 1, None),
74+
("SELECT CAST(-0.0 AS VARCHAR)", 1, 1, None),
75+
76+
# Large numbers
77+
("SELECT CAST(999999999999 AS VARCHAR)", 1, 1, None),
78+
("SELECT CAST(-999999999999 AS VARCHAR)", 1, 1, None),
79+
("SELECT CAST(1.7976931348623157e+308 AS VARCHAR)", 1, 1, None),
80+
81+
# Scientific notation
82+
("SELECT CAST('1e10' AS DOUBLE)", 1, 1, None),
83+
("SELECT CAST('1.5e-5' AS DOUBLE)", 1, 1, None),
84+
("SELECT CAST('-2.5e3' AS DOUBLE)", 1, 1, None),
85+
86+
# Empty string casts
87+
("SELECT CAST('' AS VARCHAR)", 1, 1, None),
88+
("SELECT CAST('' AS BLOB)", 1, 1, None),
89+
90+
# Special numeric values (these may need adjustment based on engine support)
91+
# ("SELECT CAST('inf' AS DOUBLE)", 1, 1, None),
92+
# ("SELECT CAST('-inf' AS DOUBLE)", 1, 1, None),
93+
# ("SELECT CAST('nan' AS DOUBLE)", 1, 1, None),
94+
95+
# Cross-type casting chains
96+
("SELECT CAST(CAST(CAST(123 AS VARCHAR) AS INTEGER) AS DOUBLE)", 1, 1, None),
97+
("SELECT CAST(CAST(CAST('456' AS INTEGER) AS DOUBLE) AS VARCHAR)", 1, 1, None),
98+
("SELECT CAST(CAST(TRUE AS INTEGER) AS VARCHAR)", 1, 1, None),
99+
100+
# BLOB/BINARY casts
101+
("SELECT CAST('test' AS BLOB)", 1, 1, None),
102+
("SELECT CAST(CAST('test' AS BLOB) AS VARCHAR)", 1, 1, None),
103+
47104
]
48105
# fmt:on
49106

tests/integration/sql_battery/test_null_semantics.py

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,95 @@
194194
-- Query 38: NOT NULL should return NULL (0 rows, null coerces to false in WHERE)
195195
-- This tests the three-valued logic: NOT null = null
196196
SELECT 1 FROM $no_table WHERE NOT NULL;
197-
""", {}),
197+
""", {}),(
198+
"""
199+
-- Query 39: NULL in aggregate functions - COUNT should ignore NULLs
200+
SELECT COUNT(bool) FROM (VALUES (True), (False), (NULL)) AS tristatebooleans(bool);
201+
""", {2}),(
202+
"""
203+
-- Query 40: NULL in aggregate functions - COUNT(*) should count NULLs
204+
SELECT COUNT(*) FROM (VALUES (True), (False), (NULL)) AS tristatebooleans(bool);
205+
""", {3}),(
206+
"""
207+
-- Query 41: NULL in string concatenation
208+
SELECT 1 FROM $no_table WHERE ('hello' || NULL) IS NULL;
209+
""", {1}),(
210+
"""
211+
-- Query 42: NULL in arithmetic operations - addition
212+
SELECT 1 FROM $no_table WHERE (5 + NULL) IS NULL;
213+
""", {1}),(
214+
"""
215+
-- Query 43: NULL in arithmetic operations - multiplication
216+
SELECT 1 FROM $no_table WHERE (5 * NULL) IS NULL;
217+
""", {1}),(
218+
"""
219+
-- Query 44: NULL in comparison - NULL = NULL is NULL (not TRUE)
220+
SELECT 1 FROM $no_table WHERE NULL = NULL;
221+
""", {}),(
222+
"""
223+
-- Query 45: NULL in comparison - NULL <> NULL is NULL (not TRUE)
224+
SELECT 1 FROM $no_table WHERE NULL <> NULL;
225+
""", {}),(
226+
"""
227+
-- Query 46: NULL in comparison - NULL IS DISTINCT FROM NULL is FALSE
228+
SELECT 1 FROM $no_table WHERE NOT (NULL IS DISTINCT FROM NULL);
229+
""", {1}),(
230+
"""
231+
-- Query 47: NULL in CASE expression - NULL in condition
232+
SELECT 1 FROM $no_table WHERE CASE WHEN NULL THEN FALSE ELSE TRUE END;
233+
""", {1}),(
234+
"""
235+
-- Query 48: NULL NULLS FIRST in ORDER BY (just checking it doesn't error)
236+
SELECT bool FROM (VALUES (1), (NULL), (2)) AS test(bool) ORDER BY bool NULLS FIRST;
237+
""", {1, None, 2}),(
238+
"""
239+
-- Query 49: NULL NULLS LAST in ORDER BY (just checking it doesn't error)
240+
SELECT bool FROM (VALUES (1), (NULL), (2)) AS test(bool) ORDER BY bool NULLS LAST;
241+
""", {1, None, 2}),(
242+
"""
243+
-- Query 50: NULL with COALESCE - returns first non-NULL
244+
SELECT 1 FROM $no_table WHERE COALESCE(NULL, NULL, 5) = 5;
245+
""", {1}),(
246+
"""
247+
-- Query 51: NULL with COALESCE - all NULLs returns NULL
248+
SELECT 1 FROM $no_table WHERE COALESCE(NULL, NULL, NULL) IS NULL;
249+
""", {1}),(
250+
"""
251+
-- Query 52: NULL in HAVING clause
252+
SELECT bool FROM (VALUES (True), (False), (NULL)) AS test(bool) GROUP BY bool HAVING bool IS NULL;
253+
""", {None}),(
254+
"""
255+
-- Query 53: NULL in MIN aggregate
256+
SELECT MIN(val) FROM (VALUES (1), (2), (NULL)) AS test(val);
257+
""", {1}),(
258+
"""
259+
-- Query 54: NULL in MAX aggregate
260+
SELECT MAX(val) FROM (VALUES (1), (2), (NULL)) AS test(val);
261+
""", {2}),(
262+
"""
263+
-- Query 55: NULL in SUM aggregate
264+
SELECT SUM(val) FROM (VALUES (1), (2), (NULL)) AS test(val);
265+
""", {3}),(
266+
"""
267+
-- Query 56: NULL in AVG aggregate
268+
SELECT AVG(val) FROM (VALUES (1.0), (3.0), (NULL)) AS test(val);
269+
""", {2.0}),(
270+
"""
271+
-- Query 57: NULL with IN operator - NULL IN (values) is always NULL
272+
SELECT 1 FROM $no_table WHERE NULL IN (1, 2, 3);
273+
""", {}),(
274+
"""
275+
-- Query 58: NULL with NOT IN operator - value NOT IN (values with NULL) can be NULL
276+
SELECT 1 FROM $no_table WHERE 5 NOT IN (1, 2, NULL);
277+
""", {}),(
278+
"""
279+
-- Query 59: Non-NULL with NOT IN operator - value NOT IN (values without the value) is TRUE
280+
SELECT 1 FROM $no_table WHERE 5 NOT IN (1, 2, 3);
281+
""", {1}),(
282+
"""
283+
-- Query 60: NULL in DISTINCT - should be treated as a unique value
284+
SELECT COUNT(DISTINCT val) FROM (VALUES (1), (1), (NULL), (NULL)) AS test(val);
285+
""", {2}),
198286
]
199287
# fmt:on
200288

tests/integration/sql_battery/test_shapes_basic.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,79 @@
8787
("SELECT * FROM (SELECT COUNT(*), column_1 FROM FAKE(5000,2) AS FK GROUP BY column_1 ORDER BY COUNT(*)) AS SQ LIMIT 5", 5, 2, None),
8888
# FILTER CREATION FOR 3 OR MORE ANDED PREDICATES FAILS [#182]
8989
("SELECT * FROM $astronauts WHERE name LIKE '%o%' AND `year` > 1900 AND gender ILIKE '%ale%' AND group IN (1,2,3,4,5,6)", 41, 19, None),
90+
91+
# Additional basic query patterns - LIMIT and OFFSET
92+
("SELECT * FROM $planets LIMIT 5", 5, 20, None),
93+
("SELECT * FROM $planets LIMIT 0", 0, 20, None),
94+
("SELECT * FROM $planets LIMIT 1", 1, 20, None),
95+
("SELECT * FROM $planets OFFSET 5", 4, 20, None),
96+
("SELECT * FROM $planets LIMIT 3 OFFSET 2", 3, 20, None),
97+
("SELECT * FROM $planets LIMIT 100", 9, 20, None),
98+
99+
# ORDER BY variations
100+
("SELECT * FROM $planets ORDER BY id", 9, 20, None),
101+
("SELECT * FROM $planets ORDER BY id DESC", 9, 20, None),
102+
("SELECT * FROM $planets ORDER BY name ASC", 9, 20, None),
103+
("SELECT * FROM $planets ORDER BY id, name", 9, 20, None),
104+
("SELECT * FROM $planets ORDER BY id DESC, name ASC", 9, 20, None),
105+
106+
# DISTINCT variations
107+
("SELECT DISTINCT id FROM $planets", 9, 1, None),
108+
("SELECT DISTINCT name FROM $planets", 9, 1, None),
109+
("SELECT DISTINCT id, name FROM $planets", 9, 2, None),
110+
111+
# Basic aggregations
112+
("SELECT COUNT(*) FROM $planets", 1, 1, None),
113+
("SELECT COUNT(id) FROM $planets", 1, 1, None),
114+
("SELECT COUNT(DISTINCT id) FROM $planets", 1, 1, None),
115+
("SELECT SUM(id) FROM $planets", 1, 1, None),
116+
("SELECT AVG(id) FROM $planets", 1, 1, None),
117+
("SELECT MIN(id) FROM $planets", 1, 1, None),
118+
("SELECT MAX(id) FROM $planets", 1, 1, None),
119+
120+
# GROUP BY with aggregations
121+
("SELECT COUNT(*) FROM $satellites GROUP BY planetId", 7, 1, None),
122+
("SELECT planetId, COUNT(*) FROM $satellites GROUP BY planetId", 7, 2, None),
123+
("SELECT planetId, COUNT(*), MAX(id) FROM $satellites GROUP BY planetId", 7, 3, None),
124+
125+
# WHERE clause variations
126+
("SELECT * FROM $planets WHERE id = 1", 1, 20, None),
127+
("SELECT * FROM $planets WHERE id != 1", 8, 20, None),
128+
("SELECT * FROM $planets WHERE id > 5", 4, 20, None),
129+
("SELECT * FROM $planets WHERE id >= 5", 5, 20, None),
130+
("SELECT * FROM $planets WHERE id < 5", 4, 20, None),
131+
("SELECT * FROM $planets WHERE id <= 5", 5, 20, None),
132+
("SELECT * FROM $planets WHERE id BETWEEN 3 AND 6", 4, 20, None),
133+
("SELECT * FROM $planets WHERE name LIKE 'M%'", 2, 20, None),
134+
("SELECT * FROM $planets WHERE name ILIKE 'm%'", 2, 20, None),
135+
("SELECT * FROM $planets WHERE id IN (1, 3, 5)", 3, 20, None),
136+
("SELECT * FROM $planets WHERE id NOT IN (1, 3, 5)", 6, 20, None),
137+
138+
# NULL handling
139+
("SELECT * FROM $planets WHERE name IS NULL", 0, 20, None),
140+
("SELECT * FROM $planets WHERE name IS NOT NULL", 9, 20, None),
141+
142+
# Combining conditions
143+
("SELECT * FROM $planets WHERE id > 3 AND id < 7", 3, 20, None),
144+
("SELECT * FROM $planets WHERE id < 3 OR id > 7", 4, 20, None),
145+
("SELECT * FROM $planets WHERE (id > 3 AND id < 7) OR id = 1", 4, 20, None),
146+
147+
# Column selection variations
148+
("SELECT id FROM $planets", 9, 1, None),
149+
("SELECT id, name FROM $planets", 9, 2, None),
150+
("SELECT name, id FROM $planets", 9, 2, None),
151+
("SELECT id, name, id FROM $planets", 9, 3, None),
152+
153+
# Expressions in SELECT
154+
("SELECT id * 2 FROM $planets", 9, 1, None),
155+
("SELECT id + 1 FROM $planets", 9, 1, None),
156+
("SELECT id - 1, id + 1 FROM $planets", 9, 2, None),
157+
158+
# Subqueries
159+
("SELECT * FROM (SELECT * FROM $planets) AS subquery", 9, 20, None),
160+
("SELECT * FROM (SELECT id, name FROM $planets) AS subquery", 9, 2, None),
161+
("SELECT COUNT(*) FROM (SELECT * FROM $planets WHERE id > 5) AS subquery", 1, 1, None),
162+
90163
]
91164
# fmt:on
92165

tests/integration/sql_battery/test_shapes_edge_cases.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,77 @@
451451
# 2818
452452
("SELECT COUNT_DISTINCT(perihelion) FROM testdata.planets WHERE diameter >= 378092", 1, 1, None),
453453
("SELECT COUNT_DISTINCT(perihelion) FROM testdata.planets WHERE diameter >= 378092 GROUP BY name", 0, 1, None),
454+
455+
# Additional edge cases - UNION/EXCEPT/INTERSECT
456+
("SELECT id FROM $planets WHERE id < 3 UNION SELECT id FROM $planets WHERE id > 7", 4, 1, None),
457+
("SELECT id FROM $planets WHERE id < 5 UNION ALL SELECT id FROM $planets WHERE id < 3", 6, 1, None),
458+
("SELECT id FROM $planets EXCEPT SELECT id FROM $satellites WHERE id < 5", 5, 1, None),
459+
("SELECT id FROM $planets INTERSECT SELECT id FROM $satellites", 9, 1, None),
460+
461+
# Complex nested subqueries
462+
("SELECT * FROM (SELECT * FROM (SELECT * FROM $planets) AS s1) AS s2", 9, 20, None),
463+
("SELECT COUNT(*) FROM (SELECT id FROM $planets WHERE id IN (SELECT planetId FROM $satellites)) AS subq", 1, 1, None),
464+
465+
# CROSS JOIN edge cases
466+
("SELECT COUNT(*) FROM $planets CROSS JOIN $no_table", 9, 1, None),
467+
("SELECT p.id FROM $planets p CROSS JOIN (SELECT 1 AS one) AS t", 9, 1, None),
468+
469+
# Edge cases with HAVING
470+
("SELECT planetId, COUNT(*) FROM $satellites GROUP BY planetId HAVING COUNT(*) > 1", 6, 2, None),
471+
("SELECT planetId FROM $satellites GROUP BY planetId HAVING COUNT(*) = 1", 1, 1, None),
472+
("SELECT planetId FROM $satellites GROUP BY planetId HAVING MAX(id) > 100", 1, 1, None),
473+
474+
# Window function edge cases (if supported)
475+
# ("SELECT id, ROW_NUMBER() OVER (ORDER BY id) FROM $planets", 9, 2, None),
476+
# ("SELECT id, RANK() OVER (ORDER BY id) FROM $planets", 9, 2, None),
477+
478+
# Complex CASE expressions
479+
("SELECT CASE WHEN id < 5 THEN 'small' WHEN id < 8 THEN 'medium' ELSE 'large' END FROM $planets", 9, 1, None),
480+
("SELECT CASE id WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'other' END FROM $planets", 9, 1, None),
481+
("SELECT CASE WHEN id IS NULL THEN 'null' WHEN id < 0 THEN 'negative' ELSE 'positive' END FROM $planets", 9, 1, None),
482+
483+
# LIMIT with expressions
484+
("SELECT * FROM $planets LIMIT 1 + 1", 2, 20, None),
485+
("SELECT * FROM $planets LIMIT 10 - 5", 5, 20, None),
486+
487+
# Edge cases with string functions
488+
("SELECT * FROM $planets WHERE LENGTH(name) > 5", 4, 20, None),
489+
("SELECT * FROM $planets WHERE UPPER(name) = 'EARTH'", 1, 20, None),
490+
("SELECT * FROM $planets WHERE LOWER(name) LIKE 'mars'", 1, 20, None),
491+
492+
# Temporal query edge cases
493+
("SELECT * FROM $planets FOR DATES BETWEEN '2020-01-01' AND '2025-12-31'", 9, 20, None),
494+
("SELECT * FROM $planets FOR '2023-06-15'", 9, 20, None),
495+
496+
# Complex JOIN conditions
497+
("SELECT p.id FROM $planets p INNER JOIN $satellites s ON p.id = s.planetId AND p.id < 5", 121, 1, None),
498+
("SELECT COUNT(*) FROM $planets p LEFT JOIN $satellites s ON p.id = s.planetId WHERE s.id IS NULL", 0, 1, None),
499+
("SELECT COUNT(*) FROM $satellites s RIGHT JOIN $planets p ON s.planetId = p.id WHERE s.id IS NOT NULL", 177, 1, None),
500+
501+
# Self-join edge cases
502+
("SELECT p1.id FROM $planets p1 JOIN $planets p2 ON p1.id = p2.id", 9, 1, None),
503+
("SELECT COUNT(*) FROM $planets p1, $planets p2 WHERE p1.id != p2.id", 72, 1, None),
504+
505+
# Multiple aggregations
506+
("SELECT COUNT(*), SUM(id), AVG(id), MIN(id), MAX(id) FROM $planets", 1, 5, None),
507+
("SELECT COUNT(DISTINCT id), COUNT(*) FROM $planets", 1, 2, None),
508+
509+
# Empty result handling
510+
("SELECT * FROM $planets WHERE FALSE", 0, 20, None),
511+
("SELECT * FROM $planets WHERE 1 = 0", 0, 20, None),
512+
("SELECT * FROM $planets WHERE id > 1000", 0, 20, None),
513+
514+
# Extreme LIMIT values
515+
("SELECT * FROM $planets LIMIT 999999", 9, 20, None),
516+
517+
# Complex ORDER BY
518+
("SELECT * FROM $planets ORDER BY id ASC, name DESC", 9, 20, None),
519+
("SELECT id, name FROM $planets ORDER BY 1, 2", 9, 2, None),
520+
521+
# Aggregate with no GROUP BY
522+
("SELECT COUNT(*), 'constant' FROM $planets", 1, 2, None),
523+
("SELECT MAX(id), MIN(id), AVG(id) FROM $planets", 1, 3, None),
524+
454525
]
455526
# fmt:on
456527

tests/integration/sql_battery/test_shapes_joins_subqueries.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,68 @@
265265
("SELECT BOOLEAN FROM (SELECT False AS BOOLEAN) AS SQ", 1, 1, None),
266266
# EXPLAIN has two heads (found looking a [#408])
267267
("EXPLAIN SELECT * FROM $planets AS a INNER JOIN (SELECT id FROM $planets) AS b USING (id)", 3, 3, None),
268+
269+
# Additional complex nested subqueries
270+
("SELECT * FROM (SELECT * FROM (SELECT id FROM $planets WHERE id < 5) AS s1 WHERE id > 2) AS s2", 2, 1, None),
271+
("SELECT COUNT(*) FROM (SELECT id FROM (SELECT * FROM $planets) AS inner_query) AS outer_query", 1, 1, None),
272+
("SELECT * FROM $planets WHERE id IN (SELECT planetId FROM (SELECT * FROM $satellites) AS s)", 9, 20, None),
273+
274+
# Correlated subqueries
275+
("SELECT p.id, (SELECT COUNT(*) FROM $satellites s WHERE s.planetId = p.id) AS sat_count FROM $planets p", 9, 2, None),
276+
("SELECT p.name FROM $planets p WHERE EXISTS (SELECT 1 FROM $satellites s WHERE s.planetId = p.id)", 9, 1, None),
277+
("SELECT p.name FROM $planets p WHERE NOT EXISTS (SELECT 1 FROM $satellites s WHERE s.planetId = p.id AND s.id > 1000)", 9, 1, None),
278+
279+
# Multiple JOIN operations
280+
("SELECT COUNT(*) FROM $planets p INNER JOIN $satellites s ON p.id = s.planetId INNER JOIN $missions m ON p.id = m.id", 9, 1, None),
281+
("SELECT p.id FROM $planets p LEFT JOIN $satellites s1 ON p.id = s1.planetId LEFT JOIN $satellites s2 ON p.id = s2.planetId", 177, 1, None),
282+
283+
# Self-join variations
284+
("SELECT p1.id, p2.id FROM $planets p1 INNER JOIN $planets p2 ON p1.id < p2.id", 36, 2, None),
285+
("SELECT COUNT(*) FROM $planets p1 LEFT JOIN $planets p2 ON p1.id = p2.id", 9, 1, None),
286+
287+
# Subquery in SELECT clause
288+
("SELECT id, (SELECT COUNT(*) FROM $satellites WHERE planetId = $planets.id) FROM $planets", 9, 2, None),
289+
("SELECT id, name, (SELECT MAX(id) FROM $satellites) AS max_sat_id FROM $planets", 9, 3, None),
290+
291+
# Subquery in WHERE with multiple conditions
292+
("SELECT * FROM $planets WHERE id IN (SELECT planetId FROM $satellites WHERE id > 10 AND id < 50)", 9, 20, None),
293+
("SELECT * FROM $planets WHERE id = (SELECT MIN(planetId) FROM $satellites)", 1, 20, None),
294+
295+
# JOIN with subqueries
296+
("SELECT * FROM (SELECT id, name FROM $planets) p INNER JOIN (SELECT planetId FROM $satellites) s ON p.id = s.planetId", 177, 3, None),
297+
("SELECT COUNT(*) FROM (SELECT * FROM $planets WHERE id < 5) p LEFT JOIN $satellites s ON p.id = s.planetId", 121, 1, None),
298+
299+
# Complex JOIN conditions with subqueries
300+
("SELECT p.id FROM $planets p WHERE id IN (SELECT planetId FROM $satellites GROUP BY planetId HAVING COUNT(*) > 1)", 6, 1, None),
301+
302+
# UNION in subqueries
303+
("SELECT * FROM (SELECT id FROM $planets WHERE id < 3 UNION SELECT id FROM $planets WHERE id > 7) AS combined", 4, 1, None),
304+
("SELECT COUNT(*) FROM (SELECT id FROM $planets UNION SELECT planetId FROM $satellites) AS all_ids", 1, 1, None),
305+
306+
# Nested EXISTS
307+
("SELECT * FROM $planets p WHERE EXISTS (SELECT 1 FROM $satellites s WHERE s.planetId = p.id AND EXISTS (SELECT 1 FROM $missions m WHERE m.id = s.id))", 9, 20, None),
308+
309+
# Multiple subqueries in WHERE
310+
("SELECT * FROM $planets WHERE id > (SELECT MIN(id) FROM $planets) AND id < (SELECT MAX(id) FROM $planets)", 7, 20, None),
311+
312+
# Subquery with GROUP BY in JOIN
313+
("SELECT p.id, counts.cnt FROM $planets p LEFT JOIN (SELECT planetId, COUNT(*) AS cnt FROM $satellites GROUP BY planetId) counts ON p.id = counts.planetId", 9, 2, None),
314+
315+
# Complex nested WITH/CTE-like subqueries
316+
("SELECT * FROM (SELECT id, name FROM $planets) AS p WHERE id IN (SELECT planetId FROM $satellites WHERE id < 100)", 9, 2, None),
317+
318+
# Lateral-style correlations
319+
("SELECT p.id, sub.max_sat FROM $planets p LEFT JOIN (SELECT planetId, MAX(id) AS max_sat FROM $satellites WHERE planetId = p.id GROUP BY planetId) sub ON TRUE", 9, 2, None),
320+
321+
# Multiple levels of nesting with aggregates
322+
("SELECT outer_id FROM (SELECT inner_id AS outer_id FROM (SELECT id AS inner_id FROM $planets) AS level1) AS level2", 9, 1, None),
323+
324+
# Subquery returning multiple columns
325+
("SELECT * FROM (SELECT id, name, id * 2 AS doubled FROM $planets) AS sub WHERE doubled > 10", 4, 3, None),
326+
327+
# JOIN with DISTINCT in subquery
328+
("SELECT COUNT(*) FROM $planets p INNER JOIN (SELECT DISTINCT planetId FROM $satellites) s ON p.id = s.planetId", 9, 1, None),
329+
268330
]
269331
# fmt:on
270332

0 commit comments

Comments
 (0)