From bf159fa21b14fc7d6f42d3ddda43feed3144928e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 25 Jun 2013 22:01:22 +0000 Subject: [PATCH] Add a new (experimental) sqlite3_stmt_status() verb that returns the number of VM steps. FossilOrigin-Name: f1366bab737a3ac2ea20a0ec014cc306d7ded8a5 --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/shell.c | 2 ++ src/sqlite.h.in | 10 ++++++++++ src/test1.c | 1 + src/vdbe.c | 5 ++++- src/vdbeInt.h | 2 +- 7 files changed, 32 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index cb36277b86..ef2d2ada38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunused\sfunction\sdeclaration\sfrom\sthe\sFTS3\ssource\scode. -D 2013-06-21T18:36:44.416 +C Add\sa\snew\s(experimental)\ssqlite3_stmt_status()\sverb\sthat\sreturns\sthe\snumber\nof\sVM\ssteps. +D 2013-06-25T22:01:22.917 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -216,8 +216,8 @@ F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 89f9003e8316ee3a172795459efc2a0274e1d5a8 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 22ee971346a736ddefdc4497d07c92f2e9978afc -F src/shell.c ab6eea968c8745be3aa74e45fedb37d057b4cd0d -F src/sqlite.h.in 5b390ca5d94e09e56e7fee6a51ddde4721b89f8e +F src/shell.c a02544af6697c5782d29ec3204616f35ed9e8458 +F src/sqlite.h.in 5f86553f4c1d8b4a9069285ed19e7981451ea77a F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0 F src/sqlite3ext.h d936f797812c28b81b26ed18345baf8db28a21a5 F src/sqliteInt.h 46fb17f604ce941551fe64c342dbeb4dbed3edaa @@ -225,7 +225,7 @@ F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c bedc37ec1a6bb9399944024d63f4c769971955a9 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c b8835978e853a89bf58de88acc943a5ca94d752e -F src/test1.c 6d2a340eea1d866bf7059894491652a69a7ee802 +F src/test1.c d94d55d85e7250fa3493585635811c584b1d05be F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df @@ -276,9 +276,9 @@ F src/update.c 4c0c6864c4349ba292042e984a56d15985b57f4e F src/utf.c 8d819e2e5104a430fc2005f018db14347c95a38f F src/util.c f566b5138099a2df8533b190d0dcc74b7dfbe0c9 F src/vacuum.c ddf21cc9577c4cb459d08bee9863a78ec000c5bb -F src/vdbe.c 34929e1b5bd95a85b5e1b7767b5cc8da582ad78d +F src/vdbe.c af2bc360189ce8eaed47133037e082a1652bc4a0 F src/vdbe.h b52887278cb173e66188da84dfab216bea61119d -F src/vdbeInt.h c1e830268b75f04a2901dd895b51a637a26c7045 +F src/vdbeInt.h b8a76f7b7304abfdb8e6bd286eba954ecfe73863 F src/vdbeapi.c 0b2c78797058c6c9bfa1687977de039566e22877 F src/vdbeaux.c af9cd9372c7ab82294b9645723e652c2d4213b95 F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69 @@ -1094,7 +1094,10 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P 361084e1eb281e985568d19fe217263be92be31d -R 0d6c636b8cfd628682ea33e027cb07be +P 096ae1d8f9a08f92daedece6b0615f4d22b05023 +R dca9e91df626c57b27d64840398d576b +T *branch * status-vm-step +T *sym-status-vm-step * +T -sym-trunk * U drh -Z 55b5720fc386809651d148c0a8415781 +Z 5f8be8eb1fd8b6cd7aa46981a30c4d1b diff --git a/manifest.uuid b/manifest.uuid index 773d5a6db0..6702da1e76 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -096ae1d8f9a08f92daedece6b0615f4d22b05023 \ No newline at end of file +f1366bab737a3ac2ea20a0ec014cc306d7ded8a5 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 9f2f46bd18..9a8a906944 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1109,6 +1109,8 @@ static int display_stats( fprintf(pArg->out, "Sort Operations: %d\n", iCur); iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset); fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); + fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur); } return 0; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 0d23f38944..0921d23a09 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -6303,11 +6303,21 @@ int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** A non-zero value in this counter may indicate an opportunity to ** improvement performance by adding permanent indices that do not ** need to be reinitialized each time the statement is run. +** +** [[SQLITE_STMTSTATUS_VM_STEP]]
SQLITE_STMTSTATUS_VM_STEP
+**
^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +**
** */ #define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 #define SQLITE_STMTSTATUS_SORT 2 #define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 /* ** CAPI3REF: Custom Page Cache Object diff --git a/src/test1.c b/src/test1.c index bd6d4a4cfd..a4df0e764f 100644 --- a/src/test1.c +++ b/src/test1.c @@ -2218,6 +2218,7 @@ static int test_stmt_status( { "SQLITE_STMTSTATUS_FULLSCAN_STEP", SQLITE_STMTSTATUS_FULLSCAN_STEP }, { "SQLITE_STMTSTATUS_SORT", SQLITE_STMTSTATUS_SORT }, { "SQLITE_STMTSTATUS_AUTOINDEX", SQLITE_STMTSTATUS_AUTOINDEX }, + { "SQLITE_STMTSTATUS_VM_STEP", SQLITE_STMTSTATUS_VM_STEP }, }; if( objc!=4 ){ Tcl_WrongNumArgs(interp, 1, objv, "STMT PARAMETER RESETFLAG"); diff --git a/src/vdbe.c b/src/vdbe.c index 7abc2889df..81b40628e1 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -556,12 +556,13 @@ int sqlite3VdbeExec( int checkProgress; /* True if progress callbacks are enabled */ int nProgressOps = 0; /* Opcodes executed since progress callback. */ #endif + int iCompare = 0; /* Result of last OP_Compare operation */ + unsigned nVmStep = 0; /* Number of virtual machine steps */ Mem *aMem = p->aMem; /* Copy of p->aMem */ Mem *pIn1 = 0; /* 1st input operand */ Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ - int iCompare = 0; /* Result of last OP_Compare operation */ int *aPermute = 0; /* Permutation of columns for OP_Compare */ i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */ #ifdef VDBE_PROFILE @@ -606,6 +607,7 @@ int sqlite3VdbeExec( origPc = pc; start = sqlite3Hwtime(); #endif + nVmStep++; pOp = &aOp[pc]; /* Only allow tracing if SQLITE_DEBUG is defined. @@ -6200,6 +6202,7 @@ vdbe_error_halt: ** top. */ vdbe_return: db->lastRowid = lastRowid; + p->aCounter[SQLITE_STMTSTATUS_VM_STEP-1] += (int)nVmStep; sqlite3VdbeLeave(p); return rc; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 3a5b4028bb..dc42187f06 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -344,7 +344,7 @@ struct Vdbe { yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ yDbMask lockMask; /* Subset of btreeMask that requires a lock */ int iStatement; /* Statement number (or 0 if has not opened stmt) */ - int aCounter[3]; /* Counters used by sqlite3_stmt_status() */ + int aCounter[4]; /* Counters used by sqlite3_stmt_status() */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif -- 2.39.5