Files
email-tracker/external/duckdb/test/sql/binder/separate_schema_tables.test
2025-10-24 19:21:19 -05:00

164 lines
3.2 KiB
SQL

# name: test/sql/binder/separate_schema_tables.test
# description: Test tables in different schemas with the same name
# group: [binder]
statement ok
PRAGMA enable_verification
statement ok
CREATE SCHEMA IF NOT EXISTS s1;
statement ok
CREATE SCHEMA IF NOT EXISTS s2;
statement ok
CREATE SCHEMA IF NOT EXISTS s3;
statement ok
CREATE TABLE s1.tbl(i INT);
statement ok
CREATE TABLE s2.tbl(i INT);
statement ok
CREATE TABLE s3.tbl(i INT);
statement ok
CREATE TABLE tbl(i INT);
statement ok
INSERT INTO s1.tbl VALUES (10);
statement ok
INSERT INTO s2.tbl VALUES (100);
statement ok
INSERT INTO s3.tbl VALUES (1000);
statement ok
INSERT INTO tbl VALUES (1);
query III
SELECT * FROM tbl, s1.tbl, s2.tbl
----
1 10 100
query IIII
SELECT * FROM tbl, s1.tbl, s2.tbl, s3.tbl
----
1 10 100 1000
statement error
SELECT tbl.i FROM s1.tbl, s2.tbl
----
s1.tbl or s2.tbl
statement error
SELECT tbl.i FROM s1.tbl, s2.tbl, s3.tbl
----
s1.tbl, s2.tbl or s3.tbl
# struct pack
query III
SELECT s1.tbl, s2.tbl, s3.tbl FROM s1.tbl, s2.tbl, s3.tbl
----
{'i': 10} {'i': 100} {'i': 1000}
# test joins
statement ok
CREATE TABLE s1.t AS SELECT 1 id, 's1.t' payload UNION ALL SELECT 10 id, 'AAA' payload
statement ok
CREATE TABLE s2.t AS SELECT 1 id, 's2.t' payload2 UNION ALL SELECT 100 id, 'BBB' payload2
statement ok
CREATE TABLE s3.t AS SELECT 1 id, 's3.t' payload3 UNION ALL SELECT 1000 id, 'CCC' payload3
# USING
query IIII
SELECT * FROM s1.t JOIN s2.t USING (id) JOIN s3.t USING (id)
----
1 s1.t s2.t s3.t
# explicit column reference to using column
query I
SELECT id FROM s1.t JOIN s2.t USING (id) JOIN s3.t USING (id)
----
1
# natural join
query IIII
SELECT * FROM s1.t NATURAL JOIN s2.t NATURAL JOIN s3.t
----
1 s1.t s2.t s3.t
# left join
query IIIIIII
SELECT id, s1.t.id, s2.t.id, s3.t.id, s1.t.payload, s2.t.payload2, s3.t.payload3
FROM s1.t LEFT JOIN s2.t USING (id) LEFT JOIN s3.t USING (id)
ORDER BY ALL
----
1 1 1 1 s1.t s2.t s3.t
10 10 NULL NULL AAA NULL NULL
# right join
query IIIIIII
SELECT id, s1.t.id, s2.t.id, s3.t.id, s1.t.payload, s2.t.payload2, s3.t.payload3
FROM s1.t RIGHT JOIN s2.t USING (id) RIGHT JOIN s3.t USING (id)
ORDER BY ALL
----
1 1 1 1 s1.t s2.t s3.t
1000 NULL NULL 1000 NULL NULL CCC
# full outer join
query IIIIIII
SELECT id, s1.t.id, s2.t.id, s3.t.id, s1.t.payload, s2.t.payload2, s3.t.payload3
FROM s1.t FULL OUTER JOIN s2.t USING (id) FULL OUTER JOIN s3.t USING (id)
ORDER BY ALL
----
1 1 1 1 s1.t s2.t s3.t
10 10 NULL NULL AAA NULL NULL
100 NULL 100 NULL NULL BBB NULL
1000 NULL NULL 1000 NULL NULL CCC
# now do the same with identifiers that differ in case only
statement ok
CREATE OR REPLACE TABLE s1.tbl(col INT);
statement ok
CREATE OR REPLACE TABLE s2.TBL(COL INT);
statement ok
CREATE OR REPLACE TABLE s3.Tbl(Col INT);
statement ok
INSERT INTO s1.tbl VALUES (10);
statement ok
INSERT INTO s2.tbl VALUES (100);
statement ok
INSERT INTO s3.tbl VALUES (1000);
query IIII
SELECT * FROM tbl, s1.tbl, s2.tbl, s3.tbl
----
1 10 100 1000
statement error
SELECT tbl.col FROM s1.tbl, s2.tbl
----
s1.tbl or s2.TBL
statement error
SELECT tbl.col FROM s1.tbl, s2.tbl, s3.tbl
----
s1.tbl, s2.TBL or s3.Tbl
# struct pack
query III
SELECT s1.tbl, s2.tbl, s3.tbl FROM s1.tbl, s2.tbl, s3.tbl
----
{'col': 10} {'COL': 100} {'Col': 1000}