should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,15 @@
# name: test/sql/setops/ambiguous_order_by.test
# description: Ambiguous ORDER BY in set ops
# group: [setops]
query II
select * from (values(42, 84)) s1(c1, c2) union all select * from (values(84, 42)) s2(c2, c3) order by c1;
----
42 84
84 42
query II
select * from (values(42, 84)) s1(c1, c2) union all select * from (values(84, 42)) s2(c2, c3) order by c3;
----
84 42
42 84

View File

@@ -0,0 +1,50 @@
# name: test/sql/setops/setops_pushdown.test
# description: Test pushdown into UNION/EXCEPT/INTERSECT
# group: [setops]
# EXCEPT, but LHS is empty
query I
SELECT 42 WHERE 1=0 EXCEPT SELECT 42
----
# EXCEPT, but RHS is empty
query I
SELECT 42 EXCEPT SELECT 42 WHERE 1=0
----
42
# EXCEPT, both sides empty
query I
SELECT 42 WHERE 1=0 EXCEPT SELECT 42 WHERE 1=0
----
# INTERSECT, but LHS is empty
query I
SELECT 42 WHERE 1=0 INTERSECT SELECT 42
----
# INTERSECT, but RHS is empty
query I
SELECT 42 INTERSECT SELECT 42 WHERE 1=0
----
# INTERSECT, both sides empty
query I
SELECT 42 WHERE 1=0 INTERSECT SELECT 42 WHERE 1=0
----
# UNION, but LHS is empty
query I
SELECT 42 WHERE 1=0 UNION ALL SELECT 42
----
42
# UNION, but RHS is empty
query I
SELECT 42 UNION ALL SELECT 42 WHERE 1=0
----
42
query I
SELECT 42 WHERE 1=0 UNION ALL SELECT 42 WHERE 1=0
----

View File

@@ -0,0 +1,27 @@
# name: test/sql/setops/test_except.test
# description: Test EXCEPT / INTERSECT
# group: [setops]
statement ok
CREATE TABLE a(i INTEGER)
statement ok
INSERT INTO a VALUES (41), (42), (43)
statement ok
CREATE TABLE b(i INTEGER)
statement ok
INSERT INTO b VALUES (40), (43), (43)
query I
select * from a except select * from b order by 1
----
41
42
query I
select * from a intersect select * from b
----
43

View File

@@ -0,0 +1,92 @@
# name: test/sql/setops/test_full_outer_join_union.test
# description: Test full outer joins on unions
# group: [setops]
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE integers(i INTEGER);
statement ok
INSERT INTO integers VALUES (1), (2);
statement ok
CREATE TABLE integers2(i INTEGER);
statement ok
INSERT INTO integers2 VALUES (2), (3);
statement ok
CREATE VIEW v1 AS SELECT * FROM integers UNION ALL SELECT * FROM integers;
statement ok
CREATE VIEW v2 AS SELECT * FROM integers2 UNION ALL SELECT * FROM integers2;
query I
SELECT COUNT(*) FROM v1 JOIN v2 USING (i);
----
4
query I
SELECT COUNT(*) FROM v1 LEFT JOIN v2 USING (i);
----
6
query I
SELECT COUNT(*) FROM v1 RIGHT JOIN v2 USING (i);
----
6
query I
SELECT COUNT(*) FROM v1 FULL OUTER JOIN v2 USING (i);
----
8
# self joins
query I
SELECT COUNT(*) FROM v1 JOIN v1 v2 USING (i);
----
8
query I
SELECT COUNT(*) FROM v1 FULL OUTER JOIN v1 v2 USING (i);
----
8
# add some correlated subqueries for good measure
statement ok
CREATE VIEW v3 AS SELECT (SELECT integers2.i-1) i FROM integers2 UNION ALL SELECT (SELECT integers2.i-1) i FROM integers2;
statement ok
CREATE VIEW v4 AS SELECT (SELECT integers.i+1) i FROM integers UNION ALL SELECT (SELECT integers.i+1) i FROM integers;
query I
SELECT COUNT(*) FROM v3
----
4
query I
SELECT COUNT(*) FROM v4
----
4
query I
SELECT COUNT(*) FROM v3 JOIN v4 USING (i);
----
4
query I
SELECT COUNT(*) FROM v3 LEFT JOIN v4 USING (i);
----
6
query I
SELECT COUNT(*) FROM v3 RIGHT JOIN v4 USING (i);
----
6
query I
SELECT COUNT(*) FROM v3 FULL OUTER JOIN v4 USING (i);
----
8

View File

@@ -0,0 +1,31 @@
# name: test/sql/setops/test_joins_under_setops.test_slow
# description: Test joins under setops
# group: [setops]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test AS SELECT * FROM range(0, 1024, 1) t1(a);
statement ok
CREATE TABLE test2 AS SELECT * FROM range(0, 1024, 1) t1(b);
# Join under setops
query II
(SELECT * FROM test, test2 WHERE a=b) UNION (SELECT * FROM test,test2 WHERE a=b) ORDER BY 1
----
2048 values hashing to 3ac3f0295787aec0c2f4d7239e905c5b
# join under setops with CTEs
query R
WITH test_cte AS ((SELECT * FROM test, test2 WHERE a=b) UNION (SELECT * FROM test,test2 WHERE a=b)) SELECT SUM(ta.a) FROM test_cte ta, test_cte tb WHERE ta.a=tb.a
----
523776.000000
# join under setops with CTEs and aggregates
query R
WITH test_cte AS ((SELECT * FROM test, test2 WHERE a=b) UNION (SELECT * FROM test,test2 WHERE a=b)), results AS (SELECT SUM(ta.a) AS sum_a FROM test_cte ta, test_cte tb WHERE ta.a=tb.a) SELECT * FROM (SELECT * FROM results GROUP BY sum_a UNION SELECT * FROM results GROUP BY sum_a UNION SELECT * FROM results GROUP BY sum_a UNION SELECT * FROM results GROUP BY sum_a) AS t
----
523776.000000

View File

@@ -0,0 +1,27 @@
# name: test/sql/setops/test_nested_except.test
# description: Test nested EXCEPT
# group: [setops]
statement ok
create table a (i integer)
statement ok
create table b(i integer)
statement ok
create table c (i integer)
statement ok
insert into a values(42), (43), (44)
statement ok
insert into b values(43)
statement ok
insert into c values(44)
query I
select * from a except select * from b except select * from c
----
42

