From: drh Date: Sat, 7 Jul 2018 19:36:04 +0000 (+0000) Subject: Add an assert() to help verify that OP_AggInverse is never called on an X-Git-Tag: version-3.25.0~155 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c885d0575cbe6f2a7ad45cd4a631e1a359b5b00;p=thirdparty%2Fsqlite.git Add an assert() to help verify that OP_AggInverse is never called on an accumulator that has not previously been processed by OP_AggStep. FossilOrigin-Name: 4213889103fa37f3f11802aea81989522048a0752820603dd556f612128ddfee --- diff --git a/manifest b/manifest index ccc5ad8b3a..4052b6db21 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 3e273ec834..21c88c9bdf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -63f4d306ba19f6ba900a7d7480ccaa3d1e4a204e7c82bf5eb2e4bd849ef3a22f \ No newline at end of file +4213889103fa37f3f11802aea81989522048a0752820603dd556f612128ddfee \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 33cacda2a0..f2e68d4c1e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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