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,139 @@
# name: test/sql/join/left_outer/left_join_issue_1172.test
# description: Left Outer join dropping rows
# group: [left_outer]
statement ok
SET default_null_order='nulls_first';
statement ok
PRAGMA enable_verification
statement ok
pragma verify_external
statement ok
drop table if exists t1;
statement ok
drop table if exists t2;
statement ok
create table t1 (id string);
statement ok
create table t2 (id string);
statement ok
insert into t1 values
(NULL);
statement ok
insert into t2 values (1), (1);
query II
select * from t1 left join t2 on t1.id = t2.id;
----
NULL NULL
query II
select * from t1 left join t2 on t1.id > t2.id;
----
NULL NULL
query II
select * from t1 left join t2 on t1.id <> t2.id;
----
NULL NULL
statement ok
insert into t2 values (1);
query II
select * from t1 left join t2 on t1.id = t2.id;
----
NULL NULL
query II
select * from t1 left join t2 on t1.id > t2.id;
----
NULL NULL
query II
select * from t1 left join t2 on t1.id <> t2.id;
----
NULL NULL
statement ok
insert into t2 values (NULL), (NULL);
query II
select * from t1 left join t2 on t1.id = t2.id;
----
NULL NULL
query II
select * from t1 left join t2 on t1.id > t2.id;
----
NULL NULL
query II
select * from t1 left join t2 on t1.id <> t2.id;
----
NULL NULL
statement ok
drop table if exists t1;
statement ok
drop table if exists t2;
statement ok
create table t1 (id string);
statement ok
create table t2 (id string);
statement ok
insert into t1 (id) values (1), (1), (NULL);
statement ok
insert into t2 (id) values (1), (1), (1), (1), (1), (1);
query II
select * from t1 left join t2 on t1.id = t2.id order by 1, 2;
----
NULL NULL
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
statement ok
insert into t2 (id) values (1);
query II
select * from t1 left join t2 on t1.id = t2.id order by 1, 2;
----
NULL NULL
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1

View File

@@ -0,0 +1,53 @@
# name: test/sql/join/left_outer/left_join_issue_15316.test
# description: Issue #15316: Left join should strip tree if filter statically evaluates to false
# group: [left_outer]
statement ok
set explain_output='optimized_only';
statement ok
PRAGMA enable_verification
statement ok
CREATE OR REPLACE TABLE big_table AS
SELECT i.range AS col1,
CAST(random() * 1000 AS INTEGER) AS col2
FROM range(100) i;
statement ok
CREATE OR REPLACE TABLE single_col_table AS
SELECT i.range AS col1
FROM range(50) i;
query II
explain SELECT *
FROM big_table c
LEFT OUTER JOIN single_col_table hd ON hd.col1=c.col1
AND (
FALSE
);
----
logical_opt <REGEX>:.*CROSS_PRODUCT.*
# RHS contains multiple tables
statement ok
CREATE TABLE integers1 AS SELECT * FROM (VALUES (1), (2), (3)) tbl(i);
statement ok
CREATE TABLE integers2 AS SELECT * FROM (VALUES (1, '1'), (2, '2'), (3, '3')) tbl(i, s);
statement ok
CREATE TABLE integers3 AS SELECT * FROM (VALUES (1, '4'), (2, '5'), (3, '6')) tbl(i, s);
query III
SELECT
i1.i AS i1_i,
i2.s,
i3.i AS i3_i
FROM
integers1 i1
LEFT OUTER JOIN (integers2 i2 LEFT OUTER JOIN integers3 i3 ON i2.i = i3.i) on false;
----
1 NULL NULL
2 NULL NULL
3 NULL NULL

View File

@@ -0,0 +1,37 @@
# name: test/sql/join/left_outer/left_join_issue_6341.test
# description: Issue #6341: No rows returned in LEFT JOIN with < or > against table having no rows
# group: [left_outer]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE foo (ts TIMESTAMP);
statement ok
CREATE TABLE bar (ts TIMESTAMP);
statement ok
INSERT INTO foo VALUES ('2023-01-01 00:00:00');
statement ok
INSERT INTO foo VALUES ('2023-01-01 00:00:01');
query II rowsort
SELECT foo.ts foo, bar.ts bar FROM foo LEFT JOIN bar ON foo.ts = bar.ts;
----
2023-01-01 00:00:00 NULL
2023-01-01 00:00:01 NULL
query II rowsort
SELECT foo.ts foo, bar.ts bar FROM foo LEFT JOIN bar ON foo.ts < bar.ts;
----
2023-01-01 00:00:00 NULL
2023-01-01 00:00:01 NULL
query II rowsort
SELECT foo.ts foo, bar.ts bar FROM foo LEFT JOIN bar ON foo.ts > bar.ts;
----
2023-01-01 00:00:00 NULL
2023-01-01 00:00:01 NULL

