From: drh Date: Thu, 24 Oct 2019 19:35:26 +0000 (+0000) Subject: Correction to check-in [bec5b6d4d083556d] so that it detects *all* X-Git-Tag: version-3.31.0~386 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=06baba54b4d097113e8a425010d31f044df57f4b;p=thirdparty%2Fsqlite.git Correction to check-in [bec5b6d4d083556d] so that it detects *all* triggers that might perturb the insertion cursor. Ticket [50c09fc2cf0d91ce]. FossilOrigin-Name: 521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b --- diff --git a/manifest b/manifest index b48aecb39e..9d3af284e6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sexperimental\sset\sof\sUUID\sprocessing\sfunctions\sas\sthe\suuid.c\nextension\sin\sext/misc/uuid.c. -D 2019-10-23T21:00:40.803 +C Correction\sto\scheck-in\s[bec5b6d4d083556d]\sso\sthat\sit\sdetects\s*all*\ntriggers\sthat\smight\sperturb\sthe\sinsertion\scursor.\nTicket\s[50c09fc2cf0d91ce]. +D 2019-10-24T19:35:26.195 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 69e47d76598d26f87cc9b32b9e9fc84e49e3b9371b5d9ae8465f38486ad9665e +F src/insert.c 2b930afc0fb4c245916d19f638e4b332f4a6d8a3a7c73c288ec18e25caf46900 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -599,10 +599,10 @@ F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 9a3f4c2ec6c45e4bd5db465e77e79dfdf5bdc5cf3a8c0bfe9549da209b9c18bc -F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf +F src/vdbe.h 7fbde1e64423368d7fd9b606dcde1c90eb24f6f7ea1f625d161731ac2f703fca F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c a35a1785f980c44838b636a6d55a46b25ad80f2a2065851f165ab143aa46f99c +F src/vdbeaux.c be3e250525e4a75f82a8cfa0dcfe2e9cad058cf16c8c568677c2b13043db1e2d F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1570,7 +1570,7 @@ F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test 6be279c9d48b25320eab68c30fd5268ab787955679f4c584128f71800247fb50 +F test/trigger1.test 746dc327e2a0817a22bfc6f5a5e423483d3e77b3733ac20a8fe939e6541b5e53 F test/trigger2.test 5cd7d69a7ba1143ee045e4ae2963ff32ae4c87a6 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 @@ -1848,7 +1848,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 978b2d20cf95d0b7143e3104ce1e9d5c85002867b554dc6b21deb528b730bbc7 -R 64938473a0a5ad3e464c05ab968a1d3f +P 1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 +R 261f5a821821bff58698ad94c5756d8a U drh -Z 064b470a12983289ba0d29967199891d +Z 32a0c838e11db7d7d6e97512ba7b2d3c diff --git a/manifest.uuid b/manifest.uuid index c7965852a7..0f8ad72971 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 \ No newline at end of file +521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 3bb1ee706a..77b402c7ec 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1058,9 +1058,7 @@ void sqlite3Insert( ** cursor that is disturbed. And these instructions both clear the ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT ** functionality. */ - bUseSeek = (isReplace==0 || (pTrigger==0 && - ((db->flags & SQLITE_ForeignKeys)==0 || sqlite3FkReferences(pTab)==0) - )); + bUseSeek = (isReplace==0 || !sqlite3VdbeHasSubProgram(v)); sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, regIns, aRegIdx, 0, appendFlag, bUseSeek ); diff --git a/src/vdbe.h b/src/vdbe.h index e3aaaa1ce2..b59fc7a26d 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -278,9 +278,8 @@ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); -#ifndef SQLITE_OMIT_TRIGGER void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); -#endif +int sqlite3VdbeHasSubProgram(Vdbe*); int sqlite3NotPureFunc(sqlite3_context*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c89b7d4197..86980b4ddc 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1098,6 +1098,13 @@ void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ pVdbe->pProgram = p; } +/* +** Return true if the given Vdbe has any SubPrograms. +*/ +int sqlite3VdbeHasSubProgram(Vdbe *pVdbe){ + return pVdbe->pProgram!=0; +} + /* ** Change the opcode at addr into OP_Noop */ diff --git a/test/trigger1.test b/test/trigger1.test index ddb40e3adb..8fc3c74e77 100644 --- a/test/trigger1.test +++ b/test/trigger1.test @@ -782,4 +782,20 @@ do_execsql_test trigger1-20.1 { DROP TRIGGER r20_3; } {} +# 2019-10-24 ticket 50c09fc2cf0d91ce +# +db close +sqlite3 db :memory: +do_execsql_test trigger1-21.1 { + PRAGMA recursive_triggers = true; + CREATE TABLE t0(a, b, c UNIQUE); + CREATE UNIQUE INDEX i0 ON t0(b) WHERE a; + CREATE TRIGGER tr0 AFTER DELETE ON t0 BEGIN + DELETE FROM t0; + END; + INSERT INTO t0(a,b,c) VALUES(0,0,9),(1,1,1); + REPLACE INTO t0(a,b,c) VALUES(2,0,9); + SELECT * FROM t0; +} {2 0 9} + finish_test