# 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; ---- :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; ---- :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