]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Proposed fix for a problem associated with OP_SeekScan that results in an seekscan-fix-20211102
authordrh <>
Tue, 2 Nov 2021 20:52:20 +0000 (20:52 +0000)
committerdrh <>
Tue, 2 Nov 2021 20:52:20 +0000 (20:52 +0000)
incorrect answer.  See ticket [5981a8c041a3c2f3].

FossilOrigin-Name: 266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea

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

index 369230c588a8b8c183398ddb5bb8f7e036f82418..fd01919a89aab230160d2b166e4a82d29a24f6f4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Ensure\sthat\sALTER\sTABLE\sRENAME\srecognizes\sOOM\serrors\swhile\sparsing\ndependent\striggers\sand\shandles\sthem\sappropriately.\ndbsqlfuzz\s53e245eee15d3f19639d773048aa955c30708785.
-D 2021-11-02T17:55:01.854
+C Proposed\sfix\sfor\sa\sproblem\sassociated\swith\sOP_SeekScan\sthat\sresults\sin\san\nincorrect\sanswer.\s\sSee\sticket\s[5981a8c041a3c2f3].
+D 2021-11-02T20:52:20.405
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -638,7 +638,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
 F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187
 F src/whereInt.h 83877a75a1bce056ea44aff02f1dfa958ad1d6038c213ddadb8652003b45151d
-F src/wherecode.c a1d79cc5a11f44b079bf2352e542ddb265f84cfa6c835d40a9f195dbe5fff83e
+F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33
 F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825
 F src/window.c 0dff6fedf61493490d21ced5d7a7b4321d4c0db6c8123f0179c46080a860850a
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@@ -1082,7 +1082,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8
 F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3
 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0
-F test/in4.test e09987d4f2213f9e32a558c5dee4cfa945e2ce7ec0980aae42c2ca453a8ce01a
+F test/in4.test fdd1d8134da8376985c2edba6035a2de1f6c731524d2ffa651419e8fe2cd1c5a
 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f
 F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b
 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822
@@ -1930,7 +1930,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4d70f27b7b5681cfdf1c44ac654e565ccff089e74d3edf6660578e04e4b0c9b9
-R 020065121bfbc86728d941bc72e402a9
+P 1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590
+R c61e36c2c71ed29e0021479206aa1f46
+T *branch * seekscan-fix-20211102
+T *sym-seekscan-fix-20211102 *
+T -sym-trunk *
 U drh
-Z e8c092d55961c0a6fa1569dc7a482ee4
+Z e64ad9687c89edc17b6580d2562f23a1
index ed9c4a74387384e8fb6423e2e406fad5c0a366f4..a58ff01aedc606ef38fcaeededae92c4125e2d27 100644 (file)
@@ -1 +1 @@
-1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590
\ No newline at end of file
+266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea
\ No newline at end of file
index 4dc94f7fa0a4b4ce7d0e668a7851d7230f32712e..460ac4fe30a123f325bc667a1734e22f00e19399 100644 (file)
@@ -1884,8 +1884,19 @@ Bitmask sqlite3WhereCodeOneLoopStart(
     ** range (if any).
     */
     nConstraint = nEq;
+    assert( pLevel->p2==0 );
     if( pRangeEnd ){
       Expr *pRight = pRangeEnd->pExpr->pRight;
+      if( addrSeekScan ){
+        /* For a seek-scan that has a range on the lowest term of the index,
+        ** we have to make the top of the loop be code that sets the end
+        ** condition of the range.  Otherwise, the OP_SeekScan might jump
+        ** over that initialization, leaving the range-end value set to the
+        ** range-start value, resulting in a wrong answer.
+        ** See ticket 5981a8c041a3c2f3 (2021-11-02).
+        */
+        pLevel->p2 = sqlite3VdbeCurrentAddr(v);
+      }
       codeExprOrVector(pParse, pRight, regBase+nEq, nTop);
       whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd);
       if( (pRangeEnd->wtFlags & TERM_VNULL)==0
@@ -1919,7 +1930,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
     sqlite3DbFree(db, zEndAff);
 
     /* Top of the loop body */
-    pLevel->p2 = sqlite3VdbeCurrentAddr(v);
+    if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(v);
 
     /* Check if the index cursor is past the end of the range. */
     if( nConstraint ){
index 45ffa71fc56ac857959b5597d3b1093cede35736..a3fe22e78760d9644e09527c32d06980caad1ed4 100644 (file)
@@ -496,4 +496,25 @@ do_execsql_test 12.1 {
       OR (b = 1119 AND c IN (1115, 1023));
 } {56 1119 1115}
 
+# 2021-11-02 ticket 5981a8c041a3c2f3
+# Another OP_SeekScan problem.
+#
+reset_db
+do_execsql_test 13.0 {
+  CREATE TABLE t1(id INTEGER PRIMARY KEY, a INT, b INT, c INT);
+  INSERT INTO t1 VALUES(10,1,2,5);
+  INSERT INTO t1 VALUES(20,1,3,5);
+  INSERT INTO t1 VALUES(30,1,2,4);
+  INSERT INTO t1 VALUES(40,1,3,4);
+  ANALYZE sqlite_master;
+  INSERT INTO sqlite_stat1 VALUES('t1','t1x','84000 3 2 1');
+  CREATE INDEX t1x ON t1(a,b,c);
+  PRAGMA writable_schema=RESET;
+  SELECT * FROM t1
+   WHERE a=1
+     AND b IN (2,3)
+     AND c BETWEEN 4 AND 5
+   ORDER BY +id;
+} {10 1 2 5 20 1 3 5 30 1 2 4 40 1 3 4}
+
 finish_test