-C In\sthe\skvtest.c\stest\sutility,\sreuse\sthe\sbuffer\sinto\swhich\sblobs\sare\sread,\nrather\sthan\sreallocating\sit\sfor\seach\srow.\s\sThis\sis\sa\scloser\smatch\sto\show\nother\stest\sprograms\swork,\sand\sthus\sprovides\sa\sbetter\scomparison.
-D 2017-01-21T15:55:41.656
+C Add\sextra\s(somewhat\sinefficient)\strace\scallbacks\sfor\striggers\sif\sSQLITE_TRACE_TRIGGER\sis\sdefined.
+D 2017-01-21T15:58:42.695
F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da
F src/resolve.c f9bc0de45a30a450da47b3766de00be89bf9be79
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 3856db523b942062bca8722ba03b61c324ff94d6
-F src/shell.c 6095531aa900decdaa765e0f3993fba7153c92c1
+F src/shell.c 0344f71dc008df2433ae10175f59ad432c428810
F src/sqlite.h.in e71655293c9bde26939496f3aac9d1821d2c07a2
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae
F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c
F src/util.c a88b0466fddf445ce752226d4698ca3faada620a
F src/vacuum.c 33c174b28886b2faf26e503b5a49a1c01a9b1c16
-F src/vdbe.c c7add5978cb84ae3a7bcb16f8b56cb3bbdf04b7e
+F src/vdbe.c a2e8ea847859c8bccdcfa775413f42b381df6c66
F src/vdbe.h b0866e4191f096f1c987a84b042c3599bdf5423b
-F src/vdbeInt.h 281cb70332dc8b593b8c7afe776f3a2ba7d4255e
+F src/vdbeInt.h 4cad10b68ed052104a997454540ea71ceb2888e1
F src/vdbeapi.c d6ebaa465f070eb1af8ba4e7b34583ece87bdd24
F src/vdbeaux.c 35c9a9908174e5a26c96d15e1f98214814a39147
F src/vdbeblob.c 824f360105b8cd43c2ec8c4611fd3b162a3a3eed
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 9d197a532349f4b1caf66bbed70ca46df86cb86f
-R 2ba22a751baba0a74113cf71f6292807
-U drh
-Z 28f64e9f53e7fb024862aee0e897381f
+P 0d1ad13a296b22d6fe36879b56f99bd6af1acd3a
+R 8060b839ccd84e4e1ab0cfce250c64af
+T *branch * trigger-trace
+T *sym-trigger-trace *
+T -sym-trunk *
+U dan
+Z 33d7cd6899dfe41d4b1c6eef55037e2e
-0d1ad13a296b22d6fe36879b56f99bd6af1acd3a
\ No newline at end of file
+ffda1d1e1c858abd02f0c07b906cfac5ad075498
\ No newline at end of file
int autoExplain; /* Automatically turn on .explain mode */
int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
int statsOn; /* True to display memory stats before each finalize */
+ int vmstepsOn; /* Display VM steps before each finalize */
int scanstatsOn; /* True to display scan stats before each finalize */
int countChanges; /* True to display change counts */
int backslashOn; /* Resolve C-style \x escapes in SQL input text */
display_stats(db, pArg, 0);
}
+ if( pArg && pArg->vmstepsOn && pStmt ){
+ int iCur = sqlite3_stmt_status(pStmt, SQLITE_STMTSTATUS_VM_STEP, 0);
+ FILE *out = pArg->traceOut ? pArg->traceOut : pArg->out;
+ raw_printf(out, "VM steps: %d\n", iCur);
+ }
+
/* print loop-counters if required */
if( pArg && pArg->scanstatsOn ){
display_scanstats(db, pArg);
}
}else
+ if( c=='v' && strncmp(azArg[0], "vmsteps", n)==0 ){
+ if( nArg==2 ){
+ p->vmstepsOn = booleanValue(azArg[1]);
+ }else{
+ raw_printf(stderr, "Usage: .vmsteps ?on|off?\n");
+ rc = 1;
+ }
+ }else
+
+
#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
p->nFrame--;
sqlite3VdbeSetChanges(db, p->nChange);
pcx = sqlite3VdbeFrameRestore(pFrame);
+#ifdef SQLITE_TRACE_TRIGGER
+ if( (db->mTrace & SQLITE_TRACE_STMT) && aOp[0].p4.z ){
+ int nNest = 0;
+ VdbeFrame *pF;
+ int nTotal = nVmStep - pFrame->nVmStep;
+ char *zTrace;
+ assert( db->xTrace );
+ for(pF=p->pFrame; pF; pF=pF->pParent) nNest++;
+ zTrace = sqlite3_mprintf("%.*s%s completed (VM steps: total=%d self=%d)",
+ nNest, " :",
+ aOp[0].p4.z, nTotal, nVmStep - pFrame->nVmStepAdj
+ );
+ if( zTrace ){
+ (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, 0, zTrace);
+ sqlite3_free(zTrace);
+ }
+ if( p->pFrame ){
+ p->pFrame->nVmStepAdj += nTotal;
+ }
+ }
+#endif
lastRowid = db->lastRowid;
if( pOp->p2==OE_Ignore ){
/* Instruction pcx is the OP_Program that invoked the sub-program
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
pFrame->anExec = p->anExec;
#endif
+#ifdef SQLITE_TRACE_TRIGGER
+ pFrame->nVmStep = nVmStep;
+ pFrame->nVmStepAdj = nVmStep;
+#endif
pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem];
for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){
x(db->pTraceArg, z);
sqlite3_free(z);
}else
+#endif
+#ifdef SQLITE_TRACE_TRIGGER
+ if( p->pFrame ){
+ int nNest = -1;
+ VdbeFrame *pFrame;
+ for(pFrame=p->pFrame; pFrame; pFrame=pFrame->pParent) nNest++;
+ zTrace = sqlite3_mprintf("%.*s%s",
+ nNest, " :", zTrace
+ );
+ if( zTrace ){
+ (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, zTrace);
+ sqlite3_free(zTrace);
+ }
+ }else
#endif
{
(void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, zTrace);
int nChildCsr; /* Number of cursors for child frame */
int nChange; /* Statement changes (Vdbe.nChange) */
int nDbChange; /* Value of db->nChange */
+#ifdef SQLITE_TRACE_TRIGGER
+ int nVmStep; /* Value of nVmStep at start of program */
+ int nVmStepAdj; /* Adjusted for nested programs */
+#endif
};
#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])