]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add extra (somewhat inefficient) trace callbacks for triggers if SQLITE_TRACE_TRIGGER...
authordan <dan@noemail.net>
Sat, 21 Jan 2017 15:58:42 +0000 (15:58 +0000)
committerdan <dan@noemail.net>
Sat, 21 Jan 2017 15:58:42 +0000 (15:58 +0000)
FossilOrigin-Name: ffda1d1e1c858abd02f0c07b906cfac5ad075498

manifest
manifest.uuid
src/shell.c
src/vdbe.c
src/vdbeInt.h

index 17270cb28569a2bd3fec0c1b44b7e07a79a9f847..f5450c32125cd7caa48b8bb35c8328ad4087fd49 100644 (file)
--- 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
index 1b9ab055af3b24cb75ae4f55b847e55ba9872c90..c17bf1eca7c9c5efefb1be23b00bee45ced88af4 100644 (file)
@@ -1 +1 @@
-0d1ad13a296b22d6fe36879b56f99bd6af1acd3a
\ No newline at end of file
+ffda1d1e1c858abd02f0c07b906cfac5ad075498
\ No newline at end of file
index b0928ce7928917dbd3203a3cb59bb6c1c8701c61..444d7e856e345a620706afe231c681d2eb777d74 100644 (file)
@@ -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;
index cbb7867512f2091b0da1391b7e83aa640419f257..65c5cc04c684bc42a44726490d18e316a9e5482f 100644 (file)
@@ -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);
index 3e6bb068890efa9cc33f0aec19357cf8b7ea5df9..da4a19bb6158f38f516c98c7ada005194b9342a4 100644 (file)
@@ -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))])