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,26 @@
# name: test/sql/join/full_outer/full_outer_join_cache.test
# description: Test full outer join with caches
# group: [full_outer]
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
CREATE TABLE smalltable AS SELECT 1::INTEGER a;
# values 1...1024 10x
statement ok
CREATE TABLE bigtable AS SELECT a::INTEGER a FROM generate_series(0, 9999, 1) tbl(a), generate_series(0, 9, 1) tbl2(b);
query I
SELECT COUNT(*) FROM bigtable FULL OUTER JOIN smalltable USING (a)
----
100000
query I
SELECT COUNT(*) FROM bigtable RIGHT OUTER JOIN smalltable USING (a)
----
10

View File

@@ -0,0 +1,106 @@
# name: test/sql/join/full_outer/full_outer_join_union.test
# description: Test FULL OUTER JOIN with unions
# group: [full_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER);
statement ok
INSERT INTO integers VALUES (1, 1), (3, 3);
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER);
statement ok
INSERT INTO integers2 VALUES (1, 10), (2, 20);
# equality join
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION ALL
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
ORDER BY i
----
NULL NULL 2 20
NULL NULL 2 20
1 1 1 10
1 1 1 10
3 3 NULL NULL
3 3 NULL NULL
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
ORDER BY i
----
NULL NULL 2 20
1 1 1 10
3 3 NULL NULL
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION
SELECT i+1, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION
SELECT i+2, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION
SELECT i+3, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION
SELECT i+4, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
ORDER BY 1,2,3,4
----
NULL NULL 2 20
1 1 1 10
2 1 1 10
3 1 1 10
3 3 NULL NULL
4 1 1 10
4 3 NULL NULL
5 1 1 10
5 3 NULL NULL
6 3 NULL NULL
7 3 NULL NULL
query IIII
SELECT DISTINCT * FROM (
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION ALL
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k) tbl
ORDER BY i
----
NULL NULL 2 20
1 1 1 10
3 3 NULL NULL
# many unions/full outer joins with views
statement ok
CREATE VIEW v1 AS
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
UNION ALL
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
query IIIIII
SELECT * FROM v1 FULL OUTER JOIN v1 v2 USING (i, j) ORDER BY 1, 2, 3, 4, 5, 6
----
NULL NULL NULL NULL 2 20
NULL NULL NULL NULL 2 20
NULL NULL 2 20 NULL NULL
NULL NULL 2 20 NULL NULL
1 1 1 10 1 10
1 1 1 10 1 10
1 1 1 10 1 10
1 1 1 10 1 10
3 3 NULL NULL NULL NULL
3 3 NULL NULL NULL NULL
3 3 NULL NULL NULL NULL
3 3 NULL NULL NULL NULL

View File

@@ -0,0 +1,57 @@
# name: test/sql/join/full_outer/test_full_outer_join.test
# description: Test FULL OUTER JOIN
# group: [full_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER)
statement ok
INSERT INTO integers VALUES (1, 1), (3, 3)
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER)
statement ok
INSERT INTO integers2 VALUES (1, 10), (2, 20)
# equality join
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k ORDER BY i
----
NULL NULL 2 20
1 1 1 10
3 3 NULL NULL
# equality join with additional non-equality predicate
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k AND integers.j > integers2.l ORDER BY 1, 2, 3, 4
----
NULL NULL 1 10
NULL NULL 2 20
1 1 NULL NULL
3 3 NULL NULL
# equality join with varchar values
query IIIT
SELECT i, j, k, l FROM integers FULL OUTER JOIN (SELECT k, l::VARCHAR AS l FROM integers2) integers2 ON integers.i=integers2.k ORDER BY 1, 2, 3, 4
----
NULL NULL 2 20
1 1 1 10
3 3 NULL NULL
# empty RHS
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN (SELECT * FROM integers2 WHERE 1=0) integers2 ON integers.i=integers2.k ORDER BY 1, 2, 3, 4
----
1 1 NULL NULL
3 3 NULL NULL

View File

@@ -0,0 +1,37 @@
# name: test/sql/join/full_outer/test_full_outer_join_complex.test
# description: Test complex FULL OUTER JOIN
# group: [full_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER)
statement ok
INSERT INTO integers VALUES (1, 1)
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER)
statement ok
INSERT INTO integers2 VALUES (1, 10)
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i+integers2.k+9<>integers.j+integers2.l ORDER BY 1, 2, 3, 4
----
NULL NULL 1 10
1 1 NULL NULL
# empty RHS
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN (SELECT * FROM integers2 WHERE 1=0) integers2 ON integers.i+integers2.k+9<>integers.j+integers2.l ORDER BY 1, 2, 3, 4
----
1 1 NULL NULL

View File

