Files
email-tracker/external/duckdb/test/sql/join/natural/natural_join.test
2025-10-24 19:21:19 -05:00

257 lines
5.2 KiB
SQL

# name: test/sql/join/natural/natural_join.test
# description: Test natural joins
# group: [natural]
# create tables
statement ok
CREATE TABLE t1 (a INTEGER, b INTEGER)
statement ok
INSERT INTO t1 VALUES (1, 2)
statement ok
CREATE TABLE t2 (a INTEGER, c INTEGER)
statement ok
INSERT INTO t2 VALUES (1, 3), (2, 4)
# NATURAL join with one column
query III
SELECT * FROM t1 NATURAL JOIN t2
----
1 2 3
query III
SELECT t1.a, t1.b, t2.c FROM t1 NATURAL JOIN t2
----
1 2 3
query III
SELECT t1.a, t1.b, t2.c FROM t1 NATURAL JOIN t2 ORDER BY t2.a
----
1 2 3
# natural join with multiple matching columns
statement ok
CREATE TABLE t3 (a INTEGER, b INTEGER, c INTEGER)
statement ok
INSERT INTO t3 VALUES (1, 2, 3)
query III
SELECT * FROM t1 NATURAL JOIN t3
----
1 2 3
query III
SELECT * FROM t3 NATURAL JOIN t2
----
1 2 3
# natural join chain
query III
SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3
----
1 2 3
# no matching columns
statement error
select * from (values (1)) tbl(a) natural join (values (1), (2)) tbl2(b) order by 1, 2
----
<REGEX>:.*Binder Error.*No columns found to join.*
# long join chain
query I
select * from (values (1)) tbl(a) natural join (values (1)) tbl2(a) natural join (values (1)) tbl3(a)
natural join (values (1)) tbl4(a) natural join (values (1)) tbl5(a)
----
1
# natural join with subqueries
query I
select * from (select 42) tbl(a) natural join (select 42) tbl2(a)
----
42
# uncorrelated scalar subquery
query I
select (select * from (select 42) tbl(a) natural join (select 42) tbl2(a))
----
42
# Multiple 8-bit bitmasks
query IIIIIIIIIII
select *
from
(select 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52) tbl1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
natural join
(select 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52) tbl2(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
----
42 43 44 45 46 47 48 49 50 51 52
# JoinHashTable::ScanFullOuter coverage
statement ok
CREATE TABLE sqlancer_t0(c0 DOUBLE, c1 DOUBLE);
statement ok
INSERT INTO sqlancer_t0 VALUES
(0.000000, -1570504255.000000),
(0.000000, -1570504255.000000),
(0.000000, -1570504255.000000),
(0.000000, -1570504255.000000),
(0.000000, 1.000000),
(0.000000, 0.543647),
(0.000000, NULL),
(0.000000, 1.000000),
(0.000000, 1.000000),
(0.000000, 0.000000),
(0.000000, 1617540830.000000),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, 0.497659),
(0.000000, -1367407567.000000),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, -547966124.000000),
(0.000000, NULL),
(0.000000, -1417028911.000000),
(0.000000, 277394703.000000),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL),
(0.000000, NULL)
;
statement ok
CREATE VIEW sqlancer_v0(c0, c1) AS SELECT sqlancer_t0.c0, ((sqlancer_t0.rowid)//(-1694294358))
FROM sqlancer_t0
ORDER BY TIMESTAMP '1970-01-08 16:19:01' ASC;
query II
SELECT DISTINCT sqlancer_v0.c1, sqlancer_t0.rowid
FROM sqlancer_v0 NATURAL FULL JOIN sqlancer_t0
ORDER BY 2 ASC;
----
NULL 0
NULL 1
NULL 2
NULL 3
NULL 4
NULL 5
NULL 6
NULL 7
NULL 8
0 9
NULL 10
NULL 11
NULL 12
NULL 13
NULL 14
NULL 15
NULL 16
NULL 17
NULL 18
NULL 19
NULL 20
NULL 21
NULL 22
NULL 23
NULL 24
NULL 25
NULL 26
NULL 27
NULL 28
NULL 29
query II
SELECT DISTINCT sqlancer_v0.c1, sqlancer_t0.rowid
FROM sqlancer_v0 NATURAL FULL JOIN sqlancer_t0 WHERE sqlancer_t0.c0
UNION
SELECT DISTINCT sqlancer_v0.c1, sqlancer_t0.rowid
FROM sqlancer_v0 NATURAL FULL JOIN sqlancer_t0
WHERE (NOT sqlancer_t0.c0)
UNION
SELECT DISTINCT sqlancer_v0.c1, sqlancer_t0.rowid
FROM sqlancer_v0 NATURAL FULL JOIN sqlancer_t0
WHERE ((sqlancer_t0.c0) IS NULL)
ORDER BY 2 ASC;
----
NULL 0
NULL 1
NULL 2
NULL 3
NULL 4
NULL 5
NULL 6
NULL 7
NULL 8
0 9
NULL 10
NULL 11
NULL 12
NULL 13
NULL 14
NULL 15
NULL 16
NULL 17
NULL 18
NULL 19
NULL 20
NULL 21
NULL 22
NULL 23
NULL 24
NULL 25
NULL 26
NULL 27
NULL 28
NULL 29
# error: duplicate table alias on both sides
statement error
select (select * from (select 42) tbl(a) natural join (select 42) tbl(a))
----
<REGEX>:.*Binder Error.*Ambiguous reference to table.*
statement ok
DROP TABLE t1
statement ok
CREATE TABLE t0(c0 DATE, c1 DATE DEFAULT('0.5868720116119102'), c2 INT1, PRIMARY KEY(c1, c2, c0));
statement ok
CREATE TABLE t1(c0 DATETIME, c1 DATE DEFAULT(TIMESTAMP '1970-01-11 02:37:59'), PRIMARY KEY(c0));
statement ok
CREATE VIEW v0(c0) AS SELECT false FROM t1, t0 HAVING 1689380428;
statement ok
SELECT COUNT(t1.rowid) FROM t1, v0 NATURAL RIGHT JOIN t0;
statement ok
SELECT COUNT(t1.rowid) FROM t1, v0 RIGHT JOIN t0 ON v0.c0=t0.c0;
statement error
SELECT COUNT(t1.rowid) FROM t1, v0 RIGHT JOIN t0 ON t1.c1=t0.c1 AND v0.c0=t0.c0;
----
<REGEX>:.*Not implemented Error.*Non-inner join on correlated columns.*
# column name appears more than once on left side of the natural join
statement error
select * from (values (1)) t1(i) join (values (1)) t2(i) on (t1.i=t2.i) natural join (values (1)) t3(i);
----
<REGEX>:.*Binder Error.*Ambiguous reference to column name.*
statement ok
PRAGMA disable_verification
# column name appears more than once on right side of the natural join
statement error
select * from (values (1)) t1(i) natural join ((values (1)) t2(i) join (values (1)) t3(i) on (t2.i=t3.i))
----
<REGEX>:.*Binder Error.*exists more than once on right side of join.*