CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
join5.test459 linesDownload Raw Back to test
1# 2005 September 192#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# This file implements regression tests for SQLite library.12#13# This file implements tests for left outer joins containing ON14# clauses that restrict the scope of the left term of the join.15#16 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19set testprefix join520 21 22do_test join5-1.1 {23  execsql {24    BEGIN;25    CREATE TABLE t1(a integer primary key, b integer, c integer);26    CREATE TABLE t2(x integer primary key, y);27    CREATE TABLE t3(p integer primary key, q);28    INSERT INTO t3 VALUES(11,'t3-11');29    INSERT INTO t3 VALUES(12,'t3-12');30    INSERT INTO t2 VALUES(11,'t2-11');31    INSERT INTO t2 VALUES(12,'t2-12');32    INSERT INTO t1 VALUES(1, 5, 0);33    INSERT INTO t1 VALUES(2, 11, 2);34    INSERT INTO t1 VALUES(3, 12, 1);35    COMMIT;36  }37} {}38do_test join5-1.2 {39  execsql {40    select * from t1 left join t2 on t1.b=t2.x and t1.c=141  }42} {1 5 0 {} {} 2 11 2 {} {} 3 12 1 12 t2-12}43do_test join5-1.3 {44  execsql {45    select * from t1 left join t2 on t1.b=t2.x where t1.c=146  }47} {3 12 1 12 t2-12}48do_test join5-1.4 {49  execsql {50    select * from t1 left join t2 on t1.b=t2.x and t1.c=151                     left join t3 on t1.b=t3.p and t1.c=252  }53} {1 5 0 {} {} {} {} 2 11 2 {} {} 11 t3-11 3 12 1 12 t2-12 {} {}}54do_test join5-1.5 {55  execsql {56    select * from t1 left join t2 on t1.b=t2.x and t1.c=157                     left join t3 on t1.b=t3.p where t1.c=258  }59} {2 11 2 {} {} 11 t3-11}60 61# Ticket #240362#63do_test join5-2.1 {64  execsql {65    CREATE TABLE ab(a,b);66    INSERT INTO "ab" VALUES(1,2);67    INSERT INTO "ab" VALUES(3,NULL);68 69    CREATE TABLE xy(x,y);70    INSERT INTO "xy" VALUES(2,3);71    INSERT INTO "xy" VALUES(NULL,1);72  }73  execsql {SELECT * FROM xy LEFT JOIN ab ON 0}74} {2 3 {} {} {} 1 {} {}}75do_test join5-2.2 {76  execsql {SELECT * FROM xy LEFT JOIN ab ON 1}77} {2 3 1 2 2 3 3 {} {} 1 1 2 {} 1 3 {}}78do_test join5-2.3 {79  execsql {SELECT * FROM xy LEFT JOIN ab ON NULL}80} {2 3 {} {} {} 1 {} {}}81do_test join5-2.4 {82  execsql {SELECT * FROM xy LEFT JOIN ab ON 0 WHERE 0}83} {}84do_test join5-2.5 {85  execsql {SELECT * FROM xy LEFT JOIN ab ON 1 WHERE 0}86} {}87do_test join5-2.6 {88  execsql {SELECT * FROM xy LEFT JOIN ab ON NULL WHERE 0}89} {}90do_test join5-2.7 {91  execsql {SELECT * FROM xy LEFT JOIN ab ON 0 WHERE 1}92} {2 3 {} {} {} 1 {} {}}93do_test join5-2.8 {94  execsql {SELECT * FROM xy LEFT JOIN ab ON 1 WHERE 1}95} {2 3 1 2 2 3 3 {} {} 1 1 2 {} 1 3 {}}96do_test join5-2.9 {97  execsql {SELECT * FROM xy LEFT JOIN ab ON NULL WHERE 1}98} {2 3 {} {} {} 1 {} {}}99do_test join5-2.10 {100  execsql {SELECT * FROM xy LEFT JOIN ab ON 0 WHERE NULL}101} {}102do_test join5-2.11 {103  execsql {SELECT * FROM xy LEFT JOIN ab ON 1 WHERE NULL}104} {}105do_test join5-2.12 {106  execsql {SELECT * FROM xy LEFT JOIN ab ON NULL WHERE NULL}107} {}108 109# Ticket https://sqlite.org/src/tktview/6f2222d550f5b0ee7ed37601110# Incorrect output on a LEFT JOIN.111#112do_execsql_test join5-3.1 {113  DROP TABLE IF EXISTS t1;114  DROP TABLE IF EXISTS t2;115  DROP TABLE IF EXISTS t3;116  CREATE TABLE x1(a);117  INSERT INTO x1 VALUES(1);118  CREATE TABLE x2(b NOT NULL);119  CREATE TABLE x3(c, d);120  INSERT INTO x3 VALUES('a', NULL);121  INSERT INTO x3 VALUES('b', NULL);122  INSERT INTO x3 VALUES('c', NULL);123  SELECT * FROM x1 LEFT JOIN x2 LEFT JOIN x3 ON x3.d = x2.b;124} {1 {} {} {}}125do_execsql_test join5-3.2 {126  DROP TABLE IF EXISTS t1;127  DROP TABLE IF EXISTS t2;128  DROP TABLE IF EXISTS t3;129  DROP TABLE IF EXISTS t4;130  DROP TABLE IF EXISTS t5;131  CREATE TABLE t1(x text NOT NULL, y text);132  CREATE TABLE t2(u text NOT NULL, x text NOT NULL);133  CREATE TABLE t3(w text NOT NULL, v text);134  CREATE TABLE t4(w text NOT NULL, z text NOT NULL);135  CREATE TABLE t5(z text NOT NULL, m text);136  INSERT INTO t1 VALUES('f6d7661f-4efe-4c90-87b5-858e61cd178b',NULL);137  INSERT INTO t1 VALUES('f6ea82c3-2cad-45ce-ae8f-3ddca4fb2f48',NULL);138  INSERT INTO t1 VALUES('f6f47499-ecb4-474b-9a02-35be73c235e5',NULL);139  INSERT INTO t1 VALUES('56f47499-ecb4-474b-9a02-35be73c235e5',NULL);140  INSERT INTO t3 VALUES('007f2033-cb20-494c-b135-a1e4eb66130c',141                        'f6d7661f-4efe-4c90-87b5-858e61cd178b');142  SELECT *143    FROM t3144         INNER JOIN t1 ON t1.x= t3.v AND t1.y IS NULL145         LEFT JOIN t4  ON t4.w = t3.w146         LEFT JOIN t5  ON t5.z = t4.z147         LEFT JOIN t2  ON t2.u = t5.m148         LEFT JOIN t1 xyz ON xyz.y = t2.x;149} {007f2033-cb20-494c-b135-a1e4eb66130c f6d7661f-4efe-4c90-87b5-858e61cd178b f6d7661f-4efe-4c90-87b5-858e61cd178b {} {} {} {} {} {} {} {} {}}150do_execsql_test join5-3.3 {151  DROP TABLE IF EXISTS x1;152  DROP TABLE IF EXISTS x2;153  DROP TABLE IF EXISTS x3;154  CREATE TABLE x1(a);155  INSERT INTO x1 VALUES(1);156  CREATE TABLE x2(b NOT NULL);157  CREATE TABLE x3(c, d);158  INSERT INTO x3 VALUES('a', NULL);159  INSERT INTO x3 VALUES('b', NULL);160  INSERT INTO x3 VALUES('c', NULL);161  SELECT * FROM x1 LEFT JOIN x2 JOIN x3 WHERE x3.d = x2.b;162} {}163 164# Ticket https://sqlite.org/src/tktview/c2a19d81652f40568c770c43 on165# 2015-08-20.  LEFT JOIN and the push-down optimization.166#167do_execsql_test join5-4.1 {168  SELECT *169  FROM (170      SELECT 'apple' fruit171      UNION ALL SELECT 'banana'172  ) a173  JOIN (174      SELECT 'apple' fruit175      UNION ALL SELECT 'banana'176  ) b ON a.fruit=b.fruit177  LEFT JOIN (178      SELECT 1 isyellow179  ) c ON b.fruit='banana';180} {apple apple {} banana banana 1}181do_execsql_test join5-4.2 {182  SELECT *183    FROM (SELECT 'apple' fruit UNION ALL SELECT 'banana')184         LEFT JOIN (SELECT 1) ON fruit='banana';185} {apple {} banana 1}186 187#-------------------------------------------------------------------------188do_execsql_test 5.0 {189  CREATE TABLE y1(x, y, z);190  INSERT INTO y1 VALUES(0, 0, 1);191  CREATE TABLE y2(a);192}193 194do_execsql_test 5.1 {195  SELECT count(z) FROM y1 LEFT JOIN y2 ON x GROUP BY y;196} 1197 198do_execsql_test 5.2 {199  SELECT count(z) FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x GROUP BY y;200} 1201 202do_execsql_test 5.3 {203  CREATE VIEW v1 AS SELECT x, y, z FROM y1;204  SELECT count(z) FROM v1 LEFT JOIN y2 ON x GROUP BY y;205} 1206 207do_execsql_test 5.4 {208  SELECT count(z) FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x209} 1210 211do_execsql_test 5.5 {212  SELECT * FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x213} {0 0 1 {}}214 215#-------------------------------------------------------------------------216#217reset_db218do_execsql_test 6.1 {219  CREATE TABLE t1(x); 220  INSERT INTO t1 VALUES(1);221 222  CREATE TABLE t2(y INTEGER PRIMARY KEY,a,b);223  INSERT INTO t2 VALUES(1,2,3);224  CREATE INDEX t2a ON t2(a); 225  CREATE INDEX t2b ON t2(b); 226}227 228do_execsql_test 6.2 {229  SELECT * FROM t1 LEFT JOIN t2 ON a=2 OR b=3 WHERE y IS NULL;230} {}231 232do_execsql_test 6.3.1 {233  CREATE TABLE t3(x);234  INSERT INTO t3 VALUES(1);235  CREATE TABLE t4(y, z);236  SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y);237} {!!!}238 239do_execsql_test 6.3.2 {240  CREATE INDEX t4i ON t4(y, ifnull(z, '!!!'));241  SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y);242} {!!!}243 244# 2019-02-08 https://sqlite.org/src/info/4e8e4857d32d401f245reset_db246do_execsql_test 6.100 {247  CREATE TABLE t1(aa, bb);248  CREATE INDEX t1x1 on t1(abs(aa), abs(bb));249  INSERT INTO t1 VALUES(-2,-3),(+2,-3),(-2,+3),(+2,+3);250  SELECT * FROM (t1) 251   WHERE ((abs(aa)=1 AND 1=2) OR abs(aa)=2)252     AND abs(bb)=3253  ORDER BY +1, +2;254} {-2 -3 -2 3 2 -3 2 3}255 256#-------------------------------------------------------------------------257#258reset_db259do_execsql_test 7.0 {260  CREATE TABLE t1(x);261  INSERT INTO t1 VALUES(1);262}263 264do_execsql_test 7.1 {265  CREATE TABLE t2(x, y, z);266  CREATE INDEX t2xy ON t2(x, y);267  WITH s(i) AS (268    SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000269  )270  INSERT INTO t2 SELECT i/10, i, NULL FROM s;271  ANALYZE;272}273 274do_eqp_test 7.2 {275  SELECT * FROM t1 LEFT JOIN t2 ON (276    t2.x = t1.x AND (t2.y=? OR (t2.y=? AND t2.z IS NOT NULL))277  );278} {279  QUERY PLAN280  |--SCAN t1281  `--MULTI-INDEX OR282     |--INDEX 1283     |  `--SEARCH t2 USING INDEX t2xy (x=? AND y=?) LEFT-JOIN284     `--INDEX 2285        `--SEARCH t2 USING INDEX t2xy (x=? AND y=?) LEFT-JOIN286}287 288do_execsql_test 7.3 {289  CREATE TABLE t3(x);290  INSERT INTO t3(x) VALUES(1);291  CREATE INDEX t3x ON t3(x);292 293  CREATE TABLE t4(x, y, z);294  CREATE INDEX t4xy ON t4(x, y);295  CREATE INDEX t4xz ON t4(x, z);296 297  WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000)298  INSERT INTO t4 SELECT i/10, i, i FROM s;299 300  ANALYZE;301  UPDATE sqlite_stat1 SET stat='1000000 10 1' WHERE idx='t3x';302  ANALYZE sqlite_schema;303}304 305# If both sides of the OR reference the right-hand side of the LEFT JOIN306# then simplify the LEFT JOIN.307#308do_eqp_test 7.4 {309  SELECT * FROM t3 LEFT JOIN t4 ON (t4.x = t3.x) WHERE (t4.y = ? OR t4.z = ?);310} {311  QUERY PLAN312  |--SCAN t4313  `--SEARCH t3 USING COVERING INDEX t3x (x=?)314} 315# If only one side of the OR references the right-hand side of the LEFT JOIN316# then do not do the simplification317#318do_eqp_test 7.4b {319  SELECT * FROM t3 LEFT JOIN t4 ON (t4.x = t3.x) WHERE (t4.y = ? OR t3.x = ?);320} {321  QUERY PLAN322  |--SCAN t3323  `--SEARCH t4 USING INDEX t4xz (x=?) LEFT-JOIN324} 325do_eqp_test 7.4c {326  SELECT * FROM t3 LEFT JOIN t4 ON (t4.x = t3.x) WHERE (t3.x = ? OR t4.z = ?);327} {328  QUERY PLAN329  |--SCAN t3330  `--SEARCH t4 USING INDEX t4xz (x=?) LEFT-JOIN331} 332do_eqp_test 7.4d {333  SELECT * FROM t3 CROSS JOIN t4 ON (t4.x = t3.x) WHERE (+t4.y = ? OR t4.z = ?);334} {335  QUERY PLAN336  |--SCAN t3337  |--BLOOM FILTER ON t4 (x=?)338  `--SEARCH t4 USING INDEX t4xz (x=?)339} 340 341reset_db342do_execsql_test 8.0 {343  CREATE TABLE t0 (c0, c1, PRIMARY KEY (c0, c1));344  CREATE TABLE t1 (c0);345 346  INSERT INTO t1 VALUES (2);347 348  INSERT INTO t0 VALUES(0, 10);349  INSERT INTO t0 VALUES(1, 10);350  INSERT INTO t0 VALUES(2, 10);351  INSERT INTO t0 VALUES(3, 10);352}353 354do_execsql_test 8.1 {355  SELECT * FROM t0, t1 356  WHERE (t0.c1 >= 1 OR t0.c1 < 1) AND t0.c0 IN (1, t1.c0) ORDER BY 1;357} {358  1 10 2359  2 10 2360}361 362 363# 2022-01-31 dbsqlfuzz 787d9bd73164c6f0c85469e2e48b2aff19af6938364#365reset_db366do_execsql_test 9.1 {367  CREATE TABLE t1(a ,b FLOAT);368  INSERT INTO t1 VALUES(1,1);369  CREATE INDEX t1x1 ON t1(a,b,a,a,a,a,a,a,a,a,a,b);370  ANALYZE sqlite_schema;371  INSERT INTO sqlite_stat1 VALUES('t1','t1x1','648 324 81 81 81 81 81 81 81081 81 81 81');372  ANALYZE sqlite_schema;373}374do_catchsql_test 9.2 {375  SELECT a FROM 376      (SELECT a FROM t1 NATURAL LEFT JOIN t1) NATURAL LEFT JOIN t1 377  WHERE (rowid,1)<=(5,0);378} {0 1}379 380# 2022-03-02 https://sqlite.org/forum/info/50a1bbe08ce4c29c381# Bloom-filter pulldown is incompatible with skip-scan.382#383reset_db384do_execsql_test 10.1 {385  CREATE TABLE t1(x INT);386  WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)387    INSERT INTO t1(x) SELECT 0 FROM c;388  CREATE INDEX t1x1 ON t1(x BETWEEN 0 AND 10, x);389  ANALYZE;390  DELETE FROM t1;391  INSERT INTO t1 VALUES(0),(0);392  CREATE VIEW v1 AS SELECT * FROM t1 NATURAL JOIN t1 WHERE (x BETWEEN 0 AND 10) OR true;393  CREATE VIEW v2 AS SELECT * FROM v1 NATURAL JOIN v1;394  CREATE VIEW v3 AS SELECT * FROM v2, v1 USING (x) GROUP BY x;395  SELECT x FROM v3; 396} {0}397 398# 2022-03-24 https://sqlite.org/forum/forumpost/031e262a89b6a9d2399# Bloom-filter on a LEFT JOIN with NULL-based WHERE constraints.400#401reset_db402do_execsql_test 11.1 {403  CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT);404  CREATE TABLE t2(c INTEGER PRIMARY KEY, d INT);405  WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<8)406  INSERT INTO t1(a,b) SELECT x, 10*x FROM c;407  INSERT INTO t2(c,d) SELECT b*2, 100*a FROM t1;408  ANALYZE;409  DELETE FROM sqlite_stat1;410  INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES411    ('t1',NULL,150105),('t2',NULL,98747);412  ANALYZE sqlite_schema;413} {}414do_execsql_test 11.2 {415  SELECT count(*) FROM t1 LEFT JOIN t2 ON c=b WHERE d IS NULL;416} {4}417do_execsql_test 11.3 {418  SELECT count(*) FROM t1 LEFT JOIN t2 ON c=b WHERE d=100;419} {1}420do_execsql_test 11.4 {421  SELECT count(*) FROM t1 LEFT JOIN t2 ON c=b WHERE d>=300;422} {2}423 424# 2022-05-03 https://sqlite.org/forum/forumpost/2482b32700384a0f425# Bloom-filter pull-down does not handle NOT NULL constraints correctly.426#427reset_db428do_execsql_test 12.1 {429  CREATE TABLE t1(a INT, b INT, c INT);430  WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100)431    INSERT INTO t1(a,b,c) SELECT x, x*1000, x*1000000 FROM c;432  CREATE TABLE t2(b INT, x INT);433  INSERT INTO t2(b,x) SELECT b, a FROM t1 WHERE a%3==0;434  CREATE INDEX t2b ON t2(b);435  CREATE TABLE t3(c INT, y INT);436  INSERT INTO t3(c,y) SELECT c, a FROM t1 WHERE a%4==0;437  CREATE INDEX t3c ON t3(c);438  INSERT INTO t1(a,b,c) VALUES(200, 200000, NULL);439  ANALYZE;440} {}441do_execsql_test 12.2 {442  SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3 WHERE x>0 AND y>0443  ORDER BY +a;444} {445  12  12000  12000000  12  12446  24  24000  24000000  24  24447  36  36000  36000000  36  36448  48  48000  48000000  48  48449  60  60000  60000000  60  60450  72  72000  72000000  72  72451  84  84000  84000000  84  84452  96  96000  96000000  96  96453}454 455 456 457 458finish_test459