]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Take care to avoid trying to compute 0.0/0.0 in the diskused extension.
authordrh <>
Sun, 2 Aug 2026 18:27:00 +0000 (18:27 +0000)
committerdrh <>
Sun, 2 Aug 2026 18:27:00 +0000 (18:27 +0000)
If such a value needs to be displayed, show the result as 0.0.
[bugs:/info/2026-08-02T12:48:58Z|Bug 2026-08-02T12:48:58Z]

FossilOrigin-Name: a455f347c50872518eff46753ded9a6080ece680be4a1fcc9dc747e16521e95c

ext/misc/diskused.c
manifest
manifest.uuid

index a1d79c07905534c4a7ced59cfc3baaffc947de85..4b525bec3900c25fda5f098d09fcf6265cc13e73 100644 (file)
@@ -257,11 +257,24 @@ static void diskusedLine(
 ** two or three significant digits, with the decimal point being the fourth
 ** character.  
 */
-static void diskusedPercent(DiskUsed *p, double r){
+static void diskusedPercent(
+  DiskUsed *p,           /* Context of the disk-usage analysis */
+  sqlite3_int64 num,     /* Numerator of the fraction */
+  sqlite3_int64 denom    /* Denominator of the fraction.  Might be zero! */
+){
   char zNum[100];
   char *zDP;
   int nLeadingDigit;
   int sz;
+  double r;
+  if( num==0 ){
+    r = 0.0;
+  }else if( denom==0 ){
+    sqlite3_str_appendchar(p->pOut, 1, '\n');
+    return;
+  }else{
+    r = num*100.0/(double)denom;
+  }
   sqlite3_snprintf(sizeof(zNum)-5, zNum, r>=10.0 ? "%.3g" :"%.2g", r);
   sz = (int)strlen(zNum);
   zDP = strchr(zNum, '.');
@@ -364,15 +377,15 @@ static int diskusedSubreport(
     storage = total_pages*pgsz;
     diskusedLine(p, "Bytes of storage consumed", "%lld\n", storage);
     diskusedLine(p, "Bytes of payload", "%-11lld ", payload);
-    diskusedPercent(p, payload*100.0/(double)storage);
+    diskusedPercent(p, payloadstorage);
     if( ovfl_cnt>0 ){
       diskusedLine(p, "Bytes of payload in overflow","%-11lld ",ovfl_payload);
-      diskusedPercent(p, ovfl_payload*100.0/(double)payload);
+      diskusedPercent(p, ovfl_payloadpayload);
     }
     total_unused = leaf_unused + int_unused + ovfl_unused;
     total_meta = storage - payload - total_unused;
     diskusedLine(p, "Bytes of metadata","%-11lld ", total_meta);
-    diskusedPercent(p, total_meta*100.0/(double)storage);
+    diskusedPercent(p, total_metastorage);
     if( cnt==1 ){
       diskusedLine(p, "B-tree depth", "%lld\n", depth);
       if( int_cell>1 ){
@@ -391,7 +404,7 @@ static int diskusedSubreport(
     diskusedLine(p, "Maximum single-entry payload", "%lld\n", mx_payload);
     if( nentry>0 ){
       diskusedLine(p, "Entries that use overflow", "%-11lld ", ovfl_cnt);
-      diskusedPercent(p, ovfl_cnt*100.0/(double)nentry);
+      diskusedPercent(p, ovfl_cntnentry);
     }
     if( int_pages>0 ){
       diskusedLine(p, "Index pages used", "%lld\n", int_pages);
@@ -409,7 +422,7 @@ static int diskusedSubreport(
       diskusedLine(p, "Unused bytes on overflow pages", "%lld\n", ovfl_unused);
     }
     diskusedLine(p, "Unused bytes on all pages", "%-11lld ", total_unused);
-    diskusedPercent(p, total_unused*100.0/(double)storage);
+    diskusedPercent(p, total_unusedstorage);
   }
   return diskusedStmtFinish(p, rc, pStmt);
 }
@@ -572,13 +585,13 @@ static void diskusedFunc(
        "SELECT sum(leaf_pages+int_pages+ovfl_pages) FROM temp.%s", s.zSU);
   if( rc ) return;
   diskusedLine(&s, "Pages that store data", "%-11lld ", nPageInUse);
-  diskusedPercent(&s, (nPageInUse*100.0)/(double)nPage);
+  diskusedPercent(&s, nPageInUse, nPage);
 
   nFreeList = 0;
   rc = diskusedSqlInt(&s, &nFreeList, "PRAGMA \"%w\".freelist_count",s.zSchema);
   if( rc ) return;
   diskusedLine(&s, "Pages on the freelist", "%-11lld ", nFreeList);
-  diskusedPercent(&s, (nFreeList*100.0)/(double)nPage);
+  diskusedPercent(&s, nFreeList, nPage);
 
   ii = 0;
   rc = diskusedSqlInt(&s, &ii, "PRAGMA \"%w\".auto_vacuum", s.zSchema);
@@ -591,7 +604,7 @@ static void diskusedFunc(
     ii = (sqlite3_int64)ceil(rAvPage);
   }
   diskusedLine(&s, "Pages of auto-vacuum overhead", "%-11lld ", ii);
-  diskusedPercent(&s, (ii*100.0)/(double)nPage);
+  diskusedPercent(&s, ii, nPage);
 
   ii = 0;
   rc = diskusedSqlInt(&s, &ii, 
@@ -630,7 +643,7 @@ static void diskusedFunc(
        s.zSU);
   if( rc ) return;
   diskusedLine(&s, "Bytes of payload", "%-11lld ", ii);
-  diskusedPercent(&s, ii*100.0/(double)(pgsz*nPage));
+  diskusedPercent(&s, ii, pgsz*nPage);
 
   diskusedTitle(&s, "Page counts for all tables with their indexes");
   pStmt = diskusedPrepare(&s,
@@ -645,7 +658,7 @@ static void diskusedFunc(
   while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){
     sqlite3_int64 nn = sqlite3_column_int64(pStmt,1);
     diskusedLine(&s, (const char*)sqlite3_column_text(pStmt,0), "%-11lld ", nn);
-    diskusedPercent(&s, (nn*100.0)/(double)nPage);
+    diskusedPercent(&s, nn, nPage);
   }
   if( diskusedStmtFinish(&s, rc, pStmt) ) return;
 
@@ -662,7 +675,7 @@ static void diskusedFunc(
   while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){
     sqlite3_int64 nn = sqlite3_column_int64(pStmt,1);
     diskusedLine(&s, (const char*)sqlite3_column_text(pStmt,0), "%-11lld ", nn);
-    diskusedPercent(&s, (nn*100.0)/(double)nPage);
+    diskusedPercent(&s, nn, nPage);
   }
   if( diskusedStmtFinish(&s, rc, pStmt) ) return;
 
index 3b6cecba2056777baa5d08defa02ed7cdb937e8f..00d0c2d49b46d567be96f114a21c4ea575864c10 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Reduce\sthe\ssize\sof\stest\scases\sfor\sthe\sclosure\sextension\sso\sthat\sthey\nrun\sfaster.\s\sThe\sclosure\sextension\sis\snot\simportant\sfor\sanything\sanymore\nand\sis\sretained\smostly\sfor\shistorical\sreference.\s\sThere\sis\sno\spoint\sin\nburning\sCPU\scycles\stesting\sit\swith\slarge\scases.
-D 2026-08-02T17:22:13.875
+C Take\scare\sto\savoid\strying\sto\scompute\s0.0/0.0\sin\sthe\sdiskused\sextension.\nIf\ssuch\sa\svalue\sneeds\sto\sbe\sdisplayed,\sshow\sthe\sresult\sas\s0.0.\n[bugs:/info/2026-08-02T12:48:58Z|Bug\s2026-08-02T12:48:58Z]
+D 2026-08-02T18:27:00.100
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -375,7 +375,7 @@ F ext/misc/compress.c 5cc142aa82d1589a31c384657d0418c0eb0871348a2201e5dca32d24a0
 F ext/misc/csv.c 5ca451b9ce77322c4ce8476766e7ed18160e5c8b19e7cab76e13006d631b9e8f
 F ext/misc/dbdump.c 678f1b9ae2317b4473f65d03132a2482c3f4b08920799ed80feedd2941a06680
 F ext/misc/decimal.c 0e5504e949c45df8cc69e3754bfa4f35cb341f7c055e74187693cc1f2c33afbd
-F ext/misc/diskused.c 0ef61ab38a877430e104d24c6d55f172634563f584bb08af2f33eaa04acaf5eb
+F ext/misc/diskused.c 6cf94f90cb4254ad5a90fc5992d594f3b0f4e0fa635c3549859b57d77153adda
 F ext/misc/eval.c d4ea2d9898fbe4d30d38ff675ee51958d3bb0601a145bade56dee8b8f438cc5b
 F ext/misc/explain.c 04c9270fd8cf93a9bceb12d2f5f67e3f09a4e58b3e0efe14d24531444d2fffdf
 F ext/misc/fileio.c f32d7488e229cc52283b6f8d9370b004aa92e7a3054aef320cbdbdecb08c4ee5
@@ -2218,8 +2218,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P fccfd5c410c875c35b72475d442c9c1d384deaef1859ba05586841d6c0909e0d
-R 90778cc7b21b2749b9c21414bec95aee
+P 73350e128141ab21d8f4c1213a1cca4e153151d85e39643defd438341ed53d14
+R 5bb920d14f7dcd9ab98e3e630f8b621c
 U drh
-Z f0ac2f799c0844b946d3f34a21fe99fa
+Z 5eb04644ba4cea841862ebf0d141d049
 # Remove this line to create a well-formed Fossil manifest.
index e658b5ea119a24978f8c3e3aac21f49fd00d3da4..b2afd9b900e50eba91ce0596b42b588dd0da63d7 100644 (file)
@@ -1 +1 @@
-73350e128141ab21d8f4c1213a1cca4e153151d85e39643defd438341ed53d14
+a455f347c50872518eff46753ded9a6080ece680be4a1fcc9dc747e16521e95c