From: drh Date: Sat, 18 Feb 2017 02:42:54 +0000 (+0000) Subject: Fix errors in the table resize detection. X-Git-Tag: version-3.18.0~81^2~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dfe11bae9944fa05066314dd9063ff834fd60dae;p=thirdparty%2Fsqlite.git Fix errors in the table resize detection. FossilOrigin-Name: 4229caec0b60a1617b9d5ff94b47271cbd7be1e0 --- diff --git a/manifest b/manifest index d311cdbbf3..5af18e20b2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sanalyze_as_needed\spragma,\savoid\srunning\sunnecessary\sOP_LoadAnalysis\s\nand\sOP_Expire\sopcodes.\s\sMake\sthe\sanalyze_as_needed\spragma\sresponsive\sto\sthe\nschema\sname. -D 2017-02-18T02:19:02.183 +C Fix\serrors\sin\sthe\stable\sresize\sdetection. +D 2017-02-18T02:42:54.892 F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a89ea37ab5928026001569f056973b9059492fe2 @@ -331,13 +331,13 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 3b23977620ce9662ac54443f65b87ba996e36121 -F src/analyze.c eb50045b8f2e0d8a0a36a2158a65afe098d9a3bb +F src/analyze.c e01e5362ba2ac8430ab7833022afb6081ade8315 F src/attach.c 8c476f8bd5d2afe11d925f890d30e527e5b0ce43 F src/auth.c 930b376a9c56998557367e6f7f8aaeac82a2a792 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c e7d724b02365d88920171caf0c919aa96d9b19e3 +F src/btree.c a4ab1fb5cdeea88c4f76216e41cfecfa505c8c43 F src/btree.h bf64dfeeddeebdb775a5eba0098bbc00d073290d F src/btreeInt.h cd55d39d9916270837a88c12e701047cba0729b0 F src/build.c 2e05d0360568f40dc583461f2211f020ff282ee4 @@ -1557,7 +1557,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 bfbdd07409688fac4ccddbab3639745f6152e23d -R 1c1b7451b307830f90322e6d51007af7 +P 882599a4a7ea92c9e7752e0745475508e58a11c3 +R cf9f80fd407d6e9e7cfac9c2957017b5 U drh -Z 2d7c806c83a06bb426974433c00a5916 +Z 225df65ba1e601aba9cbc975df68b3a8 diff --git a/manifest.uuid b/manifest.uuid index 9825130b6a..07d49087a1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -882599a4a7ea92c9e7752e0745475508e58a11c3 \ No newline at end of file +4229caec0b60a1617b9d5ff94b47271cbd7be1e0 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index c30027aec9..118cdb9383 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1019,6 +1019,7 @@ static void analyzeOneTable( sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); if( szOld>0 ){ addrSizeCk = sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, 0, szOld); + VdbeCoverage(v); } sqlite3VdbeLoadString(v, regTabname, pTab->zName); @@ -1296,9 +1297,10 @@ static int analyzeNeeded(Table *pTab, LogEst *pThreshold){ Index *pIdx; if( (pTab->tabFlags & TF_StatsUsed)==0 ) return 0; - /* If TF_StatsUsed is true, then we might need to reanalyze. But - ** only reanalyze if the table size has grown by a factor of 10 or more */ - *pThreshold = pTab->nRowLogEst + 33; assert( sqlite3LogEst(10)==33 ); + /* If TF_StatsUsed is true, then we might need to reanalyze. + ** TUNING: Only reanalyze if the table size has grown by a factor + ** of 25 or more. */ + *pThreshold = pTab->nRowLogEst + 46; assert( sqlite3LogEst(25)==46 ); /* Except, if any of the indexes of the table do not have valid ** sqlite_stat1 entries, then set the size threshold to zero to diff --git a/src/btree.c b/src/btree.c index 8aed08cb36..4d31661f10 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5331,8 +5331,8 @@ i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); if( pCur->eState!=CURSOR_VALID ) return -1; - if( pCur->apPage[pCur->iPage-1]->leaf==0 ) return -1; - for(n=1, i=0; iiPage; i++){ + if( pCur->apPage[pCur->iPage]->leaf==0 ) return -1; + for(n=1, i=0; i<=pCur->iPage; i++){ n *= pCur->apPage[i]->nCell; } return n;