From c9ccd270458905494b96c97da187666168ee3e57 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 4 Feb 2026 17:52:50 +0000 Subject: [PATCH] Improved display of scan-status estimates. FossilOrigin-Name: 70ef095740c62081090147bb1900c843cb31864e93a8af518ff48855f1175717 --- ext/qrf/qrf.c | 33 ++++++++++++++++++++------------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/ext/qrf/qrf.c b/ext/qrf/qrf.c index ff0a9180ee..9ab593b954 100644 --- a/ext/qrf/qrf.c +++ b/ext/qrf/qrf.c @@ -274,7 +274,7 @@ static void qrfApproxInt64(sqlite3_str *pOut, i64 N){ ** Render a double r into pOut for use in scan-stats reporting. ** ** If r is greater than or equal to 1000, then render using qrfApproxInt64. -** Otherwise render using %.1f. +** Otherwise render using %.1g. */ static void qrfApproxDouble(sqlite3_str *pOut, double r){ if( r<0.0 ){ @@ -284,7 +284,7 @@ static void qrfApproxDouble(sqlite3_str *pOut, double r){ if( r>=1000.0 ){ qrfApproxInt64(pOut, (i64)r); }else{ - sqlite3_str_appendf(pOut, "%.1f", r); + sqlite3_str_appendf(pOut, "%.1g", r); } } @@ -360,6 +360,8 @@ static void qrfEqpStats(Qrf *p){ int i = 0; i64 nTotal = 0; int nWidth = 0; + int prevPid = -1; /* Previous iPid */ + double rEstCum = 1.0; /* Cumulative row estimate */ sqlite3_str *pLine = sqlite3_str_new(p->db); sqlite3_str *pStats = sqlite3_str_new(p->db); qrfEqpReset(p); @@ -389,17 +391,21 @@ static void qrfEqpStats(Qrf *p){ if( sqlite3_stmt_scanstatus_v2(pS,i,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&zo) ){ break; } + sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid); + if( iPid!=prevPid ){ + prevPid = iPid; + rEstCum = 1.0; + } sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_EST,f,(void*)&rEst); + rEstCum *= rEst; sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop); sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow); sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle); sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId); - sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid); sqlite3_stmt_scanstatus_v2(pS,i, SQLITE_SCANSTAT_NAME,f,(void*)&zName); if( nCycle>=0 || nLoop>=0 || nRow>=0 ){ const char *zSp = ""; - double rpl; sqlite3_str_reset(pStats); if( nCycle>=0 && nTotal>0 ){ sqlite3_str_appendf(pStats, "cycles="); @@ -413,21 +419,22 @@ static void qrfEqpStats(Qrf *p){ sqlite3_str_appendf(pStats, "%sloops=", zSp); qrfApproxInt64(pStats, nLoop); zSp = " "; + if( p->spec.eStyle==QRF_STYLE_StatsEst ){ + sqlite3_str_appendf(pStats, " [est "); + qrfApproxDouble(pStats, rEstCum/rEst); + sqlite3_str_appendf(pStats, "]"); + } } if( nRow>=0 ){ sqlite3_str_appendf(pStats, "%srows=", zSp); qrfApproxInt64(pStats, nRow); zSp = " "; + if( p->spec.eStyle==QRF_STYLE_StatsEst ){ + sqlite3_str_appendf(pStats, " [est "); + qrfApproxDouble(pStats, rEstCum); + sqlite3_str_appendf(pStats, "]"); + } } - - if( p->spec.eStyle==QRF_STYLE_StatsEst ){ - rpl = nLoop ? (double)nRow / (double)nLoop : 0.0; - sqlite3_str_appendf(pStats, "%srpl=", zSp); - qrfApproxDouble(pStats, rpl); - sqlite3_str_appendf(pStats, " est="); - qrfApproxDouble(pStats, rEst); - } - sqlite3_str_appendf(pLine, "% *s (%s)", -1*(nWidth-qrfStatsHeight(pS,i)*3), zo, sqlite3_str_value(pStats) diff --git a/manifest b/manifest index 99edf4e34a..119b648540 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Render\sscan-status\svalues\swith\s3\sor\s4\ssignificant\sdigits\sonly,\sfor\nimproved\sreadability. -D 2026-02-04T13:35:32.765 +C Improved\sdisplay\sof\sscan-status\sestimates. +D 2026-02-04T17:52:50.152 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -420,7 +420,7 @@ F ext/misc/zipfile.c 837591f0505d21f7f7937ea046c9b0fc594f7fa3ca00c2bd54ffa1c94bf F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee F ext/qrf/README.md e6e0ce2700acf6fd06312b42726a8f08ca240f30e1b122bff87c71c602046352 F ext/qrf/dev-notes.md e68a6d91ce4c7eb296ef2daadc2bb79c95c317ad15b9fafe40850c67b29c2430 -F ext/qrf/qrf.c 1b9df1070489d0e82abbd5eec844bf20ef65787cc44f69b02649e47dc03bde7d +F ext/qrf/qrf.c fd014c041a2fd54c900800c69a4ef1a7611201a15a46b60b967f07abb2f7d21d F ext/qrf/qrf.h 2ac14b0aaacf44636d8c81051bfeab4afae50a98fbb2e10ff5aed0c28a87b2b2 F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8 F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255 @@ -2194,8 +2194,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 611cef0ec281ae06eac97df8048d617fd445c348c2fc1673202b9cc081a365db -R 948a2925b6f14b356c852d71e9b3a7e0 +P d9102ff0c43a496e782b0a3ec86ba7cd45f8118a07f15a4f3d58b399466d6cf2 +R 71c5e12c89ae4ea6f7261fec39f95a65 U drh -Z acac1c8caf17f6287150425d80569e65 +Z 78c49827531e9bf57fc9db5a8c807286 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 603a58b399..b22bf676c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d9102ff0c43a496e782b0a3ec86ba7cd45f8118a07f15a4f3d58b399466d6cf2 +70ef095740c62081090147bb1900c843cb31864e93a8af518ff48855f1175717 -- 2.47.3