View File

@@ -0,0 +1,41 @@
# name: test/sql/setops/test_parallel_union.test_slow
# description: Test parallel UNION
# group: [setops]
statement ok
PRAGMA enable_verification
statement ok
PRAGMA threads=4
statement ok
PRAGMA verify_parallelism
statement ok
CREATE TABLE integers AS SELECT * FROM range(1000000) tbl(i)
query I
SELECT COUNT(*) FROM (SELECT * FROM integers UNION ALL SELECT * FROM integers) tbl(i)
----
2000000
query I
SELECT COUNT(*) FROM (SELECT 1 UNION ALL SELECT * FROM integers) tbl(i)
----
1000001
query I
SELECT COUNT(*) FROM (SELECT * FROM integers UNION ALL SELECT 1) tbl(i)
----
1000001
query I
SELECT COUNT(*) FROM (SELECT * FROM integers UNION ALL SELECT * FROM integers) tbl(i) WHERE i < 500000
----
1000000
# multiple unions
query I
SELECT COUNT(*) FROM (SELECT * FROM integers UNION ALL SELECT * FROM integers UNION ALL SELECT * FROM integers UNION ALL SELECT * FROM integers) tbl(i)
----
4000000

View File

@@ -0,0 +1,482 @@
# name: test/sql/setops/test_pg_union.test
# description: Postgres' 'union' tests, taken from src/test/regress/sql/union.sql
# group: [setops]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
#--
#-- UNION (also INTERSECT, EXCEPT)
#--
#-- Simple UNION constructs
query I
SELECT 1 AS two UNION SELECT 2 ORDER BY 1;
----
1
2
query I
SELECT 1 AS one UNION SELECT 1 ORDER BY 1;
----
1
query I
SELECT 1 AS two UNION ALL SELECT 2;
----
1
2
query I
SELECT 1 AS two UNION ALL SELECT 1;
----
1
1
query I
SELECT 1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1;
----
1
2
3
query I
SELECT 1 AS two UNION SELECT 2 UNION SELECT 2 ORDER BY 1;
----
1
2
query I
SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1;
----
1
2
2
query I
SELECT 1.1 AS two UNION SELECT 2.2 ORDER BY 1;
----
1.1
2.2
#-- Mixed types
query I
SELECT 1.1 AS two UNION SELECT 2 ORDER BY 1;
----
1.1
2.0
query I
SELECT 1 AS two UNION SELECT 2.2 ORDER BY 1;
----
1.0
2.2
query I
SELECT 1 AS one UNION SELECT 1.0::float8 ORDER BY 1;
----
1.0
query I
SELECT 1.1 AS two UNION ALL SELECT 2 ORDER BY 1;
----
1.1
2.0
query I
SELECT 1.0::float8 AS two UNION ALL SELECT 1 ORDER BY 1;
----
1.0
1.0
query I
SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1;
----
1.1
2.0
3.0
query I
SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1;
----
1.1
2.0
query I
SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1;
----
1.1
2.0
2.0
query I
SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2) ORDER BY 1;
----
1.1
2.0
#--
#-- Try testing from tables...
#--
statement ok
CREATE TABLE FLOAT8_TBL(f1 float8);
statement ok
INSERT INTO FLOAT8_TBL(f1) VALUES
('0.0'),
('-34.84'),
('-1004.30'),
('-1.2345678901234e+200'),
('-1.2345678901234e-200');
statement ok
CREATE TABLE INT4_TBL(f1 int4);
statement ok
INSERT INTO INT4_TBL(f1) VALUES
(' 0 '),
('123456 '),
(' -123456'),
('2147483647'), -- largest and smallest values
('-2147483647');
statement ok
CREATE TABLE INT8_TBL(q1 int8, q2 int8);
statement ok
INSERT INTO INT8_TBL VALUES
(' 123 ',' 456'),
('123 ','4567890123456789'),
('4567890123456789','123'),
(+4567890123456789,'4567890123456789'),
('+4567890123456789','-4567890123456789');
statement ok
CREATE TABLE CHAR_TBL(f1 char(4));
statement ok
INSERT INTO CHAR_TBL (f1) VALUES
('a'),
('ab'),
('abcd'),
('abcd ');
statement ok
CREATE TABLE VARCHAR_TBL(f1 varchar(4));
statement ok
INSERT INTO VARCHAR_TBL (f1) VALUES
('a'),
('ab'),
('abcd'),
('abcd ');
query I
SELECT f1 AS five FROM FLOAT8_TBL
UNION
SELECT f1 FROM FLOAT8_TBL
ORDER BY 1;
----
-1.2345678901234e+200
-1004.3
-34.84
-1.2345678901234e-200
0.0
query I
SELECT f1 AS ten FROM FLOAT8_TBL
UNION ALL
SELECT f1 FROM FLOAT8_TBL;
----
0.0
-34.84
-1004.3
-1.2345678901234e+200
-1.2345678901234e-200
0.0
-34.84
-1004.3
-1.2345678901234e+200
-1.2345678901234e-200
query I
SELECT f1 AS nine FROM FLOAT8_TBL
UNION
SELECT f1 FROM INT4_TBL
ORDER BY 1;
----
-1.2345678901234e+200
-2147483647.0
-123456.0
-1004.3
-34.84
-1.2345678901234e-200
0.0
123456.0
2147483647.0
query I
SELECT f1 AS ten FROM FLOAT8_TBL
UNION ALL
SELECT f1 FROM INT4_TBL;
----
0.0
-34.84
-1004.3
-1.2345678901234e+200
-1.2345678901234e-200
0.0
123456.0
-123456.0
2147483647.0
-2147483647.0
query I
SELECT f1 AS five FROM FLOAT8_TBL
WHERE f1 BETWEEN -1e6 AND 1e6
UNION
SELECT f1 FROM INT4_TBL
WHERE f1 BETWEEN 0 AND 1000000
ORDER BY 1;
----
-1004.3
-34.84
-1.2345678901234e-200
0.0
123456.0
# disabled due to the lack of CHAR() in DuckDB
mode skip
query I
SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL
UNION
SELECT f1 FROM CHAR_TBL
ORDER BY 1;
----
query I
SELECT f1 AS three FROM VARCHAR_TBL
UNION
SELECT CAST(f1 AS varchar) FROM CHAR_TBL
ORDER BY 1;
----
query I
SELECT f1 AS eight FROM VARCHAR_TBL
UNION ALL
SELECT f1 FROM CHAR_TBL;
----
query I
SELECT f1 AS five FROM TEXT_TBL
UNION
SELECT f1 FROM VARCHAR_TBL
UNION
SELECT TRIM(TRAILING FROM f1) FROM CHAR_TBL
ORDER BY 1;
----
mode unskip
#--
#-- INTERSECT and EXCEPT
#--
query I
SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl ORDER BY 1;
----
123
4567890123456789
query I
SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl ORDER BY 1;
----
123
4567890123456789
4567890123456789
query I
SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1;
----
-4567890123456789
456
query I
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl ORDER BY 1;
----
-4567890123456789
456
query I
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1;
----
-4567890123456789
456
4567890123456789
query I
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY 1;
----
query I
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl ORDER BY 1;
----
123
4567890123456789
query I
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl ORDER BY 1;
----
123
4567890123456789
4567890123456789
statement error
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl FOR NO KEY UPDATE;
----
<REGEX>:Parser Error.*SELECT locking clause is not supported.*
#-- nested cases
query III
(SELECT 1,2,3 UNION SELECT 4,5,6) INTERSECT SELECT 4,5,6;
----
4 5 6
query III
(SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6;
----
4 5 6
query III
(SELECT 1,2,3 UNION SELECT 4,5,6) EXCEPT SELECT 4,5,6;
----
1 2 3
query III
(SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) EXCEPT SELECT 4,5,6;
----
1 2 3
#--
#-- Mixed types
#--
query I
SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl ORDER BY 1;
----
0
query I
SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl ORDER BY 1;
----
-1.2345678901234e+200
-1004.3
-34.84
-1.2345678901234e-200
#--
#-- Operator precedence and (((((extra))))) parentheses
#--
query I
SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl ORDER BY 1;
----
-4567890123456789
123
123
456
4567890123456789
4567890123456789
4567890123456789
query I
SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) ORDER BY 1;
----
123
4567890123456789
query I
(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl ORDER BY 1))) UNION ALL SELECT q2 FROM int8_tbl;
----
123
4567890123456789
456
4567890123456789
123
4567890123456789
-4567890123456789
query I
SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1;
----
-4567890123456789
456
query I
SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1)));
----
123
123
4567890123456789
4567890123456789
4567890123456789
-4567890123456789
456
query I
(((SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1;
----
-4567890123456789
456
#--
#-- Subqueries with ORDER BY & LIMIT clauses
#--
#-- In this syntax, ORDER BY/LIMIT apply to the result of the EXCEPT
# Bug in DuckDB
mode skip
query II
SELECT q1,q2 FROM int8_tbl EXCEPT SELECT q2,q1 FROM int8_tbl
ORDER BY q2,q1;
----
4567890123456789 -4567890123456789
123 456
# this should fail but currently does not
statement error
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1;
----
<REGEX>:Parser Error.*SELECT locking clause is not supported.*
mode unskip
query I
SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1))) ORDER BY 1;
----
123
4567890123456789
#--
#-- New syntaxes (7.1) permit new tests
#--
query II
(((((select * from int8_tbl)))));
----
123 456
123 4567890123456789
4567890123456789 123
4567890123456789 4567890123456789
4567890123456789 -4567890123456789

