]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add an assert() to help verify that OP_AggInverse is never called on an
authordrh <drh@noemail.net>
Sat, 7 Jul 2018 19:36:04 +0000 (19:36 +0000)
committerdrh <drh@noemail.net>
Sat, 7 Jul 2018 19:36:04 +0000 (19:36 +0000)
accumulator that has not previously been processed by OP_AggStep.

FossilOrigin-Name: 4213889103fa37f3f11802aea81989522048a0752820603dd556f612128ddfee

manifest
manifest.uuid
src/vdbe.c

index ccc5ad8b3aaa4d4c71be066875c378cd72f9337c..4052b6db21dedaf30e9436a2760c26c653e40653 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\smissing\sVdbeCoverage()\smacro\sto\swindow.c.
-D 2018-07-07T17:38:49.431
+C Add\san\sassert()\sto\shelp\sverify\sthat\sOP_AggInverse\sis\snever\scalled\son\san\naccumulator\sthat\shas\snot\spreviously\sbeen\sprocessed\sby\sOP_AggStep.
+D 2018-07-07T19:36:04.960
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
@@ -566,7 +566,7 @@ F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
 F src/vacuum.c 36e7d21a20c0bf6ef4ef7c399d192b5239410b7c4d3c1070fba4e30810d0b855
-F src/vdbe.c 4e2768e83fd5b705b6244855818ae40178be2edf4288a45c625c03a9f755711b
+F src/vdbe.c 800c69a80609b4837d3403e15092e585f356711823529ad1c04fe5ca8e9f9aec
 F src/vdbe.h 9c8c245fa3785266c269ab02c135c836ff49a307612186686bcdae500f409945
 F src/vdbeInt.h 6b5cbd338dc9aaad343fb11b455e47463b0474d9f79710f50e647158941146e0
 F src/vdbeapi.c af4a3de00d1851bcbc55b85dfbe52849aa2b1e17b4a5a1f3d9c257df7af361ff
@@ -1745,7 +1745,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b76f35b09235d44dc3d176377bbb9c18b7cdc9392800103ff53c54730a427a5c
-R 9a9cadea1ad6d03a6c8240ae8e086be3
-U dan
-Z 3bb8908687d2fe4d3a687df5dfa8ba78
+P 63f4d306ba19f6ba900a7d7480ccaa3d1e4a204e7c82bf5eb2e4bd849ef3a22f
+R f7d5332c6156e78db8011d9c3f819c01
+U drh
+Z 3827c8ff60b89edfd852655ba9c60594
index 3e273ec834b9a8f8c792669f4fda7e97cf071bfa..21c88c9bdf4a69e368b0926ce88f6041e6822ab5 100644 (file)
@@ -1 +1 @@
-63f4d306ba19f6ba900a7d7480ccaa3d1e4a204e7c82bf5eb2e4bd849ef3a22f
\ No newline at end of file
+4213889103fa37f3f11802aea81989522048a0752820603dd556f612128ddfee
\ No newline at end of file
index 33cacda2a02898abd52543a6290c966e4e2fb315..f2e68d4c1ee2ddbccd1e7e6205683cbd2deffb6b 100644 (file)
@@ -1155,6 +1155,9 @@ case OP_Null: {           /* out2 */
   assert( pOp->p3<=(p->nMem+1 - p->nCursor) );
   pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null;
   pOut->n = 0;
+#ifdef SQLITE_DEBUG
+  pOut->uTemp = 0;
+#endif
   while( cnt>0 ){
     pOut++;
     memAboutToChange(p, pOut);
@@ -6351,7 +6354,10 @@ case OP_AggStep: {
   pCtx->argc = n;
   pOp->p4type = P4_FUNCCTX;
   pOp->p4.pCtx = pCtx;
+
+  /* OP_AggInverse must have P1==1 and OP_AggStep must have P1==0 */
   assert( pOp->p1==(pOp->opcode==OP_AggInverse) );
+
   pOp->opcode = OP_AggStep1;
   /* Fall through into OP_AggStep */
 }
@@ -6364,6 +6370,17 @@ case OP_AggStep1: {
   pCtx = pOp->p4.pCtx;
   pMem = &aMem[pOp->p3];
 
+#ifdef SQLITE_DEBUG
+  if( pOp->p1 ){
+    /* This is an OP_AggInverse call.  Verify that xStep has always
+    ** been called at least once prior to any xInverse call. */
+    assert( pMem->uTemp==0x1122e0e3 );
+  }else{
+    /* This is an OP_AggStep call.  Mark it as such. */
+    pMem->uTemp = 0x1122e0e3;
+  }
+#endif
+
   /* If this function is inside of a trigger, the register array in aMem[]
   ** might change from one evaluation to the next.  The next block of code
   ** checks to see if the register array has changed, and if so it