From: dan Date: Sat, 21 Jan 2017 15:58:42 +0000 (+0000) Subject: Add extra (somewhat inefficient) trace callbacks for triggers if SQLITE_TRACE_TRIGGER... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0fbee297002e5eb7538a6630b51223d1344fc24d;p=thirdparty%2Fsqlite.git Add extra (somewhat inefficient) trace callbacks for triggers if SQLITE_TRACE_TRIGGER is defined. FossilOrigin-Name: ffda1d1e1c858abd02f0c07b906cfac5ad075498 --- diff --git a/manifest b/manifest index 17270cb285..f5450c3212 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 @@ -391,7 +391,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 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 @@ -457,9 +457,9 @@ F src/update.c b356b29d04c71f33c779f2cb557cf953819bdd7a 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 @@ -1547,7 +1547,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 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 diff --git a/manifest.uuid b/manifest.uuid index 1b9ab055af..c17bf1eca7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d1ad13a296b22d6fe36879b56f99bd6af1acd3a \ No newline at end of file +ffda1d1e1c858abd02f0c07b906cfac5ad075498 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index b0928ce792..444d7e856e 100644 --- a/src/shell.c +++ b/src/shell.c @@ -614,6 +614,7 @@ struct ShellState { 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 */ @@ -1997,6 +1998,12 @@ static int shell_exec( 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); @@ -5339,6 +5346,16 @@ static int do_meta_command(char *zLine, ShellState *p){ } }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; diff --git a/src/vdbe.c b/src/vdbe.c index cbb7867512..65c5cc04c6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -960,6 +960,27 @@ case OP_Halt: { 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 @@ -5833,6 +5854,10 @@ case OP_Program: { /* jump */ #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++){ @@ -6889,6 +6914,20 @@ case OP_Init: { /* jump */ 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); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 3e6bb06889..da4a19bb61 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -175,6 +175,10 @@ struct VdbeFrame { 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))])