View File

@@ -0,0 +1,127 @@
# name: test/sql/setops/test_setops.test
# description: Test UNION/EXCEPT/INTERSECT
# group: [setops]
statement ok
PRAGMA enable_verification
query I
SELECT 1 UNION ALL SELECT 2
----
1
2
query IT
SELECT 1, 'a' UNION ALL SELECT 2, 'b'
----
1 a
2 b
query IT
SELECT 1, 'a' UNION ALL SELECT 2, 'b' UNION ALL SELECT 3, 'c' order by 1
----
1 a
2 b
3 c
query IT
SELECT 1, 'a' UNION ALL SELECT 2, 'b' UNION ALL SELECT 3, 'c' UNION ALL SELECT 4, 'd' order by 1
----
1 a
2 b
3 c
4 d
# UNION/EXCEPT/INTERSECT with NULL values
query I
SELECT NULL UNION SELECT NULL
----
NULL
query I
SELECT NULL EXCEPT SELECT NULL
----
query I
SELECT NULL INTERSECT SELECT NULL
----
NULL
# create tables
statement ok
CREATE TABLE test (a INTEGER, b INTEGER);
statement ok
INSERT INTO test VALUES (11, 1), (12, 1), (13, 2)
# UNION ALL, no unique results
query I
SELECT a FROM test WHERE a < 13 UNION ALL SELECT a FROM test WHERE a = 13
----
11
12
13
query I
SELECT b FROM test WHERE a < 13 UNION ALL SELECT b FROM test WHERE a > 11
----
1
1
1
2
# mixing types, should error
query I
SELECT 1 UNION ALL SELECT 'asdf'
----
1
asdf
query T
SELECT NULL UNION ALL SELECT 'asdf'
----
NULL
asdf
# only UNION, distinct results
query I
SELECT 1 UNION SELECT 1
----
1
query IT
SELECT 1, 'a' UNION SELECT 2, 'b' UNION SELECT 3, 'c' UNION SELECT 1, 'a' order by 1
----
1 a
2 b
3 c
query I
SELECT b FROM test WHERE a < 13 UNION SELECT b FROM test WHERE a > 11 ORDER BY 1
----
1
2
# mixed fun
query IT
SELECT 1, 'a' UNION ALL SELECT 1, 'a' UNION SELECT 2, 'b' UNION SELECT 1, 'a' ORDER BY 1
----
1 a
2 b
query IT
SELECT 1, 'a' UNION ALL SELECT 1, 'a' UNION SELECT 2, 'b' UNION SELECT 1, 'a' ORDER BY 1 DESC
----
2 b
1 a
# EXCEPT ALL / INTERSECT ALL
query II
select x, count(*) as c
from ((select * from (values(1),(2),(2),(3),(3),(3),(4),(4),(4),(4)) s(x) except all select * from (values(1),(3),(3)) t(x)) intersect all select * from (values(2),(2),(2),(4),(3),(3)) u(x)) s
group by x order by x
----
2 2
3 1
4 1

