Fix various error handling conditions on the cell overwrite optimization.

Fix a test case so that it works with the new optimization.

FossilOrigin-Name: f89b54f41405ed7e28132f66b8a0c690a087c2412c8f55790c2beabb0b521645
This commit is contained in:
drh 2018-05-03 16:56:06 +00:00
parent da65fc6e32
commit d5aa9262a6
4 changed files with 21 additions and 18 deletions

View File

@ -1,5 +1,5 @@
C The\sBtCursor.info\sfields\sare\sonly\svalid\sif\sinfo.nSize!=0.
D 2018-05-03T14:07:18.080
C Fix\svarious\serror\shandling\sconditions\son\sthe\scell\soverwrite\soptimization.\nFix\sa\stest\scase\sso\sthat\sit\sworks\swith\sthe\snew\soptimization.
D 2018-05-03T16:56:06.556
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439
@ -434,7 +434,7 @@ F src/auth.c 6277d63837357549fe14e723490d6dc1a38768d71c795c5eb5c0f8a99f918f73
F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
F src/btree.c edb3c69a73cf7c0286dbe040b0ea7069e606e54fd1ee60bbe1e63e56fba0e2b7
F src/btree.c 8faf9ebbecb98f05d75f203fdb2421e47a60f1edef3192af8fc7691cb979895c
F src/btree.h 0866c0a08255142ea0e754aabd211c843cab32045c978a592a43152405ed0c84
F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
F src/build.c 0c2be5839f22aa2938f217c6c6c2120d9fc96872a546a37541a8271541cb355e
@ -1131,7 +1131,7 @@ F test/oserror.test b32dc34f2363ef18532e3a0a7358e3e7e321974f
F test/ossfuzz.c c4c4547e2c92ac52f10038b073a03248251a23c1c559728f63a18aeca0e79f03
F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17
F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f
F test/pager1.test f596d3bd53ce96e1d87d44d223d2ae6c8867dd782c425e5eb28b5721fa6aaa97
F test/pager1.test a32ce299ed01ffb06e84a3af467ae1f3389786b316f40c4359f442c79144736b
F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71
F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370
F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e
@ -1727,7 +1727,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 58d14afe1e1288d114ea213458b3121e0a95670887861928858b7f143c76f789
R b073d403d1ba3bd03f4d3e8e8927a6d3
P 54c537eead5b08104cfaf0d5b1e2706e53d6f74be2ca02e06229024fd889fc94
R e3474d8063bbcdfd90a9f2049be513c8
U drh
Z e6a7ba3bea7a5cce16673df821a14231
Z a88b0406803dcfd2b3d768953d03cd3c

View File

@ -1 +1 @@
54c537eead5b08104cfaf0d5b1e2706e53d6f74be2ca02e06229024fd889fc94
f89b54f41405ed7e28132f66b8a0c690a087c2412c8f55790c2beabb0b521645

View File

@ -8176,7 +8176,9 @@ static int btreeOverwriteContent(
if( nData<iAmt ){
/* Mixed read data and zeros at the end. Make a recursive call
** to write the zeros then fall through to write the real data */
btreeOverwriteContent(pPage, pDest+nData, pX, iOffset+nData, iAmt-nData);
int rc = btreeOverwriteContent(pPage, pDest+nData, pX, iOffset+nData,
iAmt-nData);
if( rc ) return rc;
iAmt = nData;
}
if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){
@ -8219,18 +8221,19 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){
rc = btreeGetPage(pBt, ovflPgno, &pPage, 0);
if( rc ) return rc;
if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 ){
return SQLITE_CORRUPT_BKPT;
}
if( iOffset+ovflPageSize<nTotal ){
ovflPgno = get4byte(pPage->aData);
rc = SQLITE_CORRUPT_BKPT;
}else{
ovflPageSize = nTotal - iOffset;
if( iOffset+ovflPageSize<nTotal ){
ovflPgno = get4byte(pPage->aData);
}else{
ovflPageSize = nTotal - iOffset;
}
rc = btreeOverwriteContent(pPage, pPage->aData+4, pX,
iOffset, ovflPageSize);
}
rc = btreeOverwriteContent(pPage, pPage->aData+4, pX,
iOffset, ovflPageSize);
sqlite3PagerUnref(pPage->pDbPage);
if( rc ) return rc;
iOffset += ovflPageSize;
sqlite3PagerUnref(pPage->pDbPage);
}while( iOffset<nTotal );
return SQLITE_OK;
}

View File

@ -1149,7 +1149,7 @@ do_test pager1-5.5.1 {
PRAGMA journal_mode = PERSIST;
CREATE TABLE t3(a, b);
INSERT INTO t3 SELECT randomblob(1500), randomblob(1500) FROM t1;
UPDATE t3 SET b = randomblob(1500);
UPDATE t3 SET b = randomblob(1501);
}
expr [file size test.db-journal] > 15000
} {1}