@@ -0,0 +1,37 @@
# name: test/sql/join/full_outer/test_full_outer_join_inequality.test
# description: Test inequality FULL OUTER JOIN
# group: [full_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER)
statement ok
INSERT INTO integers VALUES (1, 1)
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER)
statement ok
INSERT INTO integers2 VALUES (1, 10)
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i<>integers2.k ORDER BY 1, 2, 3, 4
----
NULL NULL 1 10
1 1 NULL NULL
# empty RHS
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN (SELECT * FROM integers2 WHERE 1=0) integers2 ON integers.i<>integers2.k ORDER BY 1, 2, 3, 4
----
1 1 NULL NULL

View File

@@ -0,0 +1,173 @@
# name: test/sql/join/full_outer/test_full_outer_join_issue_4252.test
# description: Test Issue: 4252
# group: [full_outer]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (x INT, y INT);
statement ok
INSERT INTO test VALUES (1, 1), (2, 2), (3, 3);
query II
SELECT * FROM (SELECT a2.x FROM (SELECT x FROM test WHERE x > 3) AS a1 FULL OUTER JOIN (SELECT x FROM test WHERE x = 1) AS a2 ON a1.x = a2.x) AS a3 FULL OUTER JOIN (SELECT 1 AS x) AS a4 ON a3.x = a4.x;
----
1 1
statement ok
CREATE TABLE df1(day DATE, value INTEGER, organization VARCHAR);
INSERT INTO df1 VALUES
('2022-01-01', 10, 'org1'),
('2022-01-05', 20, 'org2'),
('2022-01-10', 30, 'org3');
statement ok
CREATE TABLE df2(day DATE, value INTEGER, organization VARCHAR);
INSERT INTO df2 VALUES
('2022-01-01', 100, 'org1'),
('2022-09-01', 200, 'org2'),
('2022-03-01', 300, 'org3');
statement ok
CREATE TABLE df3(day DATE, value INTEGER, organization VARCHAR);
INSERT INTO df3 VALUES
('2022-01-02', 1000, 'org1'),
('2022-02-03', 2000, 'org2'),
('2022-04-01', 3000, 'org3');
query II
SELECT
coalesce(anon_1.month, anon_2.month) AS month,
coalesce(coalesce(CAST(anon_1.value AS REAL), 0.0) + coalesce(CAST(anon_2.value AS REAL), 0.0), 0.0) AS value
FROM (
SELECT coalesce(anon_3.month, anon_4.month) AS month,
coalesce(coalesce(CAST(anon_3.value AS REAL), 0.0) + coalesce(CAST(anon_4.value AS REAL), 0.0), 0.0) AS value
FROM (
SELECT month AS month, sum(anon_5.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df1
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
AND (organization ILIKE 'org4')
GROUP BY date_trunc('month', day)
) AS anon_5
GROUP BY GROUPING SETS((month))
) AS anon_3
FULL OUTER JOIN (
SELECT month AS month, sum(anon_6.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df2
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
GROUP BY date_trunc('month', day)
) AS anon_6
GROUP BY GROUPING SETS((month))
) AS anon_4 ON anon_3.month = anon_4.month
) AS anon_1
FULL OUTER JOIN (
SELECT month AS month, sum(anon_7.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df3
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
GROUP BY date_trunc('month', day)
) AS anon_7
GROUP BY GROUPING SETS((month))
) AS anon_2 ON anon_1.month = anon_2.month
----
2022-01-01 1100.0
query II
SELECT
coalesce(anon_1.month, anon_2.month) AS month,
coalesce(coalesce(CAST(anon_1.value AS REAL), 0.0) + coalesce(CAST(anon_2.value AS REAL), 0.0), 0.0) AS value
FROM (
SELECT coalesce(anon_3.month, anon_4.month) AS month,
coalesce(coalesce(CAST(anon_3.value AS REAL), 0.0) + coalesce(CAST(anon_4.value AS REAL), 0.0), 0.0) AS value
FROM (
SELECT month AS month, sum(anon_5.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df1
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
AND (organization ILIKE 'org1')
GROUP BY date_trunc('month', day)
) AS anon_5
GROUP BY GROUPING SETS((month))
) AS anon_3
FULL OUTER JOIN (
SELECT month AS month, sum(anon_6.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df2
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
GROUP BY date_trunc('month', day)
) AS anon_6
GROUP BY GROUPING SETS((month))
) AS anon_4 ON anon_3.month = anon_4.month
) AS anon_1
FULL OUTER JOIN (
SELECT month AS month, sum(anon_7.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df3
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
GROUP BY date_trunc('month', day)
) AS anon_7
GROUP BY GROUPING SETS((month))
) AS anon_2 ON anon_1.month = anon_2.month
----
2022-01-01 1110.0
query II
SELECT
coalesce(anon_1.month, anon_2.month) AS month,
coalesce(coalesce(CAST(anon_1.value AS REAL), 0.0) + coalesce(CAST(anon_2.value AS REAL), 0.0), 0.0) AS value
FROM (
SELECT coalesce(anon_3.month, anon_4.month) AS month,
coalesce(coalesce(CAST(anon_3.value AS REAL), 0.0) + coalesce(CAST(anon_4.value AS REAL), 0.0), 0.0) AS value
FROM (
SELECT month AS month, sum(anon_6.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df2
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
GROUP BY date_trunc('month', day)
) AS anon_6
GROUP BY GROUPING SETS((month))
) AS anon_3
FULL OUTER JOIN (
SELECT month AS month, sum(anon_5.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df1
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
AND (organization ILIKE 'org4')
GROUP BY date_trunc('month', day)
) AS anon_5
GROUP BY GROUPING SETS((month))
) AS anon_4 ON anon_3.month = anon_4.month
) AS anon_1
FULL OUTER JOIN (
SELECT month AS month, sum(anon_7.value) AS value
FROM (
SELECT date_trunc('month', day) AS month, coalesce(sum(value), 0.0) AS value
FROM df3
WHERE day >= CAST('2022-01-01 00:00:00' AS DATE)
AND day <= CAST('2022-01-31 00:00:00' AS DATE)
GROUP BY date_trunc('month', day)
) AS anon_7
GROUP BY GROUPING SETS((month))
) AS anon_2 ON anon_1.month = anon_2.month
----
2022-01-01 1100.0