View File

@@ -0,0 +1,247 @@
# name: test/sql/setops/test_union_all_by_name.test
# description: test union all by name operations
# group: [setops]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE t1 (x INT, y INT);
statement ok
INSERT INTO t1 VALUES (3, 3), (1, 1);
statement ok
CREATE TABLE t2 (y INT, z INT);
statement ok
INSERT INTO t2 VALUES (2, 2), (4, 4);
query III
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2;
----
3 3 NULL
1 1 NULL
NULL 2 2
NULL 4 4
########## test binding
query I
SELECT t1.x FROM t1 UNION ALL BY NAME SELECT x FROM t1 ORDER BY t1.x;
----
1
1
3
3
query I
SELECT x FROM t1 UNION ALL BY NAME SELECT x FROM t1 ORDER BY t1.x;
----
1
1
3
3
query II
(SELECT x FROM t1 UNION ALL SELECT x FROM t1) UNION ALL BY NAME SELECT 5 ORDER BY t1.x;
----
NULL 5
1 NULL
1 NULL
3 NULL
3 NULL
query II
(SELECT x FROM t1 UNION ALL SELECT y FROM t1) UNION ALL BY NAME SELECT 5 ORDER BY y;
----
NULL 5
1 NULL
1 NULL
3 NULL
3 NULL
statement error
SELECT x AS a FROM t1 UNION ALL BY NAME SELECT x AS b FROM t1 ORDER BY t1.x;
----
<REGEX>:Binder Error.*Ambiguous reference to column.*
# Error: Binder Error: Ambiguous name in ORDER BY!
query II
(SELECT x FROM t1 UNION ALL SELECT y FROM t1) UNION ALL BY NAME (SELECT z FROM t2 UNION ALL SELECT y FROM t2) ORDER BY y, z;
----
NULL 2
NULL 2
NULL 4
NULL 4
1 NULL
1 NULL
3 NULL
3 NULL
query II
(SELECT x FROM t1 UNION ALL SELECT y FROM t1) UNION ALL BY NAME (SELECT z FROM t2 UNION ALL SELECT y FROM t2) ORDER BY t1.y;
----
NULL 2
NULL 4
NULL 2
NULL 4
1 NULL
1 NULL
3 NULL
3 NULL
########## test limit
query III
SELECT 1 UNION ALL BY NAME SELECT * FROM range(2, 100) UNION ALL BY NAME SELECT 999 LIMIT 5;
----
1 NULL NULL
NULL 2 NULL
NULL 3 NULL
NULL 4 NULL
NULL 5 NULL
########## test order by
query III
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2 ORDER BY z DESC;
----
3 3 NULL
1 1 NULL
NULL 4 4
NULL 2 2
query III
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2 ORDER BY y;
----
1 1 NULL
NULL 2 2
3 3 NULL
NULL 4 4
query III
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2 ORDER BY 3;
----
3 3 NULL
1 1 NULL
NULL 2 2
NULL 4 4
statement error
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2 ORDER BY 4;
----
<REGEX>:Binder Error.*ORDER term out of range.*
query II
(SELECT x FROM t1 ORDER BY y) UNION ALL BY NAME (SELECT y FROM t2 ORDER BY z) ORDER BY x DESC;
----
NULL 2
NULL 4
3 NULL
1 NULL
########## multi set operations
query IIII
SELECT 1 UNION ALL BY NAME SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2;
----
1 NULL NULL NULL
NULL 3 3 NULL
NULL 1 1 NULL
NULL NULL 2 2
NULL NULL 4 4
# need to sort because our hash-based union does not preserve order
query IIII sort
SELECT 1, 2 FROM t1 UNION SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2;
----
1 1 NULL NULL
1 2 NULL NULL
3 3 NULL NULL
NULL NULL 2 2
NULL NULL 4 4
statement error
SELECT 1, 2 FROM t1 UNION (SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2);
----
<REGEX>:Binder Error:.*Set operations can only apply.*
query III
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2 INTERSECT SELECT 2, 2 FROM t1;
----
3 3 NULL
1 1 NULL
NULL 2 2
statement error
SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2 EXCEPT SELECT 2, 2 FROM t1;
----
<REGEX>:Binder Error:.*Set operations can only apply.*
# have to sort here too because EXCEPT does not preserve order
query III sort
(SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2) EXCEPT SELECT NULL, 2, 2 FROM t1;
----
1 1 NULL
3 3 NULL
NULL 4 4
########## same name in select list
statement error
SELECT x, x FROM t1 UNION ALL BY NAME SELECT y FROM t2;
----
<REGEX>:Binder Error:.*doesn't support duplicate names.*
query III
SELECT x, x as a FROM t1 UNION ALL BY NAME SELECT y FROM t2;
----
3 3 NULL
1 1 NULL
NULL NULL 2
NULL NULL 4
########## alias name in select list
query II
SELECT x as a FROM t1 UNION ALL BY NAME SELECT x FROM t1;
----
3 NULL
1 NULL
NULL 3
NULL 1
########## type cast
query I
SELECT DISTINCT ON(x) x FROM (SELECT 1 as x UNION ALL BY NAME SELECT '1' as x);
----
1
# have to sort here too because distinct on is hash-based, does not preserve order
query I sort
SELECT DISTINCT ON(x) x FROM (SELECT 1 as x UNION ALL BY NAME SELECT 1.1 as x);
----
1
1.1
########## create table as select
statement ok
CREATE TABLE new_table AS (SELECT x, y FROM t1 UNION ALL BY NAME SELECT y, z FROM t2);
query III
SELECT * FROM new_table;
----
3 3 NULL
1 1 NULL
NULL 2 2
NULL 4 4

View File

