From: drh <> Date: Tue, 2 Nov 2021 20:52:20 +0000 (+0000) Subject: Proposed fix for a problem associated with OP_SeekScan that results in an X-Git-Tag: version-3.37.0~70^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d742e39d98d8553cb321005431ece612979b635;p=thirdparty%2Fsqlite.git Proposed fix for a problem associated with OP_SeekScan that results in an incorrect answer. See ticket [5981a8c041a3c2f3]. FossilOrigin-Name: 266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea --- diff --git a/manifest b/manifest index 369230c588..fd01919a89 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index ed9c4a7438..a58ff01aed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590 \ No newline at end of file +266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4dc94f7fa0..460ac4fe30 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -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 ){ diff --git a/test/in4.test b/test/in4.test index 45ffa71fc5..a3fe22e787 100644 --- a/test/in4.test +++ b/test/in4.test @@ -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