]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the "pgidx" command of the showdb utility, try to identify orphaned pages
authordrh <drh@noemail.net>
Wed, 17 Apr 2019 12:29:45 +0000 (12:29 +0000)
committerdrh <drh@noemail.net>
Wed, 17 Apr 2019 12:29:45 +0000 (12:29 +0000)
and show when pages have been zeroed out.

FossilOrigin-Name: eed701ef919c70d891727250be6a1b626aeb894c562d221e319ae6d74fc71d3d

manifest
manifest.uuid
tool/showdb.c

index 1e190dc5d194a5e8da62242ab76b209f66c25d9a..bae2f7cb9cdd445e72f5efc54bbc0038b3df2592 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Small\sperformance\simprovement\son\sthe\svariable-length\sinteger\sdecoder:\nsqlite3GetVarint().
-D 2019-04-17T12:07:08.215
+C In\sthe\s"pgidx"\scommand\sof\sthe\sshowdb\sutility,\stry\sto\sidentify\sorphaned\spages\nand\sshow\swhen\spages\shave\sbeen\szeroed\sout.
+D 2019-04-17T12:29:45.915
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -1768,7 +1768,7 @@ F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048
 F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a
 F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5
 F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076
-F tool/showdb.c af978d1437562776fa4d94bf0cb772314c464e71ef24134a6e2301564ae60bc2
+F tool/showdb.c b4cd49d8f4df86349a6b41993a3eb5651e18a3f9903b4fbb70d18b66c8a358ca
 F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818
 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68
 F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809
@@ -1818,7 +1818,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 7ac500fb5abfe1ad60f2ffdcc8fbe5ccc1c641bbeed53f00940e9ff78788e53d
-R abb269365d71bef546a529ae44e4c54c
+P 5df2bf62fcd4dfdaa195062dddbd5ce5420bc239b2649ac8f547e0db34e7f0bb
+R f4eb9f2a8e78f2d407da5d6c15776852
 U drh
-Z 80d8752f4698aa123849b705cd651c27
+Z 369a3d8533a731558ce8e524f18f4b7d
index a698b6544c10f6da20529a904546846102594a0e..9dae86999ecd479b4017fd0a2e923d3ca917bbd9 100644 (file)
@@ -1 +1 @@
-5df2bf62fcd4dfdaa195062dddbd5ce5420bc239b2649ac8f547e0db34e7f0bb
\ No newline at end of file
+eed701ef919c70d891727250be6a1b626aeb894c562d221e319ae6d74fc71d3d
\ No newline at end of file
index cb6ddabca613a1fd2e89f1b3f1f32ca65f87b601..a3301392ab7c49d432ceeb06dc6fe7b76895dfac 100644 (file)
@@ -835,9 +835,20 @@ static void page_usage_cell(
   }
 }
 
+/*
+** True if the memory is all zeros
+*/
+static int allZero(unsigned char *a, int n){
+  while( n && (a++)[0]==0 ){ n--; }
+  return n==0;
+}
+
 
 /*
-** Describe the usages of a b-tree page
+** Describe the usages of a b-tree page.
+**
+** If parent==0, then this is the root of a btree.  If parent<0 then
+** this is an orphan page.
 */
 static void page_usage_btree(
   int pgno,             /* Page to describe */
@@ -854,16 +865,32 @@ static void page_usage_btree(
   if( pgno<=0 || pgno>g.mxPage ) return;
   a = fileRead((pgno-1)*g.pagesize, g.pagesize);
   switch( a[hdr] ){
+    case 0: {
+      if( allZero(a, g.pagesize) ){
+        zType = "zeroed page";
+      }else if( parent<0 ){
+        return;
+      }else{
+        zType = "corrupt node";
+      }
+      break;
+    }
     case 2:  zType = "interior node of index";  break;
     case 5:  zType = "interior node of table";  break;
     case 10: zType = "leaf of index";           break;
     case 13: zType = "leaf of table";           break;
+    default: {
+      if( parent<0 ) return;
+      zType = "corrupt node";
+    }
   }
-  if( parent ){
+  if( parent>0 ){
     page_usage_msg(pgno, "%s [%s], child %d of page %d",
                    zType, zName, idx, parent);
-  }else{
+  }else if( parent==0 ){
     page_usage_msg(pgno, "root %s [%s]", zType, zName);
+  }else{
+    page_usage_msg(pgno, "orphaned %s", zType);
   }
   nCell = a[hdr+3]*256 + a[hdr+4];
   if( a[hdr]==2 || a[hdr]==5 ){
@@ -988,6 +1015,7 @@ static void page_usage_report(const char *zPrg, const char *zDbName){
 
   /* Print the report and free memory used */
   for(i=1; i<=g.mxPage; i++){
+    if( zPageUse[i]==0 ) page_usage_btree(i, -1, 0, 0);
     printf("%5d: %s\n", i, zPageUse[i] ? zPageUse[i] : "???");
     sqlite3_free(zPageUse[i]);
   }