]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhanced detection of problems on the freelist and on overflow list in
authordrh <drh@noemail.net>
Fri, 20 Jul 2018 13:39:28 +0000 (13:39 +0000)
committerdrh <drh@noemail.net>
Fri, 20 Jul 2018 13:39:28 +0000 (13:39 +0000)
PRAGMA integrity_check.

FossilOrigin-Name: 11e58f5b37d99848978007d834d187c262d904eb9d58924742e028d7cb324e64

manifest
manifest.uuid
src/btree.c
test/corrupt2.test
test/corrupt3.test

index c389802f23ef42a6173315d7a6c773b2e4ad3cf6..0eb200455e473c1faf5c1c2d468e83e6307ccfdd 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\sa\sbranch\sin\sthe\scommit\slogic\sthat\sis\sunreachable\swhen\scompiled\nwithout\sSQLITE_ENABLE_BATCH_ATOMIC_WRITE.
-D 2018-07-19T15:27:35.652
+C Enhanced\sdetection\sof\sproblems\son\sthe\sfreelist\sand\son\soverflow\slist\sin\nPRAGMA\sintegrity_check.
+D 2018-07-20T13:39:28.100
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
@@ -438,7 +438,7 @@ F src/auth.c a38f3c63c974787ecf75e3213f8cac6568b9a7af7591fb0372ec0517dd16dca8
 F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
 F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
-F src/btree.c 4b91880ab0f6595c52f13b17f3ef269062073341c254311b3c38925db5b89b9a
+F src/btree.c 76395ea8cb88e7075af1ba6465b1d2751b92cbaa0bcbc8618b6e1787c61c10d9
 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
 F src/build.c d8f6ac1e9e484eb3f3921a8336d3dc6c87273d9db8729702162ef045997a1463
@@ -711,8 +711,8 @@ F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c
 F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9
 F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4
 F test/corrupt.test 141c39ea650c1365e85a49e402fa05cb9617fb97
-F test/corrupt2.test b6281ceadd6114d55e89b25e01c617af930dda71567f6a0996a719c385ac142e
-F test/corrupt3.test e676f478fe602915d721472811f6f410b75ddc7e
+F test/corrupt2.test fdfdffab9bc37d6d173f56ffb82472206f11dd4a68caad9360ac4db2eddb34c8
+F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e
 F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a
 F test/corrupt5.test 8ead52af76006f3286e9396cb41898018ccea107
 F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568
@@ -1750,7 +1750,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 3dca8b9d5ab1f35f17fc527d8f2a20b6bac989d1406c883d5b4d6719953ef6b4
-R 9d87f8b3543e4885b3df693f32810d50
+P 271b8980c3bcd0403a40aec26681ec111be1d88d2d5d35199a85a10f09ad6920
+R 12f9a839a98e388a878641cfa671f691
 U drh
-Z 8ce51e79b3fa48485d8d0335e63cb9ef
+Z 9f541998dc72c18645337f8a0e2a985a
index 16f747d62eb870dfc2e84d72bd4c2cb82b47845a..6617ca082ad981203d783cb46470c650ea437b36 100644 (file)
@@ -1 +1 @@
-271b8980c3bcd0403a40aec26681ec111be1d88d2d5d35199a85a10f09ad6920
\ No newline at end of file
+11e58f5b37d99848978007d834d187c262d904eb9d58924742e028d7cb324e64
\ No newline at end of file
index 269967ec9a372a7ab0493bff97fb19d7099c95c8..45ff2bfe8f397313a6418c96f73142510d3f807b 100644 (file)
@@ -9337,8 +9337,7 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
 ** Also check that the page number is in bounds.
 */
 static int checkRef(IntegrityCk *pCheck, Pgno iPage){
-  if( iPage==0 ) return 1;
-  if( iPage>pCheck->nPage ){
+  if( iPage>pCheck->nPage || iPage==0 ){
     checkAppendMsg(pCheck, "invalid page number %d", iPage);
     return 1;
   }
@@ -9393,17 +9392,12 @@ static void checkList(
 ){
   int i;
   int expected = N;
-  int iFirst = iPage;
-  while( N-- > 0 && pCheck->mxErr ){
+  int nErrAtStart = pCheck->nErr;
+  while( iPage!=0 && pCheck->mxErr ){
     DbPage *pOvflPage;
     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;
+    N--;
     if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){
       checkAppendMsg(pCheck, "failed to get page %d", iPage);
       break;
@@ -9447,10 +9441,12 @@ static void checkList(
 #endif
     iPage = get4byte(pOvflData);
     sqlite3PagerUnref(pOvflPage);
-
-    if( isFreeList && N<(iPage!=0) ){
-      checkAppendMsg(pCheck, "free-page count in header is too small");
-    }
+  }
+  if( N && nErrAtStart==pCheck->nErr ){
+    checkAppendMsg(pCheck,
+      "%s is %d but should be %d",
+      isFreeList ? "size" : "overflow list length",
+      expected-N, expected);
   }
 }
 #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
index 4b58da1cc1e4211127195a263ed1e508b995b830..9512d0f242b9dddc247bde9cae1596c61dd18597 100644 (file)
@@ -591,7 +591,7 @@ do_test 14.2 {
 do_execsql_test 14.3 {
   PRAGMA integrity_check;
 } {{*** 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.
 #
@@ -603,7 +603,7 @@ do_execsql_test 14.4 {
 do_execsql_test 14.5 {
   PRAGMA integrity_check;
 } {{*** in database main ***
-Page 3 is never used}}
+Main freelist: size is 1 but should be 0}}
 
 
 finish_test
index 85139420b8544a567fecd94c7a91a3b89e4ee602..3c911dadb6b34c391f1ca76143957691c33fd274 100644 (file)
@@ -67,8 +67,7 @@ do_test corrupt3-1.5 {
 integrity_check corrupt3-1.6
 
 # Make the overflow chain loop back on itself.   See if the
-# corruption is detected.   (Actually, the last pointer in
-# an overflow chain is ignored, so this is not an error.)
+# corruption is detected.
 #
 do_test corrupt3-1.7 {
   db close
@@ -78,7 +77,12 @@ do_test corrupt3-1.7 {
     SELECT x FROM t1
   }
 } [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 to be a non-existant page.
@@ -111,7 +115,7 @@ do_test corrupt3-1.12 {
     PRAGMA integrity_check
   }
 } {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}}}
 
 finish_test