View File

@@ -0,0 +1,65 @@
# name: test/sql/join/full_outer/test_full_outer_join_many_matches.test_slow
# description: Test FULL OUTER JOIN with many matches
# group: [full_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
PRAGMA verify_parallelism
statement ok
PRAGMA verify_external
statement ok
CREATE TABLE integers AS SELECT a i, 1 j FROM generate_series(0, 1999, 1) t1(a);
statement ok
CREATE TABLE integers2 AS SELECT a k, 2 l FROM generate_series(2000, 3999, 1) t1(a);
# equality join
query I
SELECT COUNT(*) FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k
----
4000
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.k ORDER BY 1, 2, 3, 4
----
16000 values hashing to 8b9eab043624ff470b00a981c1d588d9
# range join
query I
SELECT COUNT(*) FROM integers FULL OUTER JOIN integers2 ON integers.j>integers2.l
----
4000
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.j>integers2.l ORDER BY 1, 2, 3, 4
----
16000 values hashing to 8b9eab043624ff470b00a981c1d588d9
# inequality join
query I
SELECT COUNT(*) FROM integers FULL OUTER JOIN integers2 ON integers.j+1<>integers2.l;
----
4000
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.j+1<>integers2.l ORDER BY 1, 2, 3, 4
----
16000 values hashing to 8b9eab043624ff470b00a981c1d588d9
# complex join condition
query I
SELECT COUNT(*) FROM integers FULL OUTER JOIN integers2 ON integers.j+integers2.l<>3;
----
4000
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.j+integers2.l<>3 ORDER BY 1, 2, 3, 4
----
16000 values hashing to 8b9eab043624ff470b00a981c1d588d9

View File

@@ -0,0 +1,41 @@
# name: test/sql/join/full_outer/test_full_outer_join_parallel.test_slow
# description: Test full outer join with parallelism
# group: [full_outer]
statement ok
PRAGMA enable_verification
statement ok
PRAGMA threads=4
statement ok
PRAGMA verify_parallelism
statement ok
pragma verify_external
statement ok
CREATE TABLE integers AS SELECT * FROM range(75000) tbl(i);
statement ok
CREATE TABLE integers2 AS SELECT * FROM range(100000) tbl(i) WHERE i%2 != 0;
query I
SELECT COUNT(*) FROM integers JOIN integers2 ON integers.i=integers2.i
----
37500
query I
SELECT COUNT(*) FROM integers LEFT OUTER JOIN integers2 ON integers.i=integers2.i
----
75000
query I
SELECT COUNT(*) FROM integers RIGHT OUTER JOIN integers2 ON integers.i=integers2.i
----
50000
query I
SELECT COUNT(*) FROM integers FULL OUTER JOIN integers2 ON integers.i=integers2.i
----
87500

View File

@@ -0,0 +1,38 @@
# name: test/sql/join/full_outer/test_full_outer_join_range.test
# description: Test range FULL OUTER JOIN
# group: [full_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER)
statement ok
INSERT INTO integers VALUES (1, 1)
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER)
statement ok
INSERT INTO integers2 VALUES (1, 10)
# range join
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN integers2 ON integers.i<integers2.k ORDER BY 1, 2, 3, 4
----
NULL NULL 1 10
1 1 NULL NULL
# empty RHS
query IIII
SELECT i, j, k, l FROM integers FULL OUTER JOIN (SELECT * FROM integers2 WHERE 1=0) integers2 ON integers.i<integers2.k ORDER BY 1, 2, 3, 4
----
1 1 NULL NULL