mirror of https://github.com/sqlite/sqlite
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:
parent
da65fc6e32
commit
d5aa9262a6
14
manifest
14
manifest
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
54c537eead5b08104cfaf0d5b1e2706e53d6f74be2ca02e06229024fd889fc94
|
||||
f89b54f41405ed7e28132f66b8a0c690a087c2412c8f55790c2beabb0b521645
|
21
src/btree.c
21
src/btree.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Reference in New Issue