View File

@@ -0,0 +1,47 @@
# name: test/sql/join/left_outer/left_join_issue_7905.test
# description: Issue #7905: DuckDB fails with INTERNAL Error: Logical column index 11 out of range
# group: [left_outer]
statement ok
CREATE TABLE a(a1 VARCHAR);
statement ok
CREATE TABLE b(
b1 VARCHAR,
b2 TIMESTAMP,
b3 TIMESTAMP,
b4 VARCHAR,
b5 VARCHAR,
b6 VARCHAR,
b7 TIMESTAMP,
b8 TIMESTAMP,
b9 VARCHAR,
b10 VARCHAR,
b11 VARCHAR,
b12 VARCHAR,
b13 VARCHAR,
b14 VARCHAR,
);
statement ok
INSERT INTO b VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
statement ok
CREATE TABLE c(
c1 VARCHAR,
);
statement ok
CREATE TABLE d(
d1 VARCHAR,
d2 VARCHAR,
);
statement ok
SELECT *
FROM a
LEFT JOIN b ON b.b14 = a.a1
LEFT JOIN c ON b.b13 = c.c1
LEFT JOIN d ON b.b12 = d.d1
WHERE d.d2 IN ('');

View File

@@ -0,0 +1,9 @@
# name: test/sql/join/left_outer/non_foldable_left_join.test
# description: Left Outer join with non-foldable filter on RHS
# group: [left_outer]
statement ok
PRAGMA enable_verification
statement ok
select * from range(1) tbl(i) left join range(2) tbl2(j) on (i=j) where j+random()<0;

View File

@@ -0,0 +1,124 @@
# name: test/sql/join/left_outer/test_left_join_on_true.test
# description: Test ON TRUE join conditions
# group: [left_outer]
query II
WITH t AS (
SELECT 1 AS r, [{n:1}, {n:2}] AS s
UNION
SELECT 2 AS r, [{n:3}, {n:4}] AS s
)
SELECT r, s1.s.n FROM t
LEFT JOIN UNNEST(s) AS s1(s) ON TRUE
ORDER BY 1, 2
----
1 1
1 2
2 3
2 4
query II
WITH t AS (
SELECT 1 AS r, ARRAY[1, 2, 3] AS a
UNION SELECT 2 AS r, ARRAY[4] AS a
UNION SELECT 4 AS r, ARRAY[] AS a
)
SELECT r, a.value
FROM t
LEFT JOIN UNNEST(a) AS a(value) ON TRUE
ORDER BY 1, 2
----
1 1
1 2
1 3
2 4
4 NULL
# more than one condition
query II
WITH t AS (
SELECT 1 AS r, ARRAY[1, 2, 3] AS a
UNION SELECT 2 AS r, ARRAY[4] AS a
UNION SELECT 4 AS r, ARRAY[]::INTEGER[] AS a
)
SELECT r, a.value
FROM t
LEFT JOIN UNNEST(a) AS a(value) ON TRUE AND a.value IS NULL
ORDER BY 1, 2
----
1 NULL
2 NULL
4 NULL
query II
WITH t AS (
SELECT 1 AS r, ARRAY[1, 2, 3] AS a
UNION SELECT 2 AS r, ARRAY[4] AS a
UNION SELECT 4 AS r, ARRAY[] AS a
)
SELECT r, a.value
FROM t
LEFT JOIN UNNEST(a) AS a(value) ON (1 = 1) AND TRUE AND list_contains([2, 3], 2)
ORDER BY 1, 2
----
1 1
1 2
1 3
2 4
4 NULL
# non-true constant expressions cause a binder error
statement error
WITH t AS (
SELECT 1 AS r, [{n:1}, {n:2}] AS s
UNION
SELECT 2 AS r, [{n:3}, {n:4}] AS s
)
SELECT r, s1.s.n FROM t
LEFT JOIN UNNEST(s) AS s1(s) ON FALSE
----
Binder Error: Join condition for non-inner LATERAL JOIN must be a comparison between the left and right side
# test non-lateral left joins
statement ok
CREATE TABLE integers(i INTEGER, j INTEGER)
statement ok
INSERT INTO integers VALUES (1, 2), (2, 3), (3, 4)
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER)
statement ok
INSERT INTO integers2 VALUES (1, 10), (2, 20)
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON TRUE AND integers.i=integers2.k AND TRUE ORDER BY i
----
1 2 1 10
2 3 2 20
3 4 NULL NULL
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON TRUE AND integers.i=integers2.k AND FALSE ORDER BY i
----
1 2 NULL NULL
2 3 NULL NULL
3 4 NULL NULL
# this is just a cross product
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON TRUE ORDER BY i
----
1 2 1 10
1 2 2 20
2 3 1 10
2 3 2 20
3 4 1 10
3 4 2 20

