]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not attempt to read values from indexes-on-expressions if the index is on
authordan <dan@noemail.net>
Tue, 24 Apr 2018 14:05:14 +0000 (14:05 +0000)
committerdan <dan@noemail.net>
Tue, 24 Apr 2018 14:05:14 +0000 (14:05 +0000)
the RHS of a LEFT JOIN. This won't work if the index cursor points at a
null-row. Fix for [7fa80496].

FossilOrigin-Name: b8ef967ab1bebf2846c06c4f7200d6fa1c60e52e55711ea171c25ef1331f8a24

manifest
manifest.uuid
src/wherecode.c
test/join5.test

index 1b91cf4bbff4f68e9a4ae1f5d144de6f94669445..cf89f5e1383570920a481b9799df7d0cc7cbb227 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\sCLI\sto\srender\sEXPLAIN\sQUERY\sPLAN\susing\san\sASCII-art\sgraph.\nThis\sworks\swith\s".eqp"\smodes\sand\swhen\sthe\squery\sbegins\swith\sexactly\n"EXPLAIN\sQUERY\sPLAN".\s\sTo\ssee\sthe\soriginal\soutput\sformat,\sadd\sextra\sspace\ncharacters\sin\sbetween\swords\sof\sthe\sinitial\s"EXPLAIN\sQUERY\sPLAN".
-D 2018-04-24T13:07:40.157
+C Do\snot\sattempt\sto\sread\svalues\sfrom\sindexes-on-expressions\sif\sthe\sindex\sis\son\nthe\sRHS\sof\sa\sLEFT\sJOIN.\sThis\swon't\swork\sif\sthe\sindex\scursor\spoints\sat\sa\nnull-row.\sFix\sfor\s[7fa80496].
+D 2018-04-24T14:05:14.035
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439
@@ -578,7 +578,7 @@ F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
 F src/walker.c da987a20d40145c0a03c07d8fefcb2ed363becc7680d0500d9c79915591f5b1f
 F src/where.c d6e5f2056e9a60251e79780fc598a5943e88a3c0fa0019d54922e59f99019287
 F src/whereInt.h 2610cb87dd95509995b63decc674c60f2757697a206cfe0c085ee53d9c43cfff
-F src/wherecode.c 982b7450c53fb272f61a1d20c93e960260ea4dfe8e2e9bacc190e2a041a1f1a4
+F src/wherecode.c 4de722661ba6195b021a74cc1e83b16371c915bdc85bea64fcf6eb2393e7ec34
 F src/whereexpr.c 53532be687e12f3cd314f1e204cd4fbdac7ad250e918a182b048121e16e828ae
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
@@ -1011,7 +1011,7 @@ F test/join.test 2ad9d7fe10e0cc06bc7803c22e5533be11cdadbc592f5f95d789a873b57a5a6
 F test/join2.test f5ea0fd3b0a441c8e439706339dcd17cec63a896a755c04a30bfd442ecce1190
 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0
 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
-F test/join5.test c6bd62effc37a152bea735f9ef241b19bb967bd4593dc99b20e2fc55ae707e38
+F test/join5.test cb052e7126fe3492dce2e851b980b487a823a0a4cb2ce2d773c92f14a453dad7
 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b
 F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
@@ -1725,7 +1725,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 526ee07d19dbc8fd1af3a02a8da12b337020a4be40e045da9a19d0a7c2b6ab54
-R 323bb39941d10967c90ecfca0b4f8d04
-U drh
-Z 4c6744b715a014be6e9e8316d023f834
+P f53716ee2ab5a6d47a5551529aae526bb39058f4a8e11e6243b32c1ddc25a19e
+R 576dda7dc4ffa6d3127f5299077dad5b
+U dan
+Z ae1de0364f217c69ebe7b240252e823b
index 86965cd3c7929610a4c45c73f747cdef214df913..d97537e0b377166f57ad51f36104d0ec45f901fc 100644 (file)
@@ -1 +1 @@
-f53716ee2ab5a6d47a5551529aae526bb39058f4a8e11e6243b32c1ddc25a19e
\ No newline at end of file
+b8ef967ab1bebf2846c06c4f7200d6fa1c60e52e55711ea171c25ef1331f8a24
\ No newline at end of file
index 47fc92fc5eb7335c5ef4dd6d517fed45a4c99101..ec61229e73d961d0637a1b06c636eb4955dc1e3d 100644 (file)
@@ -1748,9 +1748,16 @@ Bitmask sqlite3WhereCodeOneLoopStart(
     /* If pIdx is an index on one or more expressions, then look through
     ** all the expressions in pWInfo and try to transform matching expressions
     ** into reference to index columns.
+    **
+    ** Do not do this for the RHS of a LEFT JOIN. This is because the 
+    ** expression may be evaluated after OP_NullRow has been executed on
+    ** the cursor. In this case it is important to do the full evaluation,
+    ** as the result of the expression may not be NULL, even if all table
+    ** column values are.
     */
-    whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
-
+    if( pLevel->iLeftJoin==0 ){
+      whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo);
+    }
 
     /* Record the instruction used to terminate the loop. */
     if( pLoop->wsFlags & WHERE_ONEROW ){
index c2bf1e3f6a27859a51b0bcb612e812cbeca6b332..9e994cede5c09cf99815f9982ce27991a23cf547 100644 (file)
@@ -212,4 +212,34 @@ do_execsql_test 5.5 {
   SELECT * FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x
 } {0 0 1 {}}
 
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 6.1 {
+  CREATE TABLE t1(x); 
+  INSERT INTO t1 VALUES(1);
+
+  CREATE TABLE t2(y INTEGER PRIMARY KEY,a,b);
+  INSERT INTO t2 VALUES(1,2,3);
+  CREATE INDEX t2a ON t2(a); 
+  CREATE INDEX t2b ON t2(b); 
+}
+
+do_execsql_test 6.2 {
+  SELECT * FROM t1 LEFT JOIN t2 ON a=2 OR b=3 WHERE y IS NULL;
+} {}
+
+do_execsql_test 6.3.1 {
+  CREATE TABLE t3(x);
+  INSERT INTO t3 VALUES(1);
+  CREATE TABLE t4(y, z);
+  SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y);
+} {!!!}
+
+do_execsql_test 6.3.2 {
+  CREATE INDEX t4i ON t4(y, ifnull(z, '!!!'));
+  SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y);
+} {!!!}
+
 finish_test
+