1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Enhanced detection of problems on the freelist and on overflow list in

PRAGMA integrity_check.

FossilOrigin-Name: 11e58f5b37d99848978007d834d187c262d904eb9d58924742e028d7cb324e64
This commit is contained in:
drh
2018-07-20 13:39:28 +00:00
parent b0b0230082
commit 91d5866eb6
5 changed files with 29 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
C Avoid\sa\sbranch\sin\sthe\scommit\slogic\sthat\sis\sunreachable\swhen\scompiled\nwithout\sSQLITE_ENABLE_BATCH_ATOMIC_WRITE. C Enhanced\sdetection\sof\sproblems\son\sthe\sfreelist\sand\son\soverflow\slist\sin\nPRAGMA\sintegrity_check.
D 2018-07-19T15:27:35.652 D 2018-07-20T13:39:28.100
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6 F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
@@ -438,7 +438,7 @@ F src/auth.c a38f3c63c974787ecf75e3213f8cac6568b9a7af7591fb0372ec0517dd16dca8
F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
F src/btree.c 4b91880ab0f6595c52f13b17f3ef269062073341c254311b3c38925db5b89b9a F src/btree.c 76395ea8cb88e7075af1ba6465b1d2751b92cbaa0bcbc8618b6e1787c61c10d9
F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
F src/build.c d8f6ac1e9e484eb3f3921a8336d3dc6c87273d9db8729702162ef045997a1463 F src/build.c d8f6ac1e9e484eb3f3921a8336d3dc6c87273d9db8729702162ef045997a1463
@@ -711,8 +711,8 @@ F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c
F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9
F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4
F test/corrupt.test 141c39ea650c1365e85a49e402fa05cb9617fb97 F test/corrupt.test 141c39ea650c1365e85a49e402fa05cb9617fb97
F test/corrupt2.test b6281ceadd6114d55e89b25e01c617af930dda71567f6a0996a719c385ac142e F test/corrupt2.test fdfdffab9bc37d6d173f56ffb82472206f11dd4a68caad9360ac4db2eddb34c8
F test/corrupt3.test e676f478fe602915d721472811f6f410b75ddc7e F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e
F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a
F test/corrupt5.test 8ead52af76006f3286e9396cb41898018ccea107 F test/corrupt5.test 8ead52af76006f3286e9396cb41898018ccea107
F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568 F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568
@@ -1750,7 +1750,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 3dca8b9d5ab1f35f17fc527d8f2a20b6bac989d1406c883d5b4d6719953ef6b4 P 271b8980c3bcd0403a40aec26681ec111be1d88d2d5d35199a85a10f09ad6920
R 9d87f8b3543e4885b3df693f32810d50 R 12f9a839a98e388a878641cfa671f691
U drh U drh
Z 8ce51e79b3fa48485d8d0335e63cb9ef Z 9f541998dc72c18645337f8a0e2a985a

View File

@@ -1 +1 @@
271b8980c3bcd0403a40aec26681ec111be1d88d2d5d35199a85a10f09ad6920 11e58f5b37d99848978007d834d187c262d904eb9d58924742e028d7cb324e64

View File

@@ -9337,8 +9337,7 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
** Also check that the page number is in bounds. ** Also check that the page number is in bounds.
*/ */
static int checkRef(IntegrityCk *pCheck, Pgno iPage){ static int checkRef(IntegrityCk *pCheck, Pgno iPage){
if( iPage==0 ) return 1; if( iPage>pCheck->nPage || iPage==0 ){
if( iPage>pCheck->nPage ){
checkAppendMsg(pCheck, "invalid page number %d", iPage); checkAppendMsg(pCheck, "invalid page number %d", iPage);
return 1; return 1;
} }
@@ -9393,17 +9392,12 @@ static void checkList(
){ ){
int i; int i;
int expected = N; int expected = N;
int iFirst = iPage; int nErrAtStart = pCheck->nErr;
while( N-- > 0 && pCheck->mxErr ){ while( iPage!=0 && pCheck->mxErr ){
DbPage *pOvflPage; DbPage *pOvflPage;
unsigned char *pOvflData; unsigned char *pOvflData;
if( iPage<1 ){
checkAppendMsg(pCheck,
"%d of %d pages missing from overflow list starting at %d",
N+1, expected, iFirst);
break;
}
if( checkRef(pCheck, iPage) ) break; if( checkRef(pCheck, iPage) ) break;
N--;
if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){
checkAppendMsg(pCheck, "failed to get page %d", iPage); checkAppendMsg(pCheck, "failed to get page %d", iPage);
break; break;
@@ -9447,10 +9441,12 @@ static void checkList(
#endif #endif
iPage = get4byte(pOvflData); iPage = get4byte(pOvflData);
sqlite3PagerUnref(pOvflPage); sqlite3PagerUnref(pOvflPage);
}
if( isFreeList && N<(iPage!=0) ){ if( N && nErrAtStart==pCheck->nErr ){
checkAppendMsg(pCheck, "free-page count in header is too small"); checkAppendMsg(pCheck,
} "%s is %d but should be %d",
isFreeList ? "size" : "overflow list length",
expected-N, expected);
} }
} }
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ #endif /* SQLITE_OMIT_INTEGRITY_CHECK */

View File

@@ -591,7 +591,7 @@ do_test 14.2 {
do_execsql_test 14.3 { do_execsql_test 14.3 {
PRAGMA integrity_check; PRAGMA integrity_check;
} {{*** in database main *** } {{*** in database main ***
Main freelist: free-page count in header is too small}} Main freelist: size is 3 but should be 2}}
# Use 2 of the free pages on the free-list. # Use 2 of the free pages on the free-list.
# #
@@ -603,7 +603,7 @@ do_execsql_test 14.4 {
do_execsql_test 14.5 { do_execsql_test 14.5 {
PRAGMA integrity_check; PRAGMA integrity_check;
} {{*** in database main *** } {{*** in database main ***
Page 3 is never used}} Main freelist: size is 1 but should be 0}}
finish_test finish_test

View File

@@ -67,8 +67,7 @@ do_test corrupt3-1.5 {
integrity_check corrupt3-1.6 integrity_check corrupt3-1.6
# Make the overflow chain loop back on itself. See if the # Make the overflow chain loop back on itself. See if the
# corruption is detected. (Actually, the last pointer in # corruption is detected.
# an overflow chain is ignored, so this is not an error.)
# #
do_test corrupt3-1.7 { do_test corrupt3-1.7 {
db close db close
@@ -78,7 +77,12 @@ do_test corrupt3-1.7 {
SELECT x FROM t1 SELECT x FROM t1
} }
} [list 0 $bigstring] } [list 0 $bigstring]
integrity_check corrupt3-1.8 do_test corrupt3-1.8 {
catchsql {
PRAGMA integrity_check
}
} {0 {{*** in database main ***
On tree page 2 cell 0: 2nd reference to page 3}}}
# Change the pointer for the first page of the overflow # Change the pointer for the first page of the overflow
# change to be a non-existant page. # change to be a non-existant page.
@@ -111,7 +115,7 @@ do_test corrupt3-1.12 {
PRAGMA integrity_check PRAGMA integrity_check
} }
} {0 {{*** in database main *** } {0 {{*** in database main ***
On tree page 2 cell 0: 1 of 1 pages missing from overflow list starting at 0 On tree page 2 cell 0: overflow list length is 0 but should be 1
Page 3 is never used}}} Page 3 is never used}}}
finish_test finish_test