3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file implements tests for RIGHT and FULL OUTER JOINs.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
20 CREATE TABLE t1(a INT, b INT);
21 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
22 CREATE INDEX t1a ON t1(a);
23 CREATE TABLE t2(c INT, d INT);
24 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
25 CREATE INDEX t2c ON t2(c);
26 CREATE VIEW dual(dummy) AS VALUES('x');
29 CREATE TABLE t1(a INT, b INT);
30 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
31 CREATE INDEX t1ab ON t1(a,b);
32 CREATE TABLE t2(c INT, d INT);
33 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
34 CREATE INDEX t2cd ON t2(c,d);
35 CREATE VIEW dual(dummy) AS VALUES('x');
38 CREATE TABLE t1(a INT, b INT);
39 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
40 CREATE INDEX t1a ON t1(a);
41 CREATE TABLE t2(c INT, d INT PRIMARY KEY) WITHOUT ROWID;
42 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
43 CREATE INDEX t2c ON t2(c);
44 CREATE VIEW dual(dummy) AS VALUES('x');
47 CREATE TABLE t1(a INT, b INT);
48 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
49 CREATE TABLE t2(c INTEGER PRIMARY KEY, d INT);
50 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
51 CREATE VIEW dual(dummy) AS VALUES('x');
54 CREATE TABLE t1(a INT, b INT);
55 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
56 CREATE TABLE t2(c INT PRIMARY KEY, d INT) WITHOUT ROWID;
57 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
58 CREATE VIEW dual(dummy) AS VALUES('x');
61 CREATE TABLE t1(a INT, b INT);
62 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
63 CREATE VIEW t2(c,d) AS VALUES(3,33),(4,44),(5,55);
64 CREATE VIEW dual(dummy) AS VALUES('x');
67 CREATE VIEW t1(a,b) AS VALUES(1,2),(1,3),(1,4);
68 CREATE TABLE t2(c INTEGER PRIMARY KEY, d INT);
69 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
70 CREATE VIEW dual(dummy) AS VALUES('x');
73 CREATE TABLE t1(a INT, b INT);
74 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
75 CREATE TABLE t2(c INT, d INT);
76 INSERT INTO t2 VALUES(3,33),(4,44),(5,55);
77 CREATE VIEW dual(dummy) AS VALUES('x');
80 CREATE TABLE t1(a INT, b INT);
81 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
82 CREATE TABLE t2a(c INTEGER PRIMARY KEY, i1 INT);
83 CREATE TABLE t2b(i1 INTEGER PRIMARY KEY, d INT);
84 CREATE VIEW t2(c,d) AS SELECT c, d FROM t2a NATURAL JOIN t2b;
85 INSERT INTO t2a VALUES(3,93),(4,94),(5,95),(6,96),(7,97);
86 INSERT INTO t2b VALUES(91,11),(92,22),(93,33),(94,44),(95,55);
87 CREATE TABLE dual(dummy TEXT);
88 INSERT INTO dual(dummy) VALUES('x');
91 CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a,b)) WITHOUT ROWID;
92 INSERT INTO t1 VALUES(1,2),(1,3),(1,4);
93 CREATE TABLE t2a(c INTEGER PRIMARY KEY, i1 INT);
94 CREATE TABLE t2b(i1 INTEGER PRIMARY KEY, d INT);
95 CREATE VIEW t2(c,d) AS SELECT c, d FROM t2a NATURAL JOIN t2b;
96 INSERT INTO t2a VALUES(3,93),(4,94),(5,95),(6,96),(7,97);
97 INSERT INTO t2b VALUES(91,11),(92,22),(93,33),(94,44),(95,55);
98 CREATE TABLE dual(dummy TEXT);
99 INSERT INTO dual(dummy) VALUES('x');
104 do_execsql_test join7-$id.setup $schema {}
106 # Verified against PG-14 for case 1
107 do_execsql_test join7-$id.10 {
108 SELECT b, d FROM t1 FULL OUTER JOIN t2 ON b=c ORDER BY +b;
116 # Verified against PG-14 for case 1
117 do_execsql_test join7-$id.20 {
118 SELECT a, c FROM t1 FULL OUTER JOIN t2 ON b=c ORDER BY +b;
126 do_execsql_test join7-$id.30 {
127 SELECT * FROM t1 FULL OUTER JOIN t2 ON b=c ORDER BY +b;
134 do_execsql_test join7-$id.31 {
135 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c ORDER BY +b;
142 do_execsql_test join7-$id.32 {
143 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c
150 do_execsql_test join7-$id.33 {
151 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c
159 do_execsql_test join7-$id.34 {
160 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c
161 WHERE b>0 OR b IS NULL
169 do_execsql_test join7-$id.35 {
170 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c AND b>3 AND c>4
171 ORDER BY coalesce(b,c,0);
180 do_execsql_test join7-$id.36 {
181 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c AND b>3 WHERE c>4
182 ORDER BY coalesce(b,c,0);
186 do_execsql_test join7-$id.37 {
187 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c WHERE b>3 AND c>4
188 ORDER BY coalesce(b,c,0);
191 do_execsql_test join7-$id.38 {
192 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c WHERE b>3 OR c>4
193 ORDER BY coalesce(b,c,0);
198 do_execsql_test join7-$id.39 {
199 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c AND (b>3 OR c>4)
200 ORDER BY coalesce(b,c,0);
208 do_execsql_test join7-$id.40 {
209 SELECT * FROM t1 RIGHT OUTER JOIN t2 ON b=c ORDER BY +b;
215 do_execsql_test join7-$id.50 {
216 SELECT t1.*, t2.* FROM t2 LEFT OUTER JOIN t1 ON b=c ORDER BY +b;
222 do_execsql_test join7-$id.60 {
223 SELECT * FROM dual JOIN t1 ON true RIGHT OUTER JOIN t2 ON b=c ORDER BY +b;
229 do_execsql_test join7-$id.70 {
231 FROM t2 LEFT JOIN (dual JOIN t1 ON true) ON b=c ORDER BY +b;
237 do_execsql_test join7-$id.80 {
238 SELECT * FROM dual CROSS JOIN t1 RIGHT OUTER JOIN t2 ON b=c ORDER BY +b;
244 do_execsql_test join7-$id.81 {
245 SELECT dual.*, t1.*, t2.*
246 FROM t1 CROSS JOIN dual RIGHT OUTER JOIN t2 ON b=c ORDER BY +b;
252 do_execsql_test join7-$id.90 {
253 SELECT * FROM t1 LEFT OUTER JOIN t2 ON b=c ORDER BY +b;
259 do_execsql_test join7-$id.100 {
260 SELECT * FROM t1 FULL OUTER JOIN t2 ON b=c AND a=1 ORDER BY +b;
267 do_execsql_test join7-$id.101 {
268 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c AND a=1 ORDER BY +b;
276 # Verified against PG-14 for case 1
277 do_execsql_test join7-$id.110 {
278 SELECT * FROM t1 FULL OUTER JOIN t2 ON b=c WHERE a=1 ORDER BY +b;
285 do_execsql_test join7-$id.111 {
286 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c WHERE a=1 ORDER BY +b;
293 # Verified against PG-14 for case 1
294 do_execsql_test join7-$id.115 {
295 SELECT * FROM t1 FULL OUTER JOIN t2 ON b=c
296 WHERE a=1 OR a IS NULL ORDER BY +b;
304 do_execsql_test join7-$id.116 {
305 SELECT t1.*, t2.* FROM t2 FULL OUTER JOIN t1 ON b=c
306 WHERE a=1 OR a IS NULL ORDER BY +b;
314 # Verified against PG-14 for case 1:
315 do_execsql_test join7-$id.120 {
316 SELECT * FROM t1 FULL OUTER JOIN t2 ON b=c WHERE a IS NULL ORDER BY +d;
321 # Verified against PG-14 for case 1:
322 do_execsql_test join7-$id.130 {
323 SELECT * FROM t1 FULL OUTER JOIN t2 ON b=c AND d<=0 ORDER BY +b, +d;
333 # Verified against PG-14 for case 1:
334 do_execsql_test join7-$id.140 {
336 FROM t2 FULL OUTER JOIN t1 ON b=c AND d<=0 ORDER BY +b, +d;
346 do_execsql_test join7-$id.141 {
348 FROM t2 FULL OUTER JOIN t1 ON b=c AND d<=0
349 ORDER BY +b, +d LIMIT 2 OFFSET 2