@@ -0,0 +1,289 @@
# name: test/sql/setops/test_union_binding.test
# description: Test binding parameters with union expressions
# group: [setops]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test(a INTEGER);
statement ok
CREATE TABLE test2(b INTEGER);
statement ok
INSERT INTO test VALUES (1), (2), (3), (NULL);
statement ok
INSERT INTO test2 VALUES (2), (3), (4), (NULL);
query I
(SELECT a FROM test ORDER BY a+1) UNION SELECT b FROM test2 ORDER BY 1;
----
NULL
1
2
3
4
# union returns only one column
query I
SELECT * FROM (SELECT * FROM test UNION SELECT * FROM test2) res ORDER BY 1;
----
NULL
1
2
3
4
# we can only bind by the column names of the first query
query I
SELECT a FROM (SELECT * FROM test UNION SELECT * FROM test2) res ORDER BY 1;
----
NULL
1
2
3
4
# hence this does not work: "b" is from the second query
statement error
SELECT b FROM (SELECT * FROM test UNION SELECT * FROM test2) res ORDER BY 1;
----
<REGEX>:Binder Error.*Referenced column.*not found.*
# it works if we reverse the tables
query I
SELECT b FROM (SELECT * FROM test2 UNION SELECT * FROM test) res ORDER BY 1;
----
NULL
1
2
3
4
# we can give explicit subquery aliases
query I
SELECT col1 FROM (SELECT * FROM test2 UNION SELECT * FROM test) res(col1) ORDER BY 1;
----
NULL
1
2
3
4
# we can ORDER BY names from both sides
query I
SELECT a FROM test UNION SELECT b FROM test2 ORDER BY a;
----
NULL
1
2
3
4
query I
SELECT a FROM test UNION SELECT b FROM test2 ORDER BY b;
----
NULL
1
2
3
4
# if names are ambiguous, throw an error
query II
SELECT 1, a FROM test UNION SELECT b AS a, 1 FROM test2 ORDER BY a, 1;
----
1 NULL
NULL 1
1 1
2 1
3 1
4 1
1 2
1 3
# if expressions are ambiguous as well, throw an error
statement error
SELECT 1, a+1 FROM test UNION SELECT a+1, 1 FROM test ORDER BY a+1;
----
<REGEX>:Binder Error.*Ambiguous reference to column.*
# also if we have multiple setops
query I
SELECT a FROM test UNION SELECT b FROM test2 UNION SELECT b AS c FROM test2 ORDER BY c;
----
NULL
1
2
3
4
# we can also order by the expression itself
query I
SELECT a FROM test UNION SELECT b FROM test2 UNION SELECT b + 1 FROM test2 ORDER BY b + 1;
----
NULL
1
2
3
4
5
# multiple columns order
query II
SELECT a, 10 - a AS b FROM test UNION SELECT b, b + 1 FROM test2 ORDER BY 2;
----
NULL NULL
2 3
3 4
4 5
3 7
2 8
1 9
query II
SELECT a, 10 - a AS b FROM test UNION SELECT b, b + 1 FROM test2 ORDER BY b;
----
NULL NULL
2 3
3 4
4 5
3 7
2 8
1 9
# and by constant references
query I
SELECT a FROM test UNION SELECT b FROM test2 ORDER BY 1;
----
NULL
1
2
3
4
# out of range constant reference
statement error
SELECT a FROM test UNION SELECT b FROM test2 ORDER BY 2;
----
<REGEX>:Binder Error.*ORDER term out of range.*
# what if our subqueries have an order by clause?
query I
(SELECT a FROM test ORDER BY a+1) UNION SELECT b FROM test2 ORDER BY 1;
----
NULL
1
2
3
4
# unions with SELECT * also allows orders
query I
SELECT * FROM test UNION SELECT * FROM test2 ORDER BY a;
----
NULL
1
2
3
4
query I
SELECT * FROM test UNION SELECT * FROM test2 ORDER BY b;
----
NULL
1
2
3
4
# test union with/without table specifiers
query I
SELECT a FROM test UNION SELECT * FROM test2 ORDER BY test.a;
----
NULL
1
2
3
4
query I
SELECT a FROM test UNION SELECT b FROM test2 ORDER BY test2.b;
----
NULL
1
2
3
4
query I
SELECT test.a FROM test UNION SELECT * FROM test2 ORDER BY a;
----
NULL
1
2
3
4
query I
SELECT test.a FROM test UNION SELECT test2.b FROM test2 ORDER BY b;
----
NULL
1
2
3
4
# what about multiple set ops?
query I
SELECT a FROM test UNION SELECT * FROM test2 UNION SELECT * FROM test t1 ORDER BY test.a, test2.b, t1.a;
----
NULL
1
2
3
4
query I
SELECT a FROM test UNION SELECT * FROM test2 UNION SELECT * FROM test t1 ORDER BY a;
----
NULL
1
2
3
4
# and subqueries
query I
SELECT a FROM (SELECT * FROM test) bla UNION SELECT * FROM test2 ORDER BY bla.a;
----
NULL
1
2
3
4
# what if we have cross products or joins
query II
SELECT t1.a, t2.a FROM test t1, test t2 WHERE t1.a=t2.a UNION SELECT b, b - 1 FROM test2 ORDER BY t1.a, t2.a, test2.b;
----
NULL NULL
1 1
2 1
2 2
3 2
3 3
4 3
# test union with NULLs
query TTI
SELECT NULL as a, NULL as b, 1 as id UNION SELECT CAST('2015-10-11 00:00:00' AS TIMESTAMP) as a, CAST('2015-10-11 12:34:56' AS TIMESTAMP) as b, 2 as id ORDER BY 3
----
NULL NULL 1
2015-10-11 00:00:00 2015-10-11 12:34:56 2

View File

