From: drh <> Date: Sun, 2 Aug 2026 18:27:00 +0000 (+0000) Subject: Take care to avoid trying to compute 0.0/0.0 in the diskused extension. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b94e0e84680bbadb6c4dce46441c7d531b98cf5f;p=thirdparty%2Fsqlite.git Take care to avoid trying to compute 0.0/0.0 in the diskused extension. 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 --- diff --git a/ext/misc/diskused.c b/ext/misc/diskused.c index a1d79c0790..4b525bec39 100644 --- a/ext/misc/diskused.c +++ b/ext/misc/diskused.c @@ -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, payload, storage); 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_payload, payload); } 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_meta, storage); 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_cnt, nentry); } 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_unused, storage); } 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; diff --git a/manifest b/manifest index 3b6cecba20..00d0c2d49b 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index e658b5ea11..b2afd9b900 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -73350e128141ab21d8f4c1213a1cca4e153151d85e39643defd438341ed53d14 +a455f347c50872518eff46753ded9a6080ece680be4a1fcc9dc747e16521e95c