should be it
This commit is contained in:
15
external/duckdb/test/sql/setops/ambiguous_order_by.test
vendored
Normal file
15
external/duckdb/test/sql/setops/ambiguous_order_by.test
vendored
Normal 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
|
||||
50
external/duckdb/test/sql/setops/setops_pushdown.test
vendored
Normal file
50
external/duckdb/test/sql/setops/setops_pushdown.test
vendored
Normal 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
|
||||
----
|
||||
27
external/duckdb/test/sql/setops/test_except.test
vendored
Normal file
27
external/duckdb/test/sql/setops/test_except.test
vendored
Normal 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
|
||||
|
||||
92
external/duckdb/test/sql/setops/test_full_outer_join_union.test
vendored
Normal file
92
external/duckdb/test/sql/setops/test_full_outer_join_union.test
vendored
Normal 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
|
||||
31
external/duckdb/test/sql/setops/test_joins_under_setops.test_slow
vendored
Normal file
31
external/duckdb/test/sql/setops/test_joins_under_setops.test_slow
vendored
Normal 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
|
||||
|
||||
27
external/duckdb/test/sql/setops/test_nested_except.test
vendored
Normal file
27
external/duckdb/test/sql/setops/test_nested_except.test
vendored
Normal 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
|
||||
|
||||
41
external/duckdb/test/sql/setops/test_parallel_union.test_slow
vendored
Normal file
41
external/duckdb/test/sql/setops/test_parallel_union.test_slow
vendored
Normal 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
|
||||
482
external/duckdb/test/sql/setops/test_pg_union.test
vendored
Normal file
482
external/duckdb/test/sql/setops/test_pg_union.test
vendored
Normal 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
|
||||
127
external/duckdb/test/sql/setops/test_setops.test
vendored
Normal file
127
external/duckdb/test/sql/setops/test_setops.test
vendored
Normal 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
|
||||
247
external/duckdb/test/sql/setops/test_union_all_by_name.test
vendored
Normal file
247
external/duckdb/test/sql/setops/test_union_all_by_name.test
vendored
Normal 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
|
||||
289
external/duckdb/test/sql/setops/test_union_binding.test
vendored
Normal file
289
external/duckdb/test/sql/setops/test_union_binding.test
vendored
Normal 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
|
||||
|
||||
183
external/duckdb/test/sql/setops/test_union_by_name.test
vendored
Normal file
183
external/duckdb/test/sql/setops/test_union_by_name.test
vendored
Normal 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}]
|
||||
11
external/duckdb/test/sql/setops/test_union_error.test
vendored
Normal file
11
external/duckdb/test/sql/setops/test_union_error.test
vendored
Normal 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.*
|
||||
28
external/duckdb/test/sql/setops/test_union_except_empty.test
vendored
Normal file
28
external/duckdb/test/sql/setops/test_union_except_empty.test
vendored
Normal 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
|
||||
23
external/duckdb/test/sql/setops/test_union_order.test
vendored
Normal file
23
external/duckdb/test/sql/setops/test_union_order.test
vendored
Normal 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
|
||||
|
||||
16
external/duckdb/test/sql/setops/test_union_subquery.test
vendored
Normal file
16
external/duckdb/test/sql/setops/test_union_subquery.test
vendored
Normal 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
|
||||
|
||||
43
external/duckdb/test/sql/setops/test_union_type_cast.test
vendored
Normal file
43
external/duckdb/test/sql/setops/test_union_type_cast.test
vendored
Normal 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
|
||||
83
external/duckdb/test/sql/setops/union_aggregate.test
vendored
Normal file
83
external/duckdb/test/sql/setops/union_aggregate.test
vendored
Normal 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
|
||||
83
external/duckdb/test/sql/setops/union_all_projection_pushdown.test
vendored
Normal file
83
external/duckdb/test/sql/setops/union_all_projection_pushdown.test
vendored
Normal 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
|
||||
194
external/duckdb/test/sql/setops/union_limit.test
vendored
Normal file
194
external/duckdb/test/sql/setops/union_limit.test
vendored
Normal 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]
|
||||
21
external/duckdb/test/sql/setops/union_pipeline.test
vendored
Normal file
21
external/duckdb/test/sql/setops/union_pipeline.test
vendored
Normal 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
|
||||
27
external/duckdb/test/sql/setops/union_shared_scan.test
vendored
Normal file
27
external/duckdb/test/sql/setops/union_shared_scan.test
vendored
Normal 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
|
||||
67
external/duckdb/test/sql/setops/value_union.test
vendored
Normal file
67
external/duckdb/test/sql/setops/value_union.test
vendored
Normal 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
|
||||
----
|
||||
Reference in New Issue
Block a user