]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Previous check-in was not correct. This is a better fix for the OP_Once
authordrh <drh@noemail.net>
Fri, 24 Mar 2017 18:38:41 +0000 (18:38 +0000)
committerdrh <drh@noemail.net>
Fri, 24 Mar 2017 18:38:41 +0000 (18:38 +0000)
problem of ticket [06796225f59c057cd120f1].

FossilOrigin-Name: 8194dd2814b0b3f8cffbcb16306f55aabf1c1508b9d27fa806f92f0e6ecd7631

manifest
manifest.uuid
src/vdbe.c
test/triggerG.test

index f9ac9232e68fe8c82bd730718921cca134c95e00..e0db435a035f78f9bc42b8e011cfa14af9cd129b 100644 (file)
--- 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
index 1ba0445ee1f602ce40a1e7b6d758874c5076bc44..71e1d00f96879d2655f63d9e20b1d0d0bd5cda76 100644 (file)
@@ -1 +1 @@
-2556014514f36808e6d18b25722eae0daeeb8fbb5d18af13a9698ea6c6db1679
\ No newline at end of file
+8194dd2814b0b3f8cffbcb16306f55aabf1c1508b9d27fa806f92f0e6ecd7631
\ No newline at end of file
index 5e99366b2d0329325a624b53559e456cf81c0ab7..406394c5be77e2e76b12532a3d61230b54d6bf23 100644 (file)
@@ -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
index 9faa898dc3976d02736daa28de3abda093262b75..c770b5bd766c8702c8e38b234b1f8dfc71a03b5b 100644 (file)
@@ -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