CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
join8.test816 linesDownload Raw Back to test
1# 2022-04-122#3# The author disclaims copyright to this source code.  In place of4# a legal notice, here is a blessing:5#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.9#10#***********************************************************************11#12# This file implements tests for RIGHT and FULL OUTER JOINs.13 14set testdir [file dirname $argv0]15source $testdir/tester.tcl16 17ifcapable !vtab {18  finish_test19  return20}21 22db null NULL23# EVIDENCE-OF: R-33754-02880 you can say "LEFT RIGHT JOIN" which is the24# same as "FULL JOIN".25do_execsql_test join8-10 {26  CREATE TABLE t1(a,b,c);27  CREATE TABLE t2(x,y);28  CREATE INDEX t2x ON t2(x);29  SELECT avg(DISTINCT b) FROM (SELECT * FROM t2 LEFT RIGHT JOIN t1 ON c);30} {NULL}31 32# Pending optimization opportunity:33# Row-value initialization subroutines must be called from with the34# RIGHT JOIN body subroutine before the first use of any register containing35# the results of that subroutine.  This seems dodgy.  Test case:36#37reset_db38do_execsql_test join8-1000 {39  CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s);40  CREATE INDEX t1x1 ON t1(g+h,j,k);41  CREATE INDEX t1x2 ON t1(b);42  INSERT INTO t1 DEFAULT VALUES;43} {}44do_catchsql_test join8-1010 {45  SELECT a46    FROM (47          SELECT a48            FROM (49                  SELECT a50                    FROM (51                          SELECT a FROM t1 NATURAL LEFT JOIN t152                           WHERE (b, 2 ) IS ( SELECT 2 IN(2,2),2)53                         )54                    NATURAL LEFT FULL JOIN t155                   WHERE ( rowid , 1 )<=(CASE 5 WHEN 619 THEN 841 ELSE 3374391096 END,0)56                   ORDER BY a ASC57                 )58            NATURAL LEFT JOIN t159           WHERE (b, 2 ) IS ( SELECT 3 IN(3,3),3)60         )61    NATURAL LEFT FULL JOIN t162   WHERE ( rowid , 1 )<=(CASE 5 WHEN 619 THEN 841 ELSE 3374391096 END,0)63   ORDER BY a ASC;64} {0 1}65 66# Pending issue #2: (now resolved)67# Jump to addrHalt inside the RIGHT JOIN body subroutine bypasses the68# OP_Return, resulting in a subroutine loop.  Test case:69#70reset_db71do_execsql_test join8-2000 {72  CREATE TABLE t1(a int, b int, c int);73  INSERT INTO t1 VALUES(1,2,3),(4,5,6);74  CREATE TABLE t2(d int, e int);75  INSERT INTO t2 VALUES(3,333),(4,444);76  CREATE TABLE t3(f int, g int);77  PRAGMA automatic_index=off;78} {}79do_catchsql_test join8-2010 {80  SELECT * FROM t1 RIGHT JOIN t2 ON c=d JOIN t3 ON f=e;81} {0 {}}82 83# Demonstrate that nested FULL JOINs and USING clauses work84#85reset_db86load_static_extension db series87do_execsql_test join8-3000 {88  CREATE TABLE t1(id INTEGER PRIMARY KEY, a INT);89  CREATE TABLE t2(id INTEGER PRIMARY KEY, b INT);90  CREATE TABLE t3(id INTEGER PRIMARY KEY, c INT);91  CREATE TABLE t4(id INTEGER PRIMARY KEY, d INT);92  CREATE TABLE t5(id INTEGER PRIMARY KEY, e INT);93  CREATE TABLE t6(id INTEGER PRIMARY KEY, f INT);94  CREATE TABLE t7(id INTEGER PRIMARY KEY, g INT);95  CREATE TABLE t8(id INTEGER PRIMARY KEY, h INT);96  INSERT INTO t1 SELECT value, 1 FROM generate_series(1,256) WHERE value & 1;97  INSERT INTO t2 SELECT value, 1 FROM generate_series(1,256) WHERE value & 2;98  INSERT INTO t3 SELECT value, 1 FROM generate_series(1,256) WHERE value & 4;99  INSERT INTO t4 SELECT value, 1 FROM generate_series(1,256) WHERE value & 8;100  INSERT INTO t5 SELECT value, 1 FROM generate_series(1,256) WHERE value & 16;101  INSERT INTO t6 SELECT value, 1 FROM generate_series(1,256) WHERE value & 32;102  INSERT INTO t7 SELECT value, 1 FROM generate_series(1,256) WHERE value & 64;103  INSERT INTO t8 SELECT value, 1 FROM generate_series(1,256) WHERE value & 128;104  CREATE TABLE t9 AS105    SELECT id, h, g, f, e, d, c, b, a106      FROM t1107      NATURAL FULL JOIN t2108      NATURAL FULL JOIN t3109      NATURAL FULL JOIN t4110      NATURAL FULL JOIN t5111      NATURAL FULL JOIN t6112      NATURAL FULL JOIN t7113      NATURAL FULL JOIN t8;114} {}115do_execsql_test join8-3010 {116  SELECT count(*) FROM t9;117} {255}118do_execsql_test join8-3020 {119  SELECT id, count(*) FROM t9 GROUP BY id HAVING count(*)!=1;120} {}121do_execsql_test join8-3030 {122  UPDATE t9 SET a=0 WHERE a IS NULL;123  UPDATE t9 SET b=0 WHERE b IS NULL;124  UPDATE t9 SET c=0 WHERE c IS NULL;125  UPDATE t9 SET d=0 WHERE d IS NULL;126  UPDATE t9 SET e=0 WHERE e IS NULL;127  UPDATE t9 SET f=0 WHERE f IS NULL;128  UPDATE t9 SET g=0 WHERE g IS NULL;129  UPDATE t9 SET h=0 WHERE h IS NULL;130  SELECT count(*) FROM t9 WHERE id=128*h+64*g+32*f+16*e+8*d+4*c+2*b+a;131} {255}132do_execsql_test join8-3040 {133  SELECT * FROM t9 WHERE id<>128*h+64*g+32*f+16*e+8*d+4*c+2*b+a;134} {}135 136# 2022-04-21 dbsqlfuzz find137#138reset_db139do_execsql_test join8-4000 {140  CREATE TABLE t1(x INTEGER PRIMARY KEY, a, b);141  INSERT INTO t1 VALUES(1,5555,4);142  CREATE INDEX i1a ON t1(a);143  CREATE INDEX i1b ON t1(b);144  SELECT a FROM t1 NATURAL RIGHT JOIN t1 WHERE a=5555 OR (1,b)==(SELECT 2 IN (2,2),4);145} {5555}146 147# 2022-04-23 dbsqlfuzz c7ee5500e3abddec3557016de777713b80c790d3148# Escape from the right-join body subroutine via the ORDER BY LIMIT optimization.149#150reset_db151db null -152do_catchsql_test join8-5000 {153  CREATE TABLE t1(x);154  INSERT INTO t1(x) VALUES(NULL),(NULL);155  CREATE TABLE t2(c, d);156  INSERT INTO t2(c,d) SELECT x, x FROM t1;157  CREATE INDEX t2dc ON t2(d, c);158  SELECT (SELECT c FROM sqlite_temp_schema FULL JOIN t2 ON d IN (1,2,3) ORDER BY d) AS x FROM t1;159} {0 {- -}}160 161# 2022-04-29 dbsqlfuzz 19f1102a70cf966ab249de56d944fc20dbebcfcf162# Verification of testtag-20230227b and testtag-20230227c163#164reset_db165do_execsql_test join8-6000 {166  CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d REAL);167  INSERT INTO t1 VALUES(1,'A','aa',2.5);168  SELECT * FROM t1 AS t2 NATURAL RIGHT JOIN t1 AS t3169   WHERE (a,b) IN (SELECT rowid, b FROM t1);170} {1 A aa 2.5}171do_execsql_test join8-6010 {172  DROP TABLE IF EXISTS t1;173  CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, c TEXT, d INT) WITHOUT ROWID;174  INSERT INTO t1 VALUES(15,'xray','baker',42);175  SELECT value, t1.* FROM json_each('7') NATURAL RIGHT JOIN t1176   WHERE (a,b) IN (SELECT a, b FROM t1);177} {7 15 xray baker 42}178do_execsql_test join8-6020 {179  DROP TABLE IF EXISTS t1;180  CREATE TABLE t1(a INTEGER PRIMARY KEY,b);181  INSERT INTO t1 VALUES(0,NULL),(1,2);182  SELECT value, t1.* FROM json_each('17') NATURAL RIGHT JOIN t1183   WHERE (a,b) IN (SELECT rowid, b FROM t1);184} {17 1 2}185do_execsql_test join8-6021 {186  SELECT value, t1.* FROM json_each('null') NATURAL RIGHT JOIN t1187   WHERE (a,b) IN (SELECT rowid, b FROM t1);188} {{} 1 2}189do_execsql_test join8-6022 {190  CREATE TABLE a(key TEXT);191  INSERT INTO a(key) VALUES('a'),('b');192  SELECT quote(a.key), b.value193    FROM a RIGHT JOIN json_each('["a","c"]') AS b ON a.key=b.value;194} {'a' a NULL c}195 196# Bloom filter usage by RIGHT and FULL JOIN197#198reset_db199do_execsql_test join8-7000 {200CREATE TABLE t1(a INT, b INT, c INT, d INT);201  WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<10)202    INSERT INTO t1(a,b,c,d) SELECT x, x+100, x+200, x+300 FROM c;203  CREATE TABLE t2(b INT, x INT);204  INSERT INTO t2(b,x) SELECT b, a FROM t1 WHERE a%2=0;205  CREATE INDEX t2b ON t2(b);206  CREATE TABLE t3(c INT, y INT);207  INSERT INTO t3(c,y) SELECT c, a FROM t1 WHERE a%3=0;208  CREATE INDEX t3c ON t3(c);209  CREATE TABLE t4(d INT, z INT);210  INSERT INTO t4(d,z) SELECT d, a FROM t1 WHERE a%5=0;211  CREATE INDEX t4d ON t4(d);212  INSERT INTO t1(a,b,c,d) VALUES213    (96,NULL,296,396),214    (97,197,NULL,397),215    (98,198,298,NULL),216    (99,NULL,NULL,NULL);217  ANALYZE sqlite_schema;218  INSERT INTO sqlite_stat1 VALUES('t4','t4d','20 1');219  INSERT INTO sqlite_stat1 VALUES('t3','t3c','32 1');220  INSERT INTO sqlite_stat1 VALUES('t2','t2b','48 1');221  INSERT INTO sqlite_stat1 VALUES('t1',NULL,'100');222  ANALYZE sqlite_schema;223} {}224db null -225do_execsql_test join8-7010 {226  WITH t0 AS MATERIALIZED (227    SELECT t1.*, t2.*, t3.*228      FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0229        RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0230  )231  SELECT * FROM t0 FULL JOIN t4 ON t0.a=t4.d AND t4.z>0232   ORDER BY coalesce(t0.a, t0.y+200, t4.d);233} {234  6  106  206  306  106  6  206  6    -   -235  -    -    -    -    -  -  200  0    -   -236  -    -    -    -    -  -  203  3    -   -237  -    -    -    -    -  -  209  9    -   -238  -    -    -    -    -  -    -  -  300   0239  -    -    -    -    -  -    -  -  305   5240  -    -    -    -    -  -    -  -  310  10241}242 243# EVIDENCE-OF: R-33754-02880 you can say "LEFT RIGHT JOIN" which is the244# same as "FULL JOIN".245do_execsql_test join8-7011 {246  WITH t0 AS MATERIALIZED (247    SELECT t1.*, t2.*, t3.*248      FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0249        RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0250  )251  SELECT * FROM t0 LEFT RIGHT JOIN t4 ON t0.a=t4.d AND t4.z>0252   ORDER BY coalesce(t0.a, t0.y+200, t4.d);253} {254  6  106  206  306  106  6  206  6    -   -255  -    -    -    -    -  -  200  0    -   -256  -    -    -    -    -  -  203  3    -   -257  -    -    -    -    -  -  209  9    -   -258  -    -    -    -    -  -    -  -  300   0259  -    -    -    -    -  -    -  -  305   5260  -    -    -    -    -  -    -  -  310  10261}262 263do_execsql_test join8-7020 {264  EXPLAIN QUERY PLAN265  WITH t0 AS MATERIALIZED (266    SELECT t1.*, t2.*, t3.*267      FROM t1 INNER JOIN t2 ON t1.b=t2.b AND t2.x>0268        RIGHT JOIN t3 ON t1.c=t3.c AND t3.y>0269  )270  SELECT * FROM t0 FULL JOIN t4 ON t0.a=t4.d AND t4.z>0271   ORDER BY coalesce(t0.a, t0.y+200, t4.d);272} {/.*BLOOM FILTER ON t2.*BLOOM FILTER ON t3.*/}273 274# 2022-05-12 Difference with PG found (by Dan) while exploring275# https://sqlite.org/forum/forumpost/677a0ab93fcd9ccd276#277reset_db278do_execsql_test join8-8000 {279  CREATE TABLE t1(a INT, b INT);280  CREATE TABLE t2(c INT, d INT);281  CREATE TABLE t3(e INT, f INT);282  INSERT INTO t1 VALUES(1, 2);283  INSERT INTO t2 VALUES(3, 4);284  INSERT INTO t3 VALUES(5, 6);285} {}286do_execsql_test join8-8010 {287  SELECT *288    FROM t3 LEFT JOIN t2 ON true289            JOIN t1 ON (t3.e IS t2.c);290} {}291do_execsql_test join8-8020 {292  SELECT *293    FROM t3 LEFT JOIN t2 ON true294            JOIN t1 ON (t3.e IS NOT DISTINCT FROM t2.c);295} {}296 297# 2022-05-13 The idea of reusing subquery cursors does not298# work, if the cursors are used both for scanning and lookups.299#300reset_db301db null -302do_execsql_test join8-9000 {303  CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d REAL);304  INSERT INTO t1 VALUES(1,'E','bb',NULL),(2,NULL,NULL,NULL);305  SELECT * FROM t1 NATURAL RIGHT JOIN t1 AS t2 WHERE (a,b) IN (SELECT a+0, b FROM t1);306} {1 E bb -}307 308# 2022-05-14 https://sqlite.org/forum/forumpost/c06b10ad7e309#310reset_db311db null -312do_execsql_test join8-10000 {313  CREATE TABLE t1(c0 INT UNIQUE);314  CREATE TABLE t2(c0);315  CREATE TABLE t2i(c0 INT);316  CREATE TABLE t3(c0 INT);317  INSERT INTO t1 VALUES(1);318  INSERT INTO t2 VALUES(2);319  INSERT INTO t2i VALUES(2);320  INSERT INTO t3 VALUES(3);321} {}322do_execsql_test join8-10010 {323  SELECT DISTINCT t1.c0, t3.c0324    FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0;325} {- 3}326do_execsql_test join8-10020 {327  SELECT t1.c0, t3.c0328    FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0;329} {- 3}330do_execsql_test join8-10030 {331  SELECT DISTINCT t1.c0, t3.c0332    FROM t2 NATURAL CROSS JOIN t1 RIGHT JOIN t3 ON t1.c0;333} {- 3}334do_execsql_test join8-10040 {335  SELECT t1.c0, t3.c0336    FROM t1 NATURAL CROSS JOIN t2 RIGHT JOIN t3 ON t1.c0;337} {- 3}338do_execsql_test join8-10050 {339  SELECT DISTINCT t1.c0, t3.c0340    FROM t2i NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0;341} {- 3}342do_execsql_test join8-10060 {343  SELECT DISTINCT +t1.c0, t3.c0344    FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0;345} {- 3}346do_execsql_test join8-10070 {347  SELECT DISTINCT +t1.c0, t3.c0348    FROM t1 NATURAL CROSS JOIN t2 RIGHT JOIN t3 ON t1.c0;349} {- 3}350do_execsql_test join8-10080 {351  SELECT DISTINCT t1.c0, t3.c0352    FROM t2 NATURAL JOIN t1 RIGHT JOIN t3 ON t1.c0<>0;353} {- 3}354 355# 2022-05-14356# index-on-expr scan on a RIGHT JOIN357# dbsqlfuzz 39ee60004ff027a9e2846cf76e02cd5ac0953739358#359reset_db360db null -361do_execsql_test join8-11000 {362  CREATE TABLE t1(a);363  CREATE TABLE t2(b);364  INSERT INTO t2 VALUES(0),(1),(2);365  SELECT * FROM t1 RIGHT JOIN t2 ON (a=b) WHERE 99+(b+1)!=99;366} {- 0 - 1 - 2}367do_execsql_test join8-11010 {368  CREATE INDEX t2b ON t2(b+1) WHERE b IS NOT NULL;369  SELECT * FROM t1 RIGHT JOIN t2 ON (a=b) WHERE 99+(b+1)!=99;370} {- 0 - 1 - 2}371do_execsql_test join8-11020 {372  DROP TABLE t1;373  DROP TABLE t2;374  CREATE TABLE t1(a);375  CREATE TABLE t2(b, c, d);376  INSERT INTO t2 VALUES(1, 3, 'not-4');377  SELECT b, d FROM t1 RIGHT JOIN t2 WHERE (b+0)=1 AND d!=4;378} {1 not-4}379do_execsql_test join8-11030 {380  CREATE INDEX i2 ON t2((b+0), d);381  SELECT b, d FROM t1 RIGHT JOIN t2 WHERE (b+0)=1 AND d!=4;382} {1 not-4}383do_execsql_test join8-11040 {384  DROP INDEX i2;385  CREATE INDEX i2 ON t2((b+0), d) WHERE d IS NOT NULL;386  SELECT b, d FROM t1 RIGHT JOIN t2 WHERE (b+0)=1 AND d!=4;387} {1 not-4}388 389# 2022-05-23390# NATURAL JOIN name resolution is more forgiving with LEFT JOIN391# https://sqlite.org/forum/forumpost/e90a8e6e6f392#393reset_db394db null -395do_execsql_test join8-12000 {396  CREATE TABLE t1(a INT);  INSERT INTO t1 VALUES(0),(1);397  CREATE TABLE t2(a INT);  INSERT INTO t2 VALUES(0),(2);398  CREATE TABLE t3(a INT);  INSERT INTO t3 VALUES(0),(3);399} {}400do_catchsql_test join8-12010 {401  SELECT * FROM t1 RIGHT JOIN t2 ON t2.a<>0 NATURAL RIGHT JOIN t3;402} {1 {ambiguous reference to a in USING()}}403do_catchsql_test join8-12020 {404  SELECT * FROM t1 RIGHT JOIN t2 ON t2.a<>0 NATURAL LEFT JOIN t3;405} {1 {ambiguous reference to a in USING()}}406do_catchsql_test join8-12030 {407  SELECT * FROM t1 LEFT JOIN t2 ON t2.a<>0 NATURAL RIGHT JOIN t3;408} {1 {ambiguous reference to a in USING()}}409 410# The following query should probably also return the same error as the411# previous three cases.  However, historical versions of SQLite have always412# let it pass.  We will not "fix" this, since to do so might break legacy413# applications.414#415do_catchsql_test join8-12040 {416  SELECT * FROM t1 LEFT JOIN t2 ON t2.a<>0 NATURAL LEFT JOIN t3;417} {0 {0 2 1 2}}418 419# 2022-05-24420# https://sqlite.org/forum/forumpost/687b0bf563a1d4f1421#422reset_db423do_execsql_test join8-13000 {424  CREATE TABLE t0(t TEXT, u TEXT);  INSERT INTO t0 VALUES('t', 'u');425  CREATE TABLE t1(v TEXT, w TEXT);  INSERT INTO t1 VALUES('v', 'w');426  CREATE TABLE t2(x TEXT, y TEXT);  INSERT INTO t2 VALUES('x', 'y');427  SELECT * FROM t0 JOIN t1 ON (t2.x NOTNULL) LEFT JOIN t2 ON false;428  SELECT * FROM t0 JOIN t1 ON (t2.x NOTNULL) LEFT JOIN t2 ON false429   WHERE t2.y ISNULL;430} {}431 432# 2022-05-25433# https://sqlite.org/forum/forumpost/5cfe08eed6434#435reset_db436do_execsql_test join8-14000 {437  CREATE TABLE t0(a TEXT, b TEXT, c TEXT);438  CREATE TABLE t1(a TEXT);439  INSERT INTO t1 VALUES('1');440  CREATE VIEW v0 AS SELECT 'xyz' AS d;441  SELECT * FROM v0 RIGHT JOIN t1 ON t1.a<>'' INNER JOIN t0 ON t0.c<>'';442  SELECT * FROM v0 RIGHT JOIN t1 ON t1.a<>'' INNER JOIN t0 ON t0.c<>'' WHERE b ISNULL;443} {}444do_execsql_test join8-14010 {445  CREATE TABLE y0(a INT);446  CREATE TABLE y1(b INT); INSERT INTO y1 VALUES(1), (2);447  CREATE TABLE y2(c INT); INSERT INTO y2 VALUES(3), (4);448} {}449db null -450do_execsql_test join8-14020 {451  SELECT * FROM y0 RIGHT JOIN y1 ON true INNER JOIN y2 ON true WHERE y2.c!=99 AND y2.c!=98;452} {453  - 1 3454  - 1 4455  - 2 3456  - 2 4457}458 459# 2022-05-30460# https://sqlite.org/forum/forumpost/3902c7b833461#462reset_db463do_execsql_test join8-15000 {464  CREATE TABLE t1(x INT);465  CREATE TABLE t2(y INT);466  CREATE TABLE t3(z INT);467  INSERT INTO t1 VALUES(10);468  INSERT INTO t3 VALUES(20),(30);469}470do_execsql_test join8-15010 {471  SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON t2.y IS NOT NULL;472} {}473do_execsql_test join8-15020 {474  SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON t2.y IS NOT NULL475   WHERE (t3.z!=400 AND t3.z!=500 AND t3.z!=600);476} {}477do_execsql_test join8-15100 {478  PRAGMA automatic_index = 0;479  CREATE TABLE t4(x TEXT);480  CREATE TABLE t5(y TEXT);481  CREATE TABLE t6(z TEXT);482  INSERT INTO t4 VALUES('a'), ('b');483  INSERT INTO t5 VALUES('b'), ('c');484  INSERT INTO t6 VALUES('a'), ('d');485} {}486db null -487do_execsql_test join8-15110 {488  SELECT * FROM t4 LEFT JOIN t5 ON x=y LEFT JOIN t6 ON (x=z) ORDER BY +x;489} {a - a b b -}490do_execsql_test join8-15120 {491  SELECT * FROM t4 LEFT JOIN t5 ON x=y LEFT JOIN t6 ON (x=z)492   WHERE t5.y!='x' AND t4.x!='x';493} {b b -}494 495# 2022-05-31496# https://sqlite.org/forum/forumpost/c2554d560b497reset_db498do_execsql_test join8-16000 {499  CREATE TABLE t1(a TEXT);500  CREATE TABLE t2(b TEXT);501  CREATE TABLE t3(c TEXT);502  INSERT INTO t2(b) VALUES ('x');503  INSERT INTO t3(c) VALUES ('y'), ('z');504} {}505db null -506do_execsql_test join8-16010 {507  SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'';508} {- x -}509do_execsql_test join8-16020 {510  SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'' WHERE c IS NULL;511} {- x -}512do_execsql_test join8-16020 {513  SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'' WHERE c IS NULL;514} {}515do_execsql_test join8-16030 {516  SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'';517} {}518do_execsql_test join8-16040 {519  SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'' WHERE c<>'';520} {}521do_execsql_test join8-16050 {522  SELECT * FROM t1 RIGHT JOIN t2 ON true LEFT JOIN t3 ON a<>'' WHERE c IS NOT NULL;523} {}524do_execsql_test join8-16060 {525  SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'' WHERE c<>'';526} {}527do_execsql_test join8-16070 {528  SELECT * FROM t1 RIGHT JOIN t2 ON true JOIN t3 ON a<>'' WHERE c IS NOT NULL;529} {}530 531# 2022-06-01532# https://sqlite.org/forum/forumpost/087de2d9ec533#534reset_db535do_execsql_test join8-17000 {536  CREATE TABLE t1(id INTEGER PRIMARY KEY, x INT, y INT);537  CREATE TABLE t2(z INT);538  INSERT INTO t1(id,x,y) VALUES(1, 0, 0);539} {}540db null NULL541do_execsql_test join8-17010 {542  SELECT * FROM t2 RIGHT JOIN t1 ON true;543} {NULL 1 0 0}544do_execsql_test join8-17020 {545  SELECT 99=id AND 0=y AS "truth" FROM t2 RIGHT JOIN t1 ON true;546} {0}547do_execsql_test join8-17030 {548  SELECT (99, 0)==(id, y) AS "truth" FROM t2 RIGHT JOIN t1;549} {0}550do_execsql_test join8-17040 {551  SELECT * FROM t2 RIGHT JOIN t1 WHERE 99=id AND 0=y;552} {}553do_execsql_test join8-17041 {554  SELECT * FROM t2 RIGHT JOIN t1 WHERE 99=+id AND 0=y;555} {}556do_execsql_test join8-17050 {557  SELECT * FROM t2 RIGHT JOIN t1 WHERE (99, 0)==(id,y);558} {}559do_execsql_test join8-17051 {560  SELECT * FROM t2 RIGHT JOIN t1 WHERE (99, 0)==(+id,y);561} {}562do_execsql_test join8-17060 {563  SELECT * FROM t2 RIGHT JOIN t1 WHERE 1=id AND 0=y;564} {NULL 1 0 0}565do_execsql_test join8-17061 {566  SELECT * FROM t2 RIGHT JOIN t1 WHERE 1=+id AND 0=y;567} {NULL 1 0 0}568do_execsql_test join8-17070 {569  SELECT * FROM t2 RIGHT JOIN t1 WHERE (1, 0)==(id,y);570} {NULL 1 0 0}571do_execsql_test join8-17071 {572  SELECT * FROM t2 RIGHT JOIN t1 WHERE (1, 0)==(+id,y);573} {NULL 1 0 0}574do_execsql_test join8-17080 {575  CREATE TABLE t3(a INTEGER PRIMARY KEY, b INT);576  CREATE TABLE t4(x INT, y INT);577  INSERT INTO t3(a,b) VALUES(1, 3);578} {}579do_execsql_test join8-17090 {580  SELECT t3.a FROM t4 RIGHT JOIN t3 ON (x=a) WHERE (b, 4)=(SELECT 3, 4);581} {1}582do_execsql_test join8-17091 {583  SELECT t3.a FROM t4 RIGHT JOIN t3 ON (x=a) WHERE (b, 4) IS (SELECT 3, 4);584} {1}585 586# 2022-06-06587# https://sqlite.org/forum/forumpost/206d99a16dd9212f588# tag-20191211-001589#590reset_db591do_execsql_test join8-18000 {592  CREATE TABLE t1(a BOOLEAN); INSERT INTO t1 VALUES (false);593  CREATE TABLE t2(x INT);     INSERT INTO t2 VALUES (0);594  SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 RIGHT JOIN t1 ON true WHERE (x NOTNULL)=a;595} {}596do_execsql_test join8-18010 {597  CREATE INDEX t1a ON t1(a);598  SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 RIGHT JOIN t1 ON true WHERE (x NOTNULL)=a;599} {}600 601do_execsql_test join8-18020 {602  CREATE TABLE t3(z);603  INSERT INTO t3 VALUES('t3value');604  SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 RIGHT JOIN t1 ON true INNER JOIN t3 ON (x NOTNULL)=a;605} {}606 607ifcapable rtree {608  do_execsql_test join8-18030 {609    CREATE VIRTUAL TABLE rtree1 USING rtree(a, x1, x2);610    INSERT INTO rtree1 VALUES(0, 0, 0);611  }612  do_execsql_test join8-18040 {613    SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 614      RIGHT JOIN rtree1 ON true INNER JOIN t3 ON (x NOTNULL)=+a;615  } {}616  do_execsql_test join8-18050 {617    SELECT *, x NOTNULL, (x NOTNULL)=a FROM t2 618      RIGHT JOIN rtree1 ON true INNER JOIN t3 ON (x NOTNULL)=a;619  } {}620}621 622 623reset_db624do_execsql_test join8-19000 {625  CREATE TABLE t1(a INT);626  CREATE TABLE t2(b INT, c INT);627  CREATE TABLE t3(d INT);628 629  INSERT INTO t1 VALUES(10);630  INSERT INTO t2 VALUES(50,51);631  INSERT INTO t3 VALUES(299);632 633  CREATE INDEX t2b ON t2( (b IS NOT NULL) );634}635 636do_execsql_test join8-19010 {637  SELECT * FROM t1 LEFT JOIN t2 ON true INNER JOIN t3 ON (b IS NOT NULL)=0;638}639 640# 2022-06-07641# https://sqlite.org/forum/forumpost/323f86cc30642reset_db643do_execsql_test join8-20000 {644  CREATE TABLE t1(x TEXT);645  INSERT INTO t1(x) VALUES('aaa');646  CREATE VIEW v0(y) AS SELECT x FROM t1;647  CREATE TABLE t2(z TEXT);648} {}649db null -650do_execsql_test join8-20010 {651  SELECT * FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc';652} {- - aaa}653do_execsql_test join8-20020 {654  SELECT * FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc' ORDER BY z;655} {- - aaa}656do_execsql_test join8-20030 {657  SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc';658} {99}659do_execsql_test join8-20040 {660  SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'bbb' RIGHT JOIN t1 ON z<>'ccc' ORDER BY z;661} {99}662do_execsql_test join8-20050 {663  SELECT count(*)664    FROM (SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'' RIGHT JOIN t1 ON z<>'') AS "t3";665} {1}666do_execsql_test join8-20060 {667  SELECT count(*) 668    FROM (SELECT 99 as "m" FROM t2 JOIN v0 ON z<>'' RIGHT JOIN t1 ON z<>'' ORDER BY z) AS "t3";669} {1}670 671# 2022-06-10672# https://sqlite.org/forum/forumpost/8e4c352937e82929673#674# Do not allow constant propagation between ON and WHERE clause terms.675# (Updated 2022-06-20) See also https://sqlite.org/forum/forumpost/57bdf2217d676#677reset_db678do_execsql_test join8-21000 {679  CREATE TABLE t1(a INT,b BOOLEAN);680  CREATE TABLE t2(c INT);  INSERT INTO t2 VALUES(NULL);681  CREATE TABLE t3(d INT);682}683do_execsql_test join8-21010 {684  SELECT (b IS TRUE) FROM t1 JOIN t3 ON (b=TRUE) RIGHT JOIN t2 ON TRUE;685} {0}686do_execsql_test join8-22020 {687  SELECT * FROM t1 JOIN t3 ON (b=TRUE) RIGHT JOIN t2 ON TRUE WHERE (b IS TRUE);688} {}689do_execsql_test join8-22030 {690  DROP TABLE t1;691  DROP TABLE t2;692  DROP TABLE t3;693  CREATE TABLE t1(a INT);694  CREATE TABLE t2(b INT);695  CREATE TABLE t3(c INTEGER PRIMARY KEY, d INT);696  CREATE INDEX t3d ON t3(d);697  INSERT INTO t3 VALUES(0, 0);698}699do_catchsql_test join8-22031 {700  SELECT * FROM t1 JOIN t2 ON d>b RIGHT JOIN t3 ON true WHERE +d = 0;701} {1 {ON clause references tables to its right}}702do_catchsql_test join8-22040 {703  SELECT * FROM t1 JOIN t2 ON d>b RIGHT JOIN t3 ON true WHERE d = 0;704} {1 {ON clause references tables to its right}}705 706 707# 2022-06-10708# https://sqlite.org/forum/forumpost/51e6959f61709#710# Restrictions on the usage of WHERE clause constraints by joins that are711# involved with a RIGHT JOIN must also be applied to automatic indexes.712#713reset_db714do_execsql_test join8-22000 {715  CREATE TABLE t1(a INT);716  CREATE TABLE t2(b INT);717  CREATE TABLE t3(c TEXT);  INSERT INTO t3 VALUES('x');718  CREATE TABLE t4(d TEXT);  INSERT INTO t4 VALUES('y');719  SELECT 99720    FROM t1721         LEFT JOIN t2 ON true722         RIGHT JOIN t3 ON true723         RIGHT JOIN t4 ON true724   WHERE a=b;725} {}726 727# 2022-06-13728# https://sqlite.org/forum/forumpost/b40696f501729#730# This optimization that converts "x ISNULL" into "FALSE" when column "x" has a731# NOT NULL constraint is too aggresive if the query contains RIGHT JOIN.732#733reset_db734db null -735do_execsql_test join8-23000 {736  CREATE TABLE t1(a TEXT);737  INSERT INTO t1 VALUES('c');738  CREATE TABLE t2(b TEXT, c TEXT NOT NULL);739  INSERT INTO t2 VALUES('a', 'b');740  CREATE TABLE t3(d TEXT);741  INSERT INTO t3 VALUES('x');742  CREATE TABLE t4(e TEXT);743  INSERT INTO t4 VALUES('y');744}745do_execsql_test join8-23010 {746  SELECT *747    FROM t1748         LEFT JOIN t2 ON TRUE749         JOIN t3 ON c=''750         RIGHT JOIN t4 ON b='';751} {- - - - y}752do_execsql_test join8-23020 {753  SELECT *754    FROM t1755         LEFT JOIN t2 ON TRUE756         JOIN t3 ON c=''757         RIGHT JOIN t4 ON b=''758   WHERE d ISNULL759} {- - - - y}760 761# 2022-06-14762# dbsqlfuzz 2f3101834d14325a976f601b9267a0fd323d6bbd763#764# When the OP_NullRow opcode creates a new cursor, it must765# set the cursor to no-reuse so that an OP_OpenEphemeral in766# a subroutine does not try to reuse it.767#768reset_db769db null -770do_execsql_test join8-24000 {771  CREATE TABLE t4(b INT, c INT);772  CREATE TABLE t5(a INT, f INT);773  INSERT INTO t5 VALUES(1,2);774  WITH t7(x, y) AS (SELECT 100, 200 FROM t5)775    SELECT * FROM t4 JOIN t7 ON true RIGHT JOIN (SELECT y AS z FROM t7) AS t6 ON (x=z);776} {- - - - 200}777 778# 2022-06-20779# forum/forumpost/6650cd40b5634f35780#781reset_db782do_execsql_test join8-25000 {783  CREATE TABLE t1(a1 INT);784  CREATE TABLE t2(b2 INT);785  CREATE TABLE t3(c3 INT, d3 INT UNIQUE);786  CREATE TABLE t4(e4 INT, f4 TEXT);787  INSERT INTO t3(c3, d3) VALUES (2, 1);788  INSERT INTO t4(f4) VALUES ('x');789  CREATE INDEX i0 ON t3(c3) WHERE d3 ISNULL;790  ANALYZE main;791}792db null -793do_execsql_test join8-25010 {794  SELECT * FROM t1 LEFT JOIN t2 ON true JOIN t3 ON (b2 IN (a1)) FULL JOIN t4 ON true;795} {- - - - - x}796do_execsql_test join8-25020 {797  SELECT 1 FROM t1 LEFT JOIN t2 ON true JOIN t3 ON (b2 IN (a1)) FULL JOIN t4 ON true;798} {1}799 800# 2022-07-13801# forum/forumpost/174afeae57802#803reset_db804db null -805do_execsql_test join8-26000 {806  CREATE TABLE t1(a INT);807  CREATE TABLE t2(b INT, c INT);808  CREATE VIEW t3(d) AS SELECT NULL FROM t2 FULL OUTER JOIN t1 ON c=a UNION ALL SELECT b FROM t2;809  INSERT INTO t1(a) VALUES (NULL);810  INSERT INTO t2(b, c) VALUES (99, NULL);811  SELECT DISTINCT b, c, d FROM t2, t3 WHERE b<>0812   UNION SELECT DISTINCT b, c, d FROM t2, t3 WHERE b ISNULL;813} {99 - - 99 - 99}814 815finish_test816