should be it
This commit is contained in:
139
external/duckdb/test/sql/join/left_outer/left_join_issue_1172.test
vendored
Normal file
139
external/duckdb/test/sql/join/left_outer/left_join_issue_1172.test
vendored
Normal 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
|
||||
53
external/duckdb/test/sql/join/left_outer/left_join_issue_15316.test
vendored
Normal file
53
external/duckdb/test/sql/join/left_outer/left_join_issue_15316.test
vendored
Normal 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
|
||||
37
external/duckdb/test/sql/join/left_outer/left_join_issue_6341.test
vendored
Normal file
37
external/duckdb/test/sql/join/left_outer/left_join_issue_6341.test
vendored
Normal 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
|
||||
47
external/duckdb/test/sql/join/left_outer/left_join_issue_7905.test
vendored
Normal file
47
external/duckdb/test/sql/join/left_outer/left_join_issue_7905.test
vendored
Normal 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 ('');
|
||||
9
external/duckdb/test/sql/join/left_outer/non_foldable_left_join.test
vendored
Normal file
9
external/duckdb/test/sql/join/left_outer/non_foldable_left_join.test
vendored
Normal 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;
|
||||
124
external/duckdb/test/sql/join/left_outer/test_left_join_on_true.test
vendored
Normal file
124
external/duckdb/test/sql/join/left_outer/test_left_join_on_true.test
vendored
Normal 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
|
||||
|
||||
|
||||
183
external/duckdb/test/sql/join/left_outer/test_left_outer.test
vendored
Normal file
183
external/duckdb/test/sql/join/left_outer/test_left_outer.test
vendored
Normal 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
|
||||
Reference in New Issue
Block a user