View File

@@ -0,0 +1,183 @@
# name: test/sql/join/left_outer/test_left_outer.test
# description: Test LEFT OUTER JOIN
# group: [left_outer]
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, 2), (2, 3), (3, 4)
statement ok
CREATE TABLE integers2(k INTEGER, l INTEGER)
statement ok
INSERT INTO integers2 VALUES (1, 10), (2, 20)
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON integers.i=integers2.k ORDER BY i
----
1 2 1 10
2 3 2 20
3 4 NULL NULL
# RIGHT OUTER JOIN is just LEFT OUTER JOIN but with arguments reversed
# with one caveat: SELECT * will project the columns of the LHS first!
query IIII
SELECT * FROM integers2 RIGHT OUTER JOIN integers ON integers.i=integers2.k ORDER BY i
----
1 10 1 2
2 20 2 3
NULL NULL 3 4
# WHERE happens AFTER the join, thus [where k IS NOT NULL] filters out any tuples with generated NULL values from
# the LEFT OUTER JOIN. Because of this, this join is equivalent to an inner join.
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON integers.i=integers2.k WHERE k IS NOT NULL ORDER BY i
----
1 2 1 10
2 3 2 20
# however, any conditions in the ON clause happen BEFORE the join, thus the condition [integers2.k IS NOT NULL]
# happens BEFORE any NULL values are generated by the LEFT OUTER JOIN.
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON integers.i=integers2.k AND integers2.k IS NOT NULL ORDER BY i
----
1 2 1 10
2 3 2 20
3 4 NULL NULL
# filter on LHS
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON i=1 ORDER BY i, k;
----
1 2 1 10
1 2 2 20
2 3 NULL NULL
3 4 NULL NULL
# left outer join on "true" is cross product
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON 1=1 ORDER BY i, k;
----
1 2 1 10
1 2 2 20
2 3 1 10
2 3 2 20
3 4 1 10
3 4 2 20
# except if RHS is empty; then it is the LHS with NULl values appended
query IIII
SELECT * FROM integers LEFT OUTER JOIN (SELECT * FROM integers2 WHERE 1<>1) tbl2 ON 1=2 ORDER BY i;
----
1 2 NULL NULL
2 3 NULL NULL
3 4 NULL NULL
# left outer join on "false" gives the LHS with the RHS filled as NULL
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON 1=2 ORDER BY i;
----
1 2 NULL NULL
2 3 NULL NULL
3 4 NULL NULL
# left outer join on NULL constant gives the LHS with the RHS filled as null as well
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON NULL<>NULL ORDER BY i;
----
1 2 NULL NULL
2 3 NULL NULL
3 4 NULL NULL
# left outer join on condition that only concerns the LHS
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON i=1 ORDER BY i, k;
----
1 2 1 10
1 2 2 20
2 3 NULL NULL
3 4 NULL NULL
# left outer join on condition that only concerns the RHS
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON l=20 ORDER BY i, k;
----
1 2 2 20
2 3 2 20
3 4 2 20
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON l>0 ORDER BY i, k;
----
1 2 1 10
1 2 2 20
2 3 1 10
2 3 2 20
3 4 1 10
3 4 2 20
# left outer join on condition that affects both, but is not a simple comparison
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON i=1 OR l=20 ORDER BY i, k;
----
1 2 1 10
1 2 2 20
2 3 2 20
3 4 2 20
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON i=4 OR l=17 ORDER BY i;
----
1 2 NULL NULL
2 3 NULL NULL
3 4 NULL NULL
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON i+l=21 ORDER BY i;
----
1 2 2 20
2 3 NULL NULL
3 4 NULL NULL
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON i+l>12 ORDER BY i, k;
----
1 2 2 20
2 3 2 20
3 4 1 10
3 4 2 20
# range join
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON integers.i<integers2.k WHERE integers.i <= 2 ORDER BY i
----
1 2 2 20
2 3 NULL NULL
# multiple conditions
query IIII
SELECT * FROM integers LEFT OUTER JOIN integers2 ON integers.i<integers2.k AND integers.i<integers2.l WHERE integers.i <= 2 ORDER BY i
----
1 2 2 20
2 3 NULL NULL
query IIII
SELECT * FROM integers LEFT OUTER JOIN (SELECT * FROM integers2 WHERE k=100) integers2 ON integers.i<integers2.k ORDER BY i
----
1 2 NULL NULL
2 3 NULL NULL
3 4 NULL NULL
query II
select * from (values(1), (2)) t1(i) left join (values (2), (3)) t2(i) on t1.i=t2.i AND t1.i+t2.i=4 ORDER BY 1, 2;
----
1 NULL
2 2