From 74ebaadcdd8b1058bbc80bf61334fe09da1c64b5 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 4 Jan 2020 16:55:57 +0000 Subject: [PATCH 1/7] Fix a problem where the loop for the RHS of a LEFT JOIN uses values from an IN() clause as the second or subsequent field of an index. FossilOrigin-Name: 95ef68966c50f311830cba8c9257a4085c93011d205e0e31867c2917fa62a48e --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 15 ++++++++++++++- src/where.c | 24 ++++++++++++++++++++---- src/wherecode.c | 2 +- test/in4.test | 24 ++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 6fb8d9498c..0f4f6bb572 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfalse-positive\sin\sthe\sregister\svalidity\stracking\slogic\sby\smoving\sthe\ntemporary\sregister\srelease\scall\sbefore\sthe\sjump\sthat\suses\sthat\stemporary\nregister. -D 2020-01-04T15:21:47.201 +C Fix\sa\sproblem\swhere\sthe\sloop\sfor\sthe\sRHS\sof\sa\sLEFT\sJOIN\suses\svalues\sfrom\san\sIN()\sclause\sas\sthe\ssecond\sor\ssubsequent\sfield\sof\san\sindex. +D 2020-01-04T16:55:57.635 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 459a233a60aba8b8b2462f42bd6e93623e13beafc5e0c40c6646e0527e444fd0 +F src/vdbe.c 204a59d9f678ac8a1479d7506ac85787834470a6db1bb799280878c24fea8af3 F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -614,9 +614,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 9353093c2a444580857006fc959494edc40e2393ac08a1f7e1eefe455c079cdb +F src/where.c 4ca6c066554247a69dc54616755f68c301c16e23ec36d40170f07763fd0737b3 F src/whereInt.h d2b771335083070ff82991cc43603e2db27b7ba1313da72de092c50c68f2be9c -F src/wherecode.c b8acf97f95de7398455e238036e96aeda8563d87c6b8108c967396431b6f2307 +F src/wherecode.c 75ad6cbb8dfe585ffe0fc71008750b5158fc4811c3a498327033920b18f0a4be F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1036,7 +1036,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 3e9bd58597a444123a40a9ac94cae0fec8897e17e9f519b02fc370bcf5ba5175 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 0f77b0ff371549e6a119d0356be10bdba72258162e9701e83527a560482f5e98 +F test/in4.test 0dbdbed68303443e769df42f1d0aa9411bd968254f44c77538e6a60547bc0268 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test 62d943a02f722948f4410ee0b53c3cb39acd7c41afb083df8d7004238fe90a20 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1853,7 +1853,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 139aefe60097e06b43df35652e6b2183b7a4b03341d1bde23deada3fa3358fee -R 11e5473b5143d7846f38adea04bf0957 -U drh -Z a198852404260f5a9fb2ceb446a14f63 +P 9da48a5ca66dc67c8f7fb2d2471dac7ea696e35ecba5ddf65747d08d452436c1 +R e96127660ca8159860f3384d23839e06 +U dan +Z 1ba10d632e5123673848baa09ec8907f diff --git a/manifest.uuid b/manifest.uuid index 82ee04580c..d577ab803a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9da48a5ca66dc67c8f7fb2d2471dac7ea696e35ecba5ddf65747d08d452436c1 \ No newline at end of file +95ef68966c50f311830cba8c9257a4085c93011d205e0e31867c2917fa62a48e \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5479a311b1..8ddc904d18 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4374,7 +4374,7 @@ seek_not_found: ** Synopsis: seekHit=P2 ** ** Set the seekHit flag on cursor P1 to the value in P2. -** The seekHit flag is used by the IfNoHope opcode. +* The seekHit flag is used by the IfNoHope opcode. ** ** P1 must be a valid b-tree cursor. P2 must be a boolean value, ** either 0 or 1. @@ -4389,6 +4389,19 @@ case OP_SeekHit: { break; } +/* Opcode: IfNotOpen P1 P2 * * * +** Synopsis: if( !csr[P1] ) goto P2 +** +** If cursor P1 is not open, jump to instruction P2. Otherwise, fall through. +*/ +case OP_IfNotOpen: { /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + if( !p->apCsr[pOp->p1] ){ + goto jump_to_p2_and_check_for_interrupt; + } + break; +} + /* Opcode: Found P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** diff --git a/src/where.c b/src/where.c index 0877b80dd3..075276168c 100644 --- a/src/where.c +++ b/src/where.c @@ -5273,10 +5273,26 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pIn->eEndLoopOp!=OP_Noop ){ if( pIn->nPrefix ){ assert( pLoop->wsFlags & WHERE_IN_EARLYOUT ); - sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, - sqlite3VdbeCurrentAddr(v)+2, - pIn->iBase, pIn->nPrefix); - VdbeCoverage(v); + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, + sqlite3VdbeCurrentAddr(v)+2+(pLevel->iLeftJoin!=0), + pIn->iBase, pIn->nPrefix); + VdbeCoverage(v); + } + if( pLevel->iLeftJoin ){ + /* For LEFT JOIN queries, cursor pIn->iCur may not have been + ** opened yet. This occurs for WHERE clauses such as + ** "a = ? AND b IN (...)", where the index is on (a, b). If + ** the RHS of the (a=?) is NULL, then the "b IN (...)" may + ** never have been coded, but the body of the loop run to + ** return the null-row. So, if the cursor is not open yet, + ** jump over the OP_Next or OP_Prev instruction about to + ** be coded. */ + sqlite3VdbeAddOp2(v, OP_IfNotOpen, pIn->iCur, + sqlite3VdbeCurrentAddr(v) + 2 + ); + VdbeCoverage(v); + } } sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); VdbeCoverage(v); diff --git a/src/wherecode.c b/src/wherecode.c index beb23e0c18..03e393498e 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -593,7 +593,7 @@ static int codeEqualityTerm( if( i==iEq ){ pIn->iCur = iTab; pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; - if( iEq>0 && (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + if( iEq>0 ){ pIn->iBase = iReg - i; pIn->nPrefix = i; pLoop->wsFlags |= WHERE_IN_EARLYOUT; diff --git a/test/in4.test b/test/in4.test index 787b9ea36c..ef87d8d3f0 100644 --- a/test/in4.test +++ b/test/in4.test @@ -13,6 +13,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix in4 do_test in4-1.1 { execsql { @@ -338,5 +339,28 @@ do_execsql_test in4-6.2-eqp { SELECT * FROM t6a, t6b WHERE a=3 AND c IN (b); } {~/SCAN/} +reset_db +do_execsql_test 7.0 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(d, e); + CREATE INDEX t1bc ON t1(c, b); + INSERT INTO t2(e) VALUES(1); + INSERT INTO t1 VALUES(NULL, NULL, NULL); +} + +do_execsql_test 7.1 { + SELECT * FROM t2 LEFT JOIN t1 ON c = d AND b IN (10,10,10); +} {{} 1 {} {} {}} + +reset_db +do_execsql_test 7.2 { + CREATE VIRTUAL TABLE t1 USING rtree(a, b, c); + CREATE TABLE t2(d INTEGER, e INT); + INSERT INTO t2(e) VALUES(1); +} + +do_execsql_test 7.3 { + SELECT * FROM t2 LEFT JOIN t1 ON c IN (d) AND b IN (10,10,10); +} {{} 1 {} {} {}} finish_test From 6f2180d21a3eea2f4876f43ff2f8b54e407d4651 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 4 Jan 2020 17:42:27 +0000 Subject: [PATCH 2/7] New test cases in test/in4.test require rtree, so disable those tests on builds that lack the rtree extension. FossilOrigin-Name: b5900914f7f34caf1a97c87233781d55467329b0ac4366354df13c6fd72a99c7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/in4.test | 20 +++++++++++--------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 0f4f6bb572..bad6a86b0c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swhere\sthe\sloop\sfor\sthe\sRHS\sof\sa\sLEFT\sJOIN\suses\svalues\sfrom\san\sIN()\sclause\sas\sthe\ssecond\sor\ssubsequent\sfield\sof\san\sindex. -D 2020-01-04T16:55:57.635 +C New\stest\scases\sin\stest/in4.test\srequire\srtree,\sso\sdisable\sthose\stests\son\nbuilds\sthat\slack\sthe\srtree\sextension. +D 2020-01-04T17:42:27.049 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1036,7 +1036,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 3e9bd58597a444123a40a9ac94cae0fec8897e17e9f519b02fc370bcf5ba5175 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 0dbdbed68303443e769df42f1d0aa9411bd968254f44c77538e6a60547bc0268 +F test/in4.test 65460600d48933adba4283c6ebd089aae173d16136ab9d01f74c89089090c5a5 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test 62d943a02f722948f4410ee0b53c3cb39acd7c41afb083df8d7004238fe90a20 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1853,7 +1853,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 9da48a5ca66dc67c8f7fb2d2471dac7ea696e35ecba5ddf65747d08d452436c1 -R e96127660ca8159860f3384d23839e06 -U dan -Z 1ba10d632e5123673848baa09ec8907f +P 95ef68966c50f311830cba8c9257a4085c93011d205e0e31867c2917fa62a48e +R fcab88c144dc799dc447a7b169c3a584 +U drh +Z f09a95387a590464d6b3dffd77efcbbf diff --git a/manifest.uuid b/manifest.uuid index d577ab803a..0a7f609316 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95ef68966c50f311830cba8c9257a4085c93011d205e0e31867c2917fa62a48e \ No newline at end of file +b5900914f7f34caf1a97c87233781d55467329b0ac4366354df13c6fd72a99c7 \ No newline at end of file diff --git a/test/in4.test b/test/in4.test index ef87d8d3f0..37eafdebec 100644 --- a/test/in4.test +++ b/test/in4.test @@ -352,15 +352,17 @@ do_execsql_test 7.1 { SELECT * FROM t2 LEFT JOIN t1 ON c = d AND b IN (10,10,10); } {{} 1 {} {} {}} -reset_db -do_execsql_test 7.2 { - CREATE VIRTUAL TABLE t1 USING rtree(a, b, c); - CREATE TABLE t2(d INTEGER, e INT); - INSERT INTO t2(e) VALUES(1); +ifcapable rtree { + reset_db + do_execsql_test 7.2 { + CREATE VIRTUAL TABLE t1 USING rtree(a, b, c); + CREATE TABLE t2(d INTEGER, e INT); + INSERT INTO t2(e) VALUES(1); + } + + do_execsql_test 7.3 { + SELECT * FROM t2 LEFT JOIN t1 ON c IN (d) AND b IN (10,10,10); + } {{} 1 {} {} {}} } -do_execsql_test 7.3 { - SELECT * FROM t2 LEFT JOIN t1 ON c IN (d) AND b IN (10,10,10); -} {{} 1 {} {} {}} - finish_test From 64f7ee021943e0d652f8fb86d887e63c63f02ea2 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 4 Jan 2020 17:55:01 +0000 Subject: [PATCH 3/7] Remove another NEVER added by check-in [7b62555e285f32d3]. Dbsqlfuzz found another test case. FossilOrigin-Name: 481f4956aff52797880930752693a8c0b10d7fdd71d86919fe8ee13c90ad5b81 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 1726464 -> 1728512 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bad6a86b0c..0f784c9f8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sin\stest/in4.test\srequire\srtree,\sso\sdisable\sthose\stests\son\nbuilds\sthat\slack\sthe\srtree\sextension. -D 2020-01-04T17:42:27.049 +C Remove\sanother\sNEVER\sadded\sby\scheck-in\s[7b62555e285f32d3].\nDbsqlfuzz\sfound\sanother\stest\scase. +D 2020-01-04T17:55:01.532 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 615294ab54a0f6970bfb17f97638ecbf1c0b8d475e2ea46e691cbdf11d3493a1 +F src/btree.c c457b6a97835d44b326c6579cdb382bfb8e09651e6544915b7becf8b8e539191 F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 F src/build.c 67b1a8d3ac700747687dbdc49ded847a3c17fef450a8c919ac0399b44cbd4215 @@ -1018,7 +1018,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 709b31ecba6c40e9a9e6db6a0b2ffb3938c3b4ab901e6cdc67615563d0016569 +F test/fuzzdata8.db f747246bddfff9ca89e59e5d3eda5490fabaccbf3cf2385cad47ee9f82f20e43 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1853,7 +1853,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 95ef68966c50f311830cba8c9257a4085c93011d205e0e31867c2917fa62a48e -R fcab88c144dc799dc447a7b169c3a584 +P b5900914f7f34caf1a97c87233781d55467329b0ac4366354df13c6fd72a99c7 +R 37be8c9e75659556fe3b159112795493 U drh -Z f09a95387a590464d6b3dffd77efcbbf +Z c000e07130c634d2d097fd608a612cd1 diff --git a/manifest.uuid b/manifest.uuid index 0a7f609316..4d7ede224c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5900914f7f34caf1a97c87233781d55467329b0ac4366354df13c6fd72a99c7 \ No newline at end of file +481f4956aff52797880930752693a8c0b10d7fdd71d86919fe8ee13c90ad5b81 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9c42d33755..53ea3148b0 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7104,7 +7104,7 @@ static int pageFreeArray( } pFree = pCell; szFree = sz; - if( NEVER(pFree+sz>pEnd) ) return 0; + if( pFree+sz>pEnd ) return 0; }else{ pFree = pCell; szFree += sz; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 9bff7cb7c5bfc677a9a134d25eaf3d67502daede..1a4c09c325abb9da0665e36b6a8f0b4de630cda1 100644 GIT binary patch delta 29786 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 LO@Rv@ZTY_d=+Lp? delta 29007 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 I-!8rW|H Date: Sat, 4 Jan 2020 18:33:20 +0000 Subject: [PATCH 4/7] Record when the OP_IfNotOpen branch is and is not taken. FossilOrigin-Name: 182a898b14d585edd5fcfdcd6584c957911f0d81773d2868f16b5762dec031ca --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0f784c9f8b..ad173b212c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sanother\sNEVER\sadded\sby\scheck-in\s[7b62555e285f32d3].\nDbsqlfuzz\sfound\sanother\stest\scase. -D 2020-01-04T17:55:01.532 +C Record\swhen\sthe\sOP_IfNotOpen\sbranch\sis\sand\sis\snot\staken. +D 2020-01-04T18:33:20.975 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 204a59d9f678ac8a1479d7506ac85787834470a6db1bb799280878c24fea8af3 +F src/vdbe.c 8a1cf75fc4be7a7d49f8f22f72121c9840937bbe704024260a08cd9997189deb F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1853,7 +1853,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 b5900914f7f34caf1a97c87233781d55467329b0ac4366354df13c6fd72a99c7 -R 37be8c9e75659556fe3b159112795493 +P 481f4956aff52797880930752693a8c0b10d7fdd71d86919fe8ee13c90ad5b81 +R f594eb9d0ec38ea8878d8a695e9205a6 U drh -Z c000e07130c634d2d097fd608a612cd1 +Z f7c2b4f08ecc73e3215818c3db84b227 diff --git a/manifest.uuid b/manifest.uuid index 4d7ede224c..97ca4e3862 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -481f4956aff52797880930752693a8c0b10d7fdd71d86919fe8ee13c90ad5b81 \ No newline at end of file +182a898b14d585edd5fcfdcd6584c957911f0d81773d2868f16b5762dec031ca \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 8ddc904d18..5b8b1372b0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4396,6 +4396,7 @@ case OP_SeekHit: { */ case OP_IfNotOpen: { /* jump */ assert( pOp->p1>=0 && pOp->p1nCursor ); + VdbeBranchTaken(p->apCsr[pOp->p1]==0, 2); if( !p->apCsr[pOp->p1] ){ goto jump_to_p2_and_check_for_interrupt; } From 664d80bbf78c23f84d970f2c1755afae5e86cf4f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 4 Jan 2020 18:38:58 +0000 Subject: [PATCH 5/7] Omit the omit flat from eq constraints on column "name" of dbstat virtual tables. Fix for [74a4c386]. FossilOrigin-Name: cfff5cb2279088aa66f435bd0d627b2c74c9a99ad9addfd44a4df8ba770b795a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/dbstat.c | 4 ---- test/stat.test | 7 +++++++ 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index ad173b212c..cf931dd1fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Record\swhen\sthe\sOP_IfNotOpen\sbranch\sis\sand\sis\snot\staken. -D 2020-01-04T18:33:20.975 +C Omit\sthe\somit\sflat\sfrom\seq\sconstraints\son\scolumn\s"name"\sof\sdbstat\svirtual\stables.\sFix\sfor\s[74a4c386]. +D 2020-01-04T18:38:58.874 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 -F src/dbstat.c 427b13c25884ffdf55739a1d23c989326adbba284637b9d767d1aa7b21cadfc2 +F src/dbstat.c bf7fbea4ed607f30977ae568e4729c42041024ceee4aa11100c8bb3c631d9a56 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 F src/expr.c e25df342c1b8b9b87b5d6f9990e5b36f94469b1227c0a492cb5894e379f983ea F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1376,7 +1376,7 @@ F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/stat.test f36f58c0acf5f280d1c427b94de41d9bf5877309bc1ea0f029a05f773df9fd22 +F test/stat.test 7bdfc6ae0fc11f12d2eecdb679f1ff0b84021617f3fdef4ebd2403e5bcfc4c4a F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 @@ -1853,7 +1853,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 481f4956aff52797880930752693a8c0b10d7fdd71d86919fe8ee13c90ad5b81 -R f594eb9d0ec38ea8878d8a695e9205a6 -U drh -Z f7c2b4f08ecc73e3215818c3db84b227 +P 182a898b14d585edd5fcfdcd6584c957911f0d81773d2868f16b5762dec031ca +R e5d20f1d7a3c3631aa9f23cc00d086d7 +U dan +Z 2755770051f083685d92f69a4addf7e4 diff --git a/manifest.uuid b/manifest.uuid index 97ca4e3862..99505f377c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -182a898b14d585edd5fcfdcd6584c957911f0d81773d2868f16b5762dec031ca \ No newline at end of file +cfff5cb2279088aa66f435bd0d627b2c74c9a99ad9addfd44a4df8ba770b795a \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index 262da7c373..ae38944dd7 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -237,18 +237,14 @@ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ i = 0; if( iSchema>=0 ){ pIdxInfo->aConstraintUsage[iSchema].argvIndex = ++i; - pIdxInfo->aConstraintUsage[iSchema].omit = 1; pIdxInfo->idxNum |= 0x01; } if( iName>=0 ){ pIdxInfo->aConstraintUsage[iName].argvIndex = ++i; - pIdxInfo->aConstraintUsage[iName].omit = 1; pIdxInfo->idxNum |= 0x02; } if( iAgg>=0 ){ pIdxInfo->aConstraintUsage[iAgg].argvIndex = ++i; - /* As of ticket [727074e2], this constraint is not omitted. */ - /* pIdxInfo->aConstraintUsage[iAgg].omit = 1; */ pIdxInfo->idxNum |= 0x04; } pIdxInfo->estimatedCost = 1.0; diff --git a/test/stat.test b/test/stat.test index b3edc7e28a..34f977bca1 100644 --- a/test/stat.test +++ b/test/stat.test @@ -298,6 +298,7 @@ do_catchsql_test 7.2.4 { SELECT * FROM x3; } {1 {unrecognized token: "123corp"}} + do_execsql_test 8.1 { CREATE VIRTUAL TABLE st4 USING dbstat; } @@ -307,5 +308,11 @@ do_execsql_test 8.2 { do_execsql_test 8.3 { SELECT aggregate=1 FROM st4 WHERE aggregate = 5 } +do_execsql_test 8.4 { + SELECT * FROM st4 WHERE name = NULL; +} +do_catchsql_test 8.5 { + SELECT * FROM st4 WHERE schema = NULL; +} {1 {no such schema: }} finish_test From 17aceebab75c0057cbf224d43316e5fa6cf040f7 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 4 Jan 2020 19:12:13 +0000 Subject: [PATCH 6/7] Fix harmless compiler warnings. FossilOrigin-Name: 8452fe03430d34abecab618d6136b863630f91d68d69ebbc115f808bc81c3817 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 6 ++++++ src/whereInt.h | 8 ++++---- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index cf931dd1fb..2e28981e59 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\somit\sflat\sfrom\seq\sconstraints\son\scolumn\s"name"\sof\sdbstat\svirtual\stables.\sFix\sfor\s[74a4c386]. -D 2020-01-04T18:38:58.874 +C Fix\sharmless\scompiler\swarnings. +D 2020-01-04T19:12:13.469 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 8a1cf75fc4be7a7d49f8f22f72121c9840937bbe704024260a08cd9997189deb +F src/vdbe.c d0e32097985670ff4afee241f2c1f6f466fe12b41f9c2d6a014ec0ba8a793f6f F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -615,7 +615,7 @@ F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c 4ca6c066554247a69dc54616755f68c301c16e23ec36d40170f07763fd0737b3 -F src/whereInt.h d2b771335083070ff82991cc43603e2db27b7ba1313da72de092c50c68f2be9c +F src/whereInt.h e1d1db6bbec0ba4f345acc338f956c8237a6f06413afa68c6414e82fb5b06745 F src/wherecode.c 75ad6cbb8dfe585ffe0fc71008750b5158fc4811c3a498327033920b18f0a4be F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a @@ -1853,7 +1853,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 182a898b14d585edd5fcfdcd6584c957911f0d81773d2868f16b5762dec031ca -R e5d20f1d7a3c3631aa9f23cc00d086d7 -U dan -Z 2755770051f083685d92f69a4addf7e4 +P cfff5cb2279088aa66f435bd0d627b2c74c9a99ad9addfd44a4df8ba770b795a +R 5d16430269a33945616966e2b0b7c322 +U drh +Z 8726c818ce12b415934c3be6ffc42642 diff --git a/manifest.uuid b/manifest.uuid index 99505f377c..635c137be4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cfff5cb2279088aa66f435bd0d627b2c74c9a99ad9addfd44a4df8ba770b795a \ No newline at end of file +8452fe03430d34abecab618d6136b863630f91d68d69ebbc115f808bc81c3817 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5b8b1372b0..b677285a43 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7928,6 +7928,12 @@ default: { /* This is really OP_Noop, OP_Explain */ if( opProperty & OPFLG_OUT3 ){ registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); } + if( opProperty==0xff ){ + /* Never happens. This code exists to avoid a harmless linkage + ** warning aboud sqlite3VdbeRegisterDump() being defined but not + ** used. */ + sqlite3VdbeRegisterDump(p); + } } #endif /* SQLITE_DEBUG */ #endif /* NDEBUG */ diff --git a/src/whereInt.h b/src/whereInt.h index ad433652f4..dbc6f1872a 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -473,10 +473,10 @@ struct WhereInfo { i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ - u8 bDeferredSeek : 1; /* Uses OP_DeferredSeek */ - u8 untestedTerms : 1; /* Not all WHERE terms resolved by outer loop */ - u8 bOrderedInnerLoop : 1; /* True if only the inner-most loop is ordered */ - u8 sorted : 1; /* True if really sorted (not just grouped) */ + unsigned bDeferredSeek :1; /* Uses OP_DeferredSeek */ + unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ + unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ + unsigned sorted :1; /* True if really sorted (not just grouped) */ LogEst nRowOut; /* Estimated number of output rows */ int iTop; /* The very beginning of the WHERE loop */ WhereLoop *pLoops; /* List of all WhereLoop objects */ From 2e5beddb34c20868fb45ff5e3bbb6fb9e603042c Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 4 Jan 2020 19:14:48 +0000 Subject: [PATCH 7/7] Fix DBSTAT so that it returns now rows, rather than an error when the WHERE clause is "schema=NULL". FossilOrigin-Name: 5b246b47aeadc25dbec0956e2d6edcd49fbe874a01734fdf15b770507648222d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/dbstat.c | 6 +++--- test/stat.test | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 2e28981e59..b57e98dd45 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2020-01-04T19:12:13.469 +C Fix\sDBSTAT\sso\sthat\sit\sreturns\snow\srows,\srather\sthan\san\serror\swhen\sthe\nWHERE\sclause\sis\s"schema=NULL". +D 2020-01-04T19:14:48.556 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 -F src/dbstat.c bf7fbea4ed607f30977ae568e4729c42041024ceee4aa11100c8bb3c631d9a56 +F src/dbstat.c 5125f559b33787a29f7ded750f2a69080f50a85bced98fe8ad02a99e543c4b44 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 F src/expr.c e25df342c1b8b9b87b5d6f9990e5b36f94469b1227c0a492cb5894e379f983ea F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1376,7 +1376,7 @@ F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/stat.test 7bdfc6ae0fc11f12d2eecdb679f1ff0b84021617f3fdef4ebd2403e5bcfc4c4a +F test/stat.test 423257dc36e5865fb9dd1d9051ac985763b6fba1daec134932f37772d5ed1e64 F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 @@ -1853,7 +1853,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 cfff5cb2279088aa66f435bd0d627b2c74c9a99ad9addfd44a4df8ba770b795a -R 5d16430269a33945616966e2b0b7c322 +P 8452fe03430d34abecab618d6136b863630f91d68d69ebbc115f808bc81c3817 +R 9bbb5a6f7d16bf33483ed4a1fd18c9fb U drh -Z 8726c818ce12b415934c3be6ffc42642 +Z 32947d987d272ea0b93a36e52a4c48c8 diff --git a/manifest.uuid b/manifest.uuid index 635c137be4..336cd39a14 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8452fe03430d34abecab618d6136b863630f91d68d69ebbc115f808bc81c3817 \ No newline at end of file +5b246b47aeadc25dbec0956e2d6edcd49fbe874a01734fdf15b770507648222d \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index ae38944dd7..d0ce82e8c6 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -700,9 +700,9 @@ static int statFilter( const char *zDbase = (const char*)sqlite3_value_text(argv[iArg++]); pCsr->iDb = sqlite3FindDbName(pTab->db, zDbase); if( pCsr->iDb<0 ){ - sqlite3_free(pCursor->pVtab->zErrMsg); - pCursor->pVtab->zErrMsg = sqlite3_mprintf("no such schema: %s", zDbase); - return pCursor->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM_BKPT; + pCsr->iDb = 0; + pCsr->isEof = 1; + return SQLITE_OK; } }else{ pCsr->iDb = pTab->iDb; diff --git a/test/stat.test b/test/stat.test index 34f977bca1..105169df1d 100644 --- a/test/stat.test +++ b/test/stat.test @@ -303,16 +303,16 @@ do_execsql_test 8.1 { CREATE VIRTUAL TABLE st4 USING dbstat; } do_execsql_test 8.2 { - SELECT * FROM st4 WHERE st4.aggregate = NULL + SELECT * FROM st4 WHERE st4.aggregate = NULL; } do_execsql_test 8.3 { SELECT aggregate=1 FROM st4 WHERE aggregate = 5 } do_execsql_test 8.4 { SELECT * FROM st4 WHERE name = NULL; -} -do_catchsql_test 8.5 { +} {} +do_execsql_test 8.5 { SELECT * FROM st4 WHERE schema = NULL; -} {1 {no such schema: }} +} {} finish_test