From 9c7e44cddd76c19d8ac034dcce2da1ed978a6f02 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 14 Feb 2019 15:27:12 +0000 Subject: [PATCH] Improved oversized cell detection when updating ptrmap pages in balance_nonroot(). FossilOrigin-Name: aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 23 +++++++++++++++-------- test/fuzzdata8.db | Bin 975872 -> 980992 bytes 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index c48ba75e83..31ec0424b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\snProgressLimit\svariable\sis\salways\sinitialized\sin\nsqlite3VdbeExec(),\seven\sif\sthe\sroutine\sjumps\sto\sits\sexit\sprocessing\searly. -D 2019-02-12T22:58:32.377 +C Improved\soversized\scell\sdetection\swhen\supdating\sptrmap\spages\sin\nbalance_nonroot(). +D 2019-02-14T15:27:12.650 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 1336cc1670ec9ab93c097ae0c087480f501fd9c7157be0457b2b04e67a06a377 +F src/btree.c 161b6a57b91d160065e512a4d0be180e402a16a059034a380cbdc2411924f8ac F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 19fcda3a879b840f8ff139701b116098be40c28c4fe1366e1fc813fb7afa7eea +F test/fuzzdata8.db 267bc89b51f4f0fca01f80ff432ff9b26e65131e806c5ca20119dfc63dd47a90 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 68cce272e7f7cbc0c319ee8b7ff674d652cb1e95e903d99d848c41dff2b5d304 -R 1dd11fa4b345d5a202cdf255a23d5245 +P 167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 +R 5fce60e5e60143c7168638176073d3e9 U drh -Z 5c1fab9a93beb29aa193da2ce5906eed +Z 1127274df05b3c005a32360404b93266 diff --git a/manifest.uuid b/manifest.uuid index 90a8aea4e5..c6a49cf8da 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 \ No newline at end of file +aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fbfc67a796..fe0112ced7 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6817,8 +6817,13 @@ static void insertCell( ** are used and they point to the leaf pages only, and the ixNx value are: ** ** ixNx[0] = Number of cells in Child-1. -** ixNx[1] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. -** ixNx[2] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[1] = Number of cells in Child-1 and Child-2. +** ixNx[2] = Total number of cells. +** +** Sometimes when deleting, a child page can have zero cells. In those +** cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] +** entries, shift down. The end result is that each ixNx[] entry should +** be larger than the previous */ typedef struct CellArray CellArray; struct CellArray { @@ -7747,6 +7752,9 @@ static int balance_nonroot( MemPage *p = apOld[i]; b.apEnd[k] = p->aDataEnd; b.ixNx[k] = cntOld[i]; + if( k && b.ixNx[k]==b.ixNx[k-1] ){ + k--; /* Omit b.ixNx[] entry for child pages with no cells */ + } if( !leafData ){ k++; b.apEnd[k] = pParent->aDataEnd; @@ -7978,18 +7986,17 @@ static int balance_nonroot( if( ISAUTOVACUUM ){ MemPage *pOld; MemPage *pNew = pOld = apNew[0]; - u8 *aOld = pNew->aData; int cntOldNext = pNew->nCell + pNew->nOverflow; - int usableSize = pBt->usableSize; int iNew = 0; int iOld = 0; for(i=0; inCell + pOld->nOverflow + !leafData; - aOld = pOld->aData; } if( i==cntNew[iNew] ){ pNew = apNew[++iNew]; @@ -8004,7 +8011,7 @@ static int balance_nonroot( ** overflow cell), we can skip updating the pointer map entries. */ if( iOld>=nNew || pNew->pgno!=aPgno[iOld] - || !SQLITE_WITHIN(pCell,aOld,&aOld[usableSize]) + || !SQLITE_WITHIN(pCell,pOld->aData,pOld->aDataEnd) ){ if( !leafCorrection ){ ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index dfaf1cb468b36980aa7f591d7fada5907b3724f2..e81a9dea0a1b516ee462a804fe98ee55f59f2592 100644 GIT binary patch delta 3629 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 aBaig%2;>*l9%ebEoCmBZqZ`!uum2xQhn@2P delta 3122 zcmZ{mdsJ0b9>@9ZeeXHbS8+5` z1W|s5sE~}xq={1e)UsrjGnuczp_zOoG|pPOtchw|)huV6eXfq(0X=K|et+z<&)%Qk zV}JK4Xd7H`YH)G4fJi?-e$?;hr&CG40oF*rXjj6atV-RM$?WPKKUykme<}?STT5p> zT|J2(^w`wk?>xHl+dZ1{B_6BtYdsd_S9-YeuXvd9Zjbr-uk)1~|C(~cS1LDTg>o^= zmFuxox$cXV3ta7XtaUp;8B@lUS(I6oY07kEHf45Y<~%349ilo4bAzp2u&wsQ{Uq>EAxk73DA&MtU9MdZ@@DPoacwoccyL_fY666*p) z6lhzjhz!paawTG<+V0?k_{wgUS_9EF{*7jf+Lv2CuodNAhBv7bWM9cH1%0`Y|oi|ODx zk;<(>>TM{cbY(Umu~GcMAPha79T9k<6&B)$W#U=PxvoW0P>J}8K{z&it~FBg7LlXd zmRkI74UON+uxT4h!h$ZgC&~G`7zA`_hnNnQh^l@|FnO2w$Qq*d=!sQth!@Ntt2y+- zFtSY{_XlDpVB30!KN%m2?*MC$*(@e*Z;Y*V1flDF+k7lKAudr?jo8KDm(+U95d!GC zZtrG>wwqcHh;Rmx7`o5Vmttx~vkrZ+;opuRa@C4_hMgul1noH{rUCR*0FJ5Vp1V0j zVdGBwdQxlWafrrY%R~$oSJ*6gZKnMq`TtRD)L}X9JS$$YxDHHRM&g|Ko>}`Sv{;0% zStOq5B^OX-qsZjYADc$;7~JFrD_;963!%x)Vn2rgf>8XOt-z31`4^OTQxq{sz!IxHh`N0xZg7?u zS~{wG6!mWtP2BmbL2-$3aq*e1SQnNYH~L`B7RWB^tX0sk+u|gH!DRVS%(ZJPEPg*_ z#ACp1V>sU3z{lZ%Rs2pFmv^o4DxxGzx#Cpe7b$?^A+Vnwx5}>>48xYkL@4IBIM2{G zHW|nv8B;pRkFa2G@W*oLg)zt=00%|!cgP=Z1&jhpXPh-ZHFq`I&mL*)DJ}^-Yjl_)0 zmSA+BmItXZLJr_CsHtmB#5nmbhjEzp2R#&1Z)w$ZDnS<7;5C|%A`dg`Q);DWNlYE)nGD#<`Sk{3aoNx8>Y#T}qC2}ycXQ>S*D4T)-lkF~_98%>- znF;Wl4!qB!;=M>$7s_57UTDucwFB!)lXaRe>x;gug=YR<@?~8ozqf%OeNZBwV%Euu zZF-$2u<+;7W_U}RiMhv&leBBUaSEuoTrL2}!j#kUJgTY|k$Z=^?Tq$#GdtjUQ#s2Q zZ?-R1Nk zFtwJ2U~#nkXc1=k~$R~D-LRPKe5)VMSLn;P z<^kXTwBWb@&o{_vHGef;e+1Y14qR`v=i1PoYvaSYihQ{?b>J%Y;Qx6POCO6| zixgAo!x_zb$EX0P!PZ?`NZG%%XYkrpBhftI2z2bC5v%@J{sT!^TW37Se;*r(VdYu~ zb-!X<=B6^djh@|FZ%j>>>6CxODCDpo(;DSfx_sRT@y<9vY0YvjQ1(q@lUE(yc>v#= z#+@{V+rdUf=Zsut-J=#fR2ti*`N4%*1Kvvs??%g!=5~iMEW;jnUte23GkP$nqeBt0 z-pe|M!MoU$tq0$`GO;mMw_$RC9$|j^9##d*g{UBpQ+%s&o6nq6gjdrwps)edr