sqlite3_free(aiIndent);
}
+/*
+** Do a "scanstatus vm" style EXPLAIN listing on p->pStmt.
+**
+** p->pStmt is probably not an EXPLAIN query. Instead, construct a
+** new query that is a bytecode() rendering of p->pStmt with extra
+** columns for the "scanstatus vm" outputs, and run the results of
+** that new query through the normal EXPLAIN formatting.
+*/
+static void qrfScanStatusVm(Qrf *p){
+ sqlite3_stmt *pOrigStmt = p->pStmt;
+ sqlite3_stmt *pExplain;
+ int rc;
+ static const char *zSql =
+ " SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
+ " format('% 6s (%.2f%%)',"
+ " CASE WHEN ncycle<100_000 THEN ncycle || ' '"
+ " WHEN ncycle<100_000_000 THEN (ncycle/1_000) || 'K'"
+ " WHEN ncycle<100_000_000_000 THEN (ncycle/1_000_000) || 'M'"
+ " ELSE (ncycle/1000_000_000) || 'G' END,"
+ " ncycle*100.0/(sum(ncycle) OVER ())"
+ " ) AS cycles"
+ " FROM bytecode(?1)";
+ rc = sqlite3_prepare_v2(p->db, zSql, -1, &pExplain, 0);
+ if( rc ){
+ qrfError(p, rc, "%s", sqlite3_errmsg(p->db));
+ sqlite3_finalize(pExplain);
+ return;
+ }
+ sqlite3_bind_pointer(pExplain, 1, pOrigStmt, "stmt-pointer", 0);
+ p->pStmt = pExplain;
+ qrfExplain(p);
+ sqlite3_finalize(pExplain);
+ p->pStmt = pOrigStmt;
+}
+
/*
** Initialize the internal Qrf object.
*/
** mode is EQP, so do not leave the mode in EQP if the statement is
** not an EQP statement.
*/
- p->spec.eStyle = QRF_STYLE_Quote;
+ p->spec.eStyle = QRF_STYLE_Column;
p->spec.bColumnNames = QRF_SW_On;
p->spec.eText = QRF_TEXT_Sql;
p->spec.eBlob = QRF_BLOB_Sql;
- p->spec.zColumnSep = ",";
+ p->spec.zColumnSep = " ";
p->spec.zRowSep = "\n";
}
break;
** mode is Explain, so do not leave the mode in Explain if the
** statement is not an EXPLAIN statement.
*/
- p->spec.eStyle = QRF_STYLE_Quote;
+ p->spec.eStyle = QRF_STYLE_Column;
p->spec.bColumnNames = QRF_SW_On;
p->spec.eText = QRF_TEXT_Sql;
p->spec.eBlob = QRF_BLOB_Sql;
- p->spec.zColumnSep = ",";
+ p->spec.zColumnSep = " ";
p->spec.zRowSep = "\n";
}
break;
qrfExplain(&qrf);
break;
}
+ case QRF_STYLE_ScanExp: {
+ qrfScanStatusVm(&qrf);
+ break;
+ }
default: {
/* Non-columnar modes where the output can occur after each row
** of result is received */
-C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sqrf\sbranch.
-D 2025-11-06T13:25:40.029
+C Changes\sto\stry\sto\simprove\sEXPLAIN\scapabilities.\s\sThis\sis\sa\ssnapshot\nprior\sto\san\sattempt\sto\smake\ssweeping\schanges\sin\sthat\sarea\sof\sthe\ninterface.
+D 2025-11-06T17:28:34.534
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F ext/misc/zipfile.c 09e6e3a3ff40a99677de3c0bc6569bd5f4709b1844ac3d1c1452a456c5a62f1c
F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee
F ext/qrf/README.md 5f12f91104d5df8ba8783e2240635698569ce54935e721b3a4e93abf4e00ddcb
-F ext/qrf/qrf.c 4286a30696a106a39f7fe43f65384a239157c2e1bb7e55b92600086799b5c00c
+F ext/qrf/qrf.c 598c793d08461d62ed4e74078f8542e2ff4a733ff4eeaa05de8dbd8c5829f311
F ext/qrf/qrf.h 98e02eded10848c42053d37e56bd15ab69cb6fe9fc1f1ca05823d9047e9c8509
F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8
F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 9a9c4580772fa35a68b3e27a40fc9bc615144979dfd27b1054538e29a489c024 305bb022368bac9fafd7c2794762299324796903aaea270923d07f2127d8926c
-R 7930f95caf614489786b62ded9bfb23b
+P 4e2ada6ad8a56d00aeb73570dc4ee22c484b65b8100a42a7085414d0a4c68afd
+R ada052660ca6412932dab58de0554df7
U drh
-Z 84a722bb644539f8dee173b588bffd78
+Z e00ad94c88d3ff9e91d08c82898645f1
# Remove this line to create a well-formed Fossil manifest.