From: drh Date: Fri, 24 Mar 2017 18:38:41 +0000 (+0000) Subject: Previous check-in was not correct. This is a better fix for the OP_Once X-Git-Tag: version-3.18.0~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=18333efd51814cecb3af5718abfbd867b10cd6a6;p=thirdparty%2Fsqlite.git Previous check-in was not correct. This is a better fix for the OP_Once problem of ticket [06796225f59c057cd120f1]. FossilOrigin-Name: 8194dd2814b0b3f8cffbcb16306f55aabf1c1508b9d27fa806f92f0e6ecd7631 --- diff --git a/manifest b/manifest index f9ac9232e6..e0db435a03 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Once\sopcode\sso\sthat\sit\sworks\scorrectly\sfor\srecursive\striggers.\nTicket\s[06796225f59c057cd120f1]. -D 2017-03-24T17:59:56.312 +C Previous\scheck-in\swas\snot\scorrect.\s\sThis\sis\sa\sbetter\sfix\sfor\sthe\sOP_Once\nproblem\sof\sticket\s[06796225f59c057cd120f1]. +D 2017-03-24T18:38:41.822 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 1faf9f06aadc9284c212dea7bbc7c0dea7e8337f0287c81001eff500912c790a @@ -468,7 +468,7 @@ F src/update.c 456d4a4656f8a03c2abc88a51b19172197400e58 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c F src/util.c ca8440ede81e155d15cff7c101654f60b55a9ae6 F src/vacuum.c 1fe4555cd8c9b263afb85b5b4ee3a4a4181ad569 -F src/vdbe.c e59bd3416627d11f76da18ed5a85e93b3c6172892a9d44371d05a7c7183d7b94 +F src/vdbe.c f1acf5744cef62cbfd0b503d84289f840b6cdc980ac47b0d9632dfdb89cc79eb F src/vdbe.h caa5346d52bae2a3c8c1dcfa60a7a4dc878a9e3865cb8239da55808b316c8158 F src/vdbeInt.h 5db089ce18c4feff8820ec6e4cac2d2c82e03d4b1d96f10a6e43832147b8dffe F src/vdbeapi.c 5b08d82592bcff4470601fe78aaabebd50837860 @@ -1360,7 +1360,7 @@ F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test 15fa63f1097db1f83dd62d121616006978063d1f F test/triggerF.test 55b1eb13433997faac3a4948c1d8252f6c8c636b -F test/triggerG.test 6eb0dbb4ce35df990034e54951e882c69ffbc3462e9c33a021edf66464f8b91b +F test/triggerG.test 175cafdc6399d85231a09e82e051b0e45a2fd1f23dd08ae715bc359716149ab6 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 @@ -1569,7 +1569,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 c5441d2df2526723f72610cc14dd243223663979e67ecdd76fe06fcd366f2b29 -R 06e33989e2f9f8999f70d02209e735fb +P 2556014514f36808e6d18b25722eae0daeeb8fbb5d18af13a9698ea6c6db1679 +R 0d4df4a8a9e2796f99d4dab5fea97642 U drh -Z d9ba825914c037a52e49ea53bb54865f +Z 19353cf9e153b27d983c51cfd380c21a diff --git a/manifest.uuid b/manifest.uuid index 1ba0445ee1..71e1d00f96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2556014514f36808e6d18b25722eae0daeeb8fbb5d18af13a9698ea6c6db1679 \ No newline at end of file +8194dd2814b0b3f8cffbcb16306f55aabf1c1508b9d27fa806f92f0e6ecd7631 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5e99366b2d..406394c5be 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2354,9 +2354,9 @@ case OP_Once: { /* jump */ iAddr = (int)(pOp - p->aOp); if( (p->pFrame->aOnce[iAddr/8] & (1<<(iAddr & 7)))!=0 ){ VdbeBranchTaken(1, 2); - p->pFrame->aOnce[iAddr/8] |= 1<<(iAddr & 7); goto jump_to_p2; } + p->pFrame->aOnce[iAddr/8] |= 1<<(iAddr & 7); }else{ if( p->aOp[0].p1==pOp->p1 ){ VdbeBranchTaken(1, 2); @@ -5943,6 +5943,7 @@ case OP_Program: { /* jump */ p->nCursor = (u16)pFrame->nChildCsr; p->apCsr = (VdbeCursor **)&aMem[p->nMem]; pFrame->aOnce = (u8*)&p->apCsr[pProgram->nCsr]; + memset(pFrame->aOnce, 0, (pProgram->nOp + 7)/8); p->aOp = aOp = pProgram->aOp; p->nOp = pProgram->nOp; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS diff --git a/test/triggerG.test b/test/triggerG.test index 9faa898dc3..c770b5bd76 100644 --- a/test/triggerG.test +++ b/test/triggerG.test @@ -44,4 +44,22 @@ do_execsql_test 110 { SELECT b FROM t2 ORDER BY b; } {202 203 302 303 402 403 502 503} +do_execsql_test 200 { + DELETE FROM t1; + INSERT INTO t1(a) VALUES(0),(2),(3),(8),(9); + DELETE FROM t2; + DELETE FROM t3; + DROP TRIGGER tr; + CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN + INSERT INTO t3 SELECT new.c+1 WHERE new.c<5; + INSERT INTO t2 SELECT new.c*10000+xx.a*100+yy.a + FROM t1 AS xx, t1 AS yy + WHERE xx.a IN (1,2,3,4) + AND yy.a IN (2,3,4,5); + END; + + INSERT INTO t3 VALUES(2); + SELECT b FROM t2 ORDER BY b; +} {20202 20203 20302 20303 30202 30203 30302 30303 40202 40203 40302 40303 50202 50203 50302 50303} + finish_test