From 7ed6c068f556dd45f705355c3454c1f8af1047d4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 21 May 2019 16:32:41 +0000 Subject: [PATCH] Fix a problem in [b5ca442a] causing an assert() to fail in REINDEX commands. FossilOrigin-Name: a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 14 +++++++------- src/vdbeaux.c | 9 ++++++++- test/indexexpr2.test | 3 +++ 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e70eac1d9d..4d28f2c625 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sa\sstatement\sjournal\sfor\sall\sCREATE\sINDEX\sstatements\sin\scase\san\sindexed\sexprsesion\sthrows\san\sexception\swhen\sit\sis\sevaluated.\sFix\sfor\s[b5ca442a]. -D 2019-05-21T14:42:24.835 +C Fix\sa\sproblem\sin\s[b5ca442a]\scausing\san\sassert()\sto\sfail\sin\sREINDEX\scommands. +D 2019-05-21T16:32:41.592 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1dbc191e5c1d9bca84a956fed5d73924c574ae5390855009f067bd0f6422e462 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 846b6106e3aaec68b180994902bd126735508f56aa16248a0de7a64042d704bb +F src/build.c c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -598,7 +598,7 @@ F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c 32c003d783af55d0a4ef32516e45ed49a3da6b8a1d98be9b191790a42242996f +F src/vdbeaux.c afe8d7858ad7a7cd67b16d0df396f5c672309722c7855d33cd10adb7ce076b4b F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c e9a0aa2feb93356333bcd94491c25bac041e63e3d87e4caac67fde742dd2deba F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 @@ -1046,7 +1046,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test a8a648c1a6c53bd3f9b2a848bfd11b25de55573513203114216bf7a7166e4a82 +F test/indexexpr2.test d319e7d1b1043403f39a20c892d512e02b5549c6004806b977030f2430c60208 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 @@ -1827,7 +1827,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 aee73fd28f031a2568ac723de0826be7f1dca6be3b049e4a04fb47af75dcf4bf -R 3eb88af4d27fd0e9ebeeb2c2308226bd +P b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b +R e0d2be8aaa1e1b8f55170826c63b8e27 U dan -Z cb8de4b0e5cd2b6b1cf5c900002e43ce +Z 54ed841e42a31a65a6ba750ef5f58b68 diff --git a/manifest.uuid b/manifest.uuid index 17437e6140..49935a0516 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b \ No newline at end of file +a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 \ No newline at end of file diff --git a/src/build.c b/src/build.c index c152bf2caf..380af8379d 100644 --- a/src/build.c +++ b/src/build.c @@ -3050,13 +3050,13 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); sqlite3VdbeJumpHere(v, j2); }else{ - /* Most CREATE INDEX statements that are not UNIQUE can not abort. The - ** exception is if one of the indexed expressions contains a user - ** function that throws an exception when it is evaluated. But the - ** overhead of adding a statement journal to a CREATE INDEX statement - ** is very small (since most of the pages written do not contain - ** content that needs to be restored if the statement aborts), so - ** we call sqlite3MayAbort() for all CREATE INDEX statements. */ + /* Most CREATE INDEX and REINDEX statements that are not UNIQUE can not + ** abort. The exception is if one of the indexed expressions contains a + ** user function that throws an exception when it is evaluated. But the + ** overhead of adding a statement journal to a CREATE INDEX statement is + ** very small (since most of the pages written do not contain content that + ** needs to be restored if the statement aborts), so we call + ** sqlite3MayAbort() for all CREATE INDEX statements. */ sqlite3MayAbort(pParse); addr2 = sqlite3VdbeCurrentAddr(v); } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e1fdeeb701..98c50f362d 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -648,7 +648,14 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ break; } if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; - if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( mayAbort ){ + /* hasCreateIndex may also be set for some DELETE statements that use + ** OP_Clear. So this routine may end up returning true in the case + ** where a "DELETE FROM tbl" has a statement-journal but does not + ** require one. This is not so bad - it is an inefficiency, not a bug. */ + if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( opcode==OP_Clear ) hasCreateIndex = 1; + } if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ diff --git a/test/indexexpr2.test b/test/indexexpr2.test index d3e923f86e..a3a685fb3d 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -291,6 +291,9 @@ do_execsql_test 7.2 { SELECT sql FROM sqlite_master WHERE tbl_name = 't0'; CREATE INDEX i0 ON t0(c0); } {{CREATE TABLE t0(c0)}} +do_execsql_test 7.3 { + REINDEX; +} {}