@@ -0,0 +1,183 @@
# name: test/sql/setops/test_union_by_name.test
# description: test union by name operations
# group: [setops]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE t1 (x INT, y INT);
statement ok
INSERT INTO t1 VALUES (3, 3), (3, 3), (1, 1);
statement ok
CREATE TABLE t2 (y INT, z INT);
statement ok
INSERT INTO t2 VALUES (2, 2), (4, 4);
########## test binding
query I
SELECT t1.x FROM t1 UNION BY NAME SELECT x FROM t1 ORDER BY t1.x;
----
1
3
query I
SELECT x FROM t1 UNION BY NAME SELECT x FROM t1 ORDER BY t1.x;
----
1
3
query II
(SELECT x FROM t1 UNION ALL SELECT x FROM t1) UNION BY NAME SELECT 5 ORDER BY t1.x;
----
NULL 5
1 NULL
3 NULL
query II
(SELECT x FROM t1 UNION ALL SELECT y FROM t1) UNION BY NAME SELECT 5 ORDER BY y;
----
NULL 5
1 NULL
3 NULL
# Ambiguous name
statement error
SELECT x AS a FROM t1 UNION BY NAME SELECT x AS b FROM t1 ORDER BY t1.x;
----
<REGEX>:Binder Error.*Ambiguous reference to column.*
query II
(SELECT x FROM t1 UNION ALL SELECT y FROM t1) UNION BY NAME (SELECT z FROM t2 UNION ALL SELECT y FROM t2) ORDER BY y, z;
----
NULL 2
NULL 4
1 NULL
3 NULL
########## test limit
query III
SELECT 1 UNION BY NAME SELECT * FROM range(2, 100) UNION BY NAME SELECT 999 ORDER BY #2, #1 LIMIT 5;
----
NULL NULL 999
1 NULL NULL
NULL 2 NULL
NULL 3 NULL
NULL 4 NULL
########## test order by
query III
SELECT x, y FROM t1 UNION BY NAME SELECT y, z FROM t2 ORDER BY y;
----
1 1 NULL
NULL 2 2
3 3 NULL
NULL 4 4
query III
SELECT x, y FROM t1 UNION BY NAME SELECT y, z FROM t2 ORDER BY 3, 1;
----
1 1 NULL
3 3 NULL
NULL 2 2
NULL 4 4
statement error
SELECT x, y FROM t1 UNION BY NAME SELECT y, z FROM t2 ORDER BY 4;
----
<REGEX>:Binder Error.*out of range.*
########## multi set operations
query IIII
(SELECT 1 UNION BY NAME SELECT x, y FROM t1) UNION BY NAME SELECT y, z FROM t2 ORDER BY ALL;
----
NULL NULL 2 2
NULL NULL 4 4
NULL 1 1 NULL
NULL 3 3 NULL
1 NULL NULL NULL
query III
SELECT x, y FROM t1 UNION BY NAME (SELECT y, z FROM t2 INTERSECT SELECT 2, 2 FROM t1 ORDER BY #1) ORDER BY #1;
----
NULL 2 2
1 1 NULL
3 3 NULL
query III
(SELECT x, y FROM t1 UNION BY NAME SELECT y, z FROM t2 ORDER BY #1) EXCEPT SELECT NULL, 2, 2 FROM t1 ORDER BY #1;
----
NULL 4 4
1 1 NULL
3 3 NULL
########## same name in select list
query III
SELECT x, x as a FROM t1 UNION BY NAME SELECT y FROM t2 ORDER BY #1, #3;
----
NULL NULL 2
NULL NULL 4
1 1 NULL
3 3 NULL
########## alias name in select list
query II
SELECT x as a FROM t1 UNION BY NAME SELECT x FROM t1 ORDER BY #1, #2;
----
NULL 1
NULL 3
1 NULL
3 NULL
# union by name with different types
query I
select '0' as c union all select 0 as c;
----
0
0
query I
select '0' as c union all by name select 0 as c;
----
0
0
query I
select {'a': '0'} as c union all by name select {'a': 0} as c
----
{'a': 0}
{'a': 0}
query I
SELECT {'a': 'hello'} AS c UNION ALL BY NAME SELECT {'b': 'hello'} AS c;
----
{'a': hello, 'b': NULL}
{'a': NULL, 'b': hello}
query I
SELECT {'a': 'hello'} AS c UNION ALL BY NAME SELECT {'a': 'hello', 'b': 'world'} AS c;
----
{'a': hello, 'b': NULL}
{'a': hello, 'b': world}
query I
SELECT [{'a': 42}, {'b': 84}];
----
[{'a': 42, 'b': NULL}, {'a': NULL, 'b': 84}]

View File

@@ -0,0 +1,11 @@
# name: test/sql/setops/test_union_error.test
# description: Test error in union with cast
# group: [setops]
statement ok
PRAGMA enable_verification
statement error
SELECT x::INT FROM (SELECT x::VARCHAR x FROM range(10) tbl(x) UNION ALL SELECT 'hello' x) tbl(x);
----
<REGEX>:.*Conversion Error.*Could not convert string.*

View File

@@ -0,0 +1,28 @@
# name: test/sql/setops/test_union_except_empty.test
# description: Test order of UNION statements
# group: [setops]
statement ok
PRAGMA enable_verification
statement ok
create table t (i int);
statement ok
insert into t values (1),(2),(3),(4),(4);
query I
select i from t union select 1 where false order by 1;
----
1
2
3
4
query I
select i from t except select 1 where false order by 1;
----
1
2
3
4

View File

@@ -0,0 +1,23 @@
# name: test/sql/setops/test_union_order.test
# description: Test order of UNION statements
# group: [setops]
statement ok
PRAGMA enable_verification
query I
SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT NULL UNION ALL SELECT 3
----
1
2
NULL
3
query I
SELECT MIN(1) FROM range(10) UNION ALL SELECT MIN(2) FROM range(10) UNION ALL SELECT MIN(NULL) FROM range(10) UNION ALL SELECT MIN(3) FROM range(10)
----
1
2
NULL
3

View File

@@ -0,0 +1,16 @@
# name: test/sql/setops/test_union_subquery.test
# description: Test UNION in subquery with aliases
# group: [setops]
statement ok
CREATE TABLE t(i INTEGER)
statement ok
INSERT INTO t VALUES (42)
query II
select i, j from (select i, 1 as j from t group by i union all select i, 2 as j from t group by i) sq1
----
42 1
42 2

View File

@@ -0,0 +1,43 @@
# name: test/sql/setops/test_union_type_cast.test
# description: Test UNION type casting
# group: [setops]
statement ok
PRAGMA enable_verification
# type casting in single union
query R
SELECT 1 UNION SELECT 1.0
----
1
query R
SELECT 1 UNION ALL SELECT 1.0
----
1
1
# type casting in nested union
query R
SELECT 1 UNION (SELECT 1 UNION SELECT 1 UNION SELECT 1)
----
1
query R
SELECT 1 UNION (SELECT 1.0 UNION SELECT 1.0 UNION SELECT 1.0) UNION SELECT 1;
----
1
query R
SELECT 1 UNION ALL (SELECT 1.0 UNION ALL SELECT 1.0 UNION ALL SELECT 1.0) UNION ALL SELECT 1;
----
1
1
1
1
1
query I
SELECT 1 UNION (SELECT '1' UNION SELECT '1' UNION SELECT '1') UNION SELECT 1;
----
1

View File

@@ -0,0 +1,83 @@
# name: test/sql/setops/union_aggregate.test
# description: Test UNION aggregate
# group: [setops]
statement ok
PRAGMA enable_verification
query I
SELECT COUNT(*) FROM range(1)
UNION ALL SELECT COUNT(*) FROM range(1)
----
1
1
query I
SELECT COUNT(*) FROM range(1)
UNION ALL SELECT COUNT(*) FROM range(1)
UNION ALL SELECT COUNT(*) FROM range(1)
UNION ALL SELECT COUNT(*) FROM range(1)
UNION ALL SELECT COUNT(*) FROM range(1)
----
1
1
1
1
1
query I
SELECT COUNT(*) FROM range(1) UNION SELECT COUNT(*) FROM range(1)
----
1
query I
SELECT COUNT(*) FROM range(1)
UNION SELECT COUNT(*) FROM range(2)
ORDER BY 1
----
1
2
query I
SELECT COUNT(*) FROM range(1)
UNION SELECT COUNT(*) FROM range(2)
UNION SELECT COUNT(*) FROM range(3)
UNION SELECT COUNT(*) FROM range(4)
UNION SELECT COUNT(*) FROM range(5)
ORDER BY 1
----
1
2
3
4
5
query I
SELECT * FROM (
SELECT 1
UNION ALL
SELECT 1
) tbl(i)
----
1
1
query I
SELECT * FROM (
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
) tbl(i)
ORDER BY 1
----
1
2
3
4
5

View File

@@ -0,0 +1,83 @@
# name: test/sql/setops/union_all_projection_pushdown.test
# description: Test projection pushdown in UNION ALL
# group: [setops]
statement ok
CREATE TABLE a AS SELECT i, i+1 AS j, i+2 AS k, i+3 AS l FROM range(42,43) t(i)
statement ok
CREATE TABLE b AS SELECT i, i+1 AS j, i+2 AS k, i+3 AS l FROM range(40,41) t(i)
query I
select COUNT(*) from (SELECT * FROM a UNION ALL SELECT * FROM b) t1 join (select 43) t2(l) on t1.l=t2.l
----
1
query I
select COUNT(*) from (SELECT * FROM a UNION ALL SELECT * FROM b) t1
----
2
query I
select COUNT(*) from (SELECT i, j, MIN(k), MIN(l) FROM a GROUP BY i, j UNION ALL SELECT * FROM b) t1
----
2
query I
select COUNT(*) from (SELECT DISTINCT i, j, k, l FROM a UNION ALL SELECT * FROM b) t1
----
2
query I
select COUNT(*) from (SELECT DISTINCT * FROM (SELECT DISTINCT i, j, k, l FROM a UNION ALL SELECT * FROM b) t1) t2
----
2
# multiple unions
query I
select COUNT(*) from (SELECT * FROM a UNION ALL SELECT * FROM b UNION ALL SELECT a.i,a.j,a.k,a.l FROM a,b) t1
----
3
# union
query I
select COUNT(*) from (SELECT * FROM a UNION SELECT * FROM b UNION SELECT a.i,a.j,a.k,a.l FROM a,b) t1
----
2
# empty result
query I
select COUNT(*) from (SELECT * FROM a WHERE 1=0 UNION ALL SELECT * FROM b) t1
----
1
query I
select j from (SELECT * FROM a WHERE i=42 UNION ALL SELECT * FROM b) t1 WHERE i=40
----
41
query I
select j from (SELECT i, COUNT(*) j, COUNT(*) k, COUNT(*) l FROM a WHERE i=42 GROUP BY i UNION ALL SELECT * FROM b) t1 WHERE i=40
----
41
query I
select j from (SELECT i i, i j, k, l FROM a UNION ALL SELECT * FROM b) t1 WHERE i=40 AND j=41
----
41
query I
select * from (select 'hello' i union all select 'h' i) t1 where i='h'
----
h
query I
select COUNT(*) from (SELECT * FROM a UNION ALL SELECT * FROM b) t1 join (select 43) t2(l) on t1.l=t2.l
----
1
query I
select MIN(t2.b) from (SELECT * FROM a UNION ALL SELECT * FROM b) t1 join (select 43, 'hello', 44, 'world') t2(l, a, b, c) on t1.l=t2.l
----
44

View File

@@ -0,0 +1,194 @@
# name: test/sql/setops/union_limit.test
# description: Test union limit
# group: [setops]
statement ok
PRAGMA enable_verification
query I
SELECT 1 UNION ALL SELECT * FROM range(2, 100) UNION ALL SELECT 999 LIMIT 5;
----
1
2
3
4
5
query I
SELECT 'select count(case'a union all select 'when a='||range||' then 1' from range(100) LIMIT 5;
----
select count(case
when a=0 then 1
when a=1 then 1
when a=2 then 1
when a=3 then 1
query I
SELECT STRING_AGG(a, ' ') FROM (SELECT 'select count(case'a union all select 'when a='||range||' then 1' from range(2) union all select 'end) from t') tbl;
----
select count(case when a=0 then 1 when a=1 then 1 end) from t
query I
SELECT 'select count(case'a union all select 'when a='||range||' then 1' from range(2) union all select 'end) from t' LIMIT 5;
----
select count(case
when a=0 then 1
when a=1 then 1
end) from t
query I
SELECT 'select count(case'a union all select 'when a='||range||' then 1' from range(100) union all select 'end) from t' LIMIT 5;
----
select count(case
when a=0 then 1
when a=1 then 1
when a=2 then 1
when a=3 then 1
query I
SELECT 1
UNION ALL
(
SELECT * FROM generate_series(10, 12, 1)
UNION ALL
(
SELECT * FROM generate_series(100, 103, 1)
)
UNION ALL
SELECT * FROM generate_series(1000, 1002, 1)
)
UNION ALL
SELECT * FROM generate_series(10000, 10002, 1)
UNION ALL
(
SELECT * FROM generate_series(100000, 100002, 1)
UNION ALL
SELECT * FROM generate_series(1000000, 1000003, 1)
);
----
1
10
11
12
100
101
102
103
1000
1001
1002
10000
10001
10002
100000
100001
100002
1000000
1000001
1000002
1000003
query I
SELECT ARRAY_AGG(1)
UNION ALL
(
SELECT ARRAY_AGG(i) FROM generate_series(10, 12, 1) tbl(i)
UNION ALL
(
SELECT ARRAY_AGG(i) FROM generate_series(100, 103, 1) tbl(i)
)
UNION ALL
SELECT ARRAY_AGG(i) FROM generate_series(1000, 1002, 1) tbl(i)
)
UNION ALL
SELECT ARRAY_AGG(i) FROM generate_series(10000, 10002, 1) tbl(i)
UNION ALL
(
SELECT ARRAY_AGG(i) FROM generate_series(100000, 100002, 1) tbl(i)
UNION ALL
SELECT ARRAY_AGG(i) FROM generate_series(1000000, 1000003, 1) tbl(i)
);
----
[1]
[10, 11, 12]
[100, 101, 102, 103]
[1000, 1001, 1002]
[10000, 10001, 10002]
[100000, 100001, 100002]
[1000000, 1000001, 1000002, 1000003]
query I
SELECT 1
UNION ALL
(
SELECT * FROM generate_series(10, 12, 1)
UNION ALL
(
SELECT * FROM generate_series(100, 103, 1)
)
UNION ALL
SELECT * FROM generate_series(1000, 1002, 1)
)
UNION ALL
SELECT * FROM generate_series(10000, 10002, 1)
UNION ALL
(
SELECT * FROM generate_series(100000, 100002, 1)
UNION ALL
SELECT * FROM generate_series(1000000, 1000003, 1)
)
LIMIT 1000;
----
1
10
11
12
100
101
102
103
1000
1001
1002
10000
10001
10002
100000
100001
100002
1000000
1000001
1000002
1000003
query I
SELECT ARRAY_AGG(1)
UNION ALL
(
SELECT ARRAY_AGG(i) FROM generate_series(10, 12, 1) tbl(i)
UNION ALL
(
SELECT ARRAY_AGG(i) FROM generate_series(100, 103, 1) tbl(i)
)
UNION ALL
SELECT ARRAY_AGG(i) FROM generate_series(1000, 1002, 1) tbl(i)
)
UNION ALL
SELECT ARRAY_AGG(i) FROM generate_series(10000, 10002, 1) tbl(i)
UNION ALL
(
SELECT ARRAY_AGG(i) FROM generate_series(100000, 100002, 1) tbl(i)
UNION ALL
SELECT ARRAY_AGG(i) FROM generate_series(1000000, 1000003, 1) tbl(i)
)
LIMIT 1000;
----
[1]
[10, 11, 12]
[100, 101, 102, 103]
[1000, 1001, 1002]
[10000, 10001, 10002]
[100000, 100001, 100002]
[1000000, 1000001, 1000002, 1000003]

View File

@@ -0,0 +1,21 @@
# name: test/sql/setops/union_pipeline.test
# description: Test union pipelines
# group: [setops]
query I
SELECT COUNT(*) FROM (SELECT * FROM range(1000000) tbl(i) UNION ALL SELECT * FROM range(1000000) tbl(i)) tbl(i)
----
2000000
statement ok
CREATE TABLE t1 AS SELECT COUNT(*) FROM (SELECT * FROM range(1000000) tbl(i) UNION ALL SELECT * FROM range(1000000) tbl(i)) tbl(i)
query I
SELECT * FROM t1
----
2000000
query I
SELECT COUNT(*) FROM (SELECT * FROM range(1000000) tbl(i) UNION ALL SELECT * FROM range(1000000) tbl(i) UNION ALL SELECT * FROM range(1000000) tbl(i) UNION ALL SELECT * FROM range(1000000) tbl(i) UNION ALL SELECT * FROM range(1000000) tbl(i)) tbl(i)
----
5000000

View File

@@ -0,0 +1,27 @@
# name: test/sql/setops/union_shared_scan.test
# description: Test shared scan over a union
# group: [setops]
statement ok
PRAGMA threads=4
statement ok
PRAGMA verify_parallelism
statement ok
CREATE TABLE tbl AS SELECT * FROM range(10000) tbl(i) UNION ALL SELECT NULL
query I
SELECT SUM(i) FROM tbl
UNION ALL
SELECT COUNT(i) FROM tbl
UNION ALL
SELECT AVG(i) FROM tbl
UNION ALL
SELECT AVG(i) + SUM(i) FROM tbl
ORDER BY 1
----
4999.5
10000.0
49995000.0
49999999.5

View File

@@ -0,0 +1,67 @@
# name: test/sql/setops/value_union.test
# description: Test union of VALUES
# group: [setops]
statement ok
PRAGMA enable_verification
statement ok
CREATE VIEW vals AS SELECT * FROM (VALUES (1, 10), (2, 5), (3, 4)) tbl(i, j);
query II
SELECT * FROM vals
----
1 10
2 5
3 4
statement ok
CREATE VIEW vunion AS
SELECT * FROM vals
UNION ALL
SELECT * FROM vals;
query II
SELECT * FROM vunion ORDER BY i
----
1 10
1 10
2 5
2 5
3 4
3 4
query II
SELECT * FROM vunion ORDER BY i LIMIT 1
----
1 10
query II
SELECT * FROM (SELECT * FROM vunion ORDER BY i LIMIT 4) tbl ORDER BY j LIMIT 2
----
2 5
2 5
query II
SELECT * FROM vunion WHERE i=1
----
1 10
1 10
query II
SELECT DISTINCT * FROM (SELECT * FROM vunion UNION ALL SELECT * FROM vunion) tbl ORDER BY 1
----
1 10
2 5
3 4
query II
SELECT * FROM (SELECT * FROM vunion INTERSECT SELECT * FROM vunion) tbl ORDER BY 1;
----
1 10
2 5
3 4
query II
SELECT * FROM (SELECT * FROM vunion EXCEPT SELECT * FROM vunion) tbl
----