aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2018-04-26 18:34:26 +0000
committerdrh <drh@noemail.net>2018-04-26 18:34:26 +0000
commit6876dccbfe1cc8cbbb7a5ba1d7126dde82a34dee (patch)
tree51f28012ea978c92dd49a0946f335882d0df6d53
parentc040e2b186a1795af7eb2eae9aec5020f9d706b0 (diff)
downloadsqlite-6876dccbfe1cc8cbbb7a5ba1d7126dde82a34dee.tar.gz
sqlite-6876dccbfe1cc8cbbb7a5ba1d7126dde82a34dee.zip
The previous fix for ticket [d85fffd6ffe856092ed8da] in check-in
[0a514e62ad1ebe5c12da8dae] did not completely address the probably in that it only worked for cases where the OP_SCopy that loaded the register was the last instruction in the sequence for the expression, which is not necessarily the case for expressions like CASE...END. This revision prevents the registered that will be recomputed from being cached in the first place. FossilOrigin-Name: 9fd0faf517993587d2f54212638545fc85fbbc84a031bcfae8c1e5894825d83b
-rw-r--r--manifest21
-rw-r--r--manifest.uuid2
-rw-r--r--src/update.c12
-rw-r--r--src/vdbe.h1
-rw-r--r--src/vdbeaux.c6
-rw-r--r--test/trigger1.test6
6 files changed, 23 insertions, 25 deletions
diff --git a/manifest b/manifest
index d319175a9..83c130153 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C When\sprocessing\san\s"ORDER\sBY\s...\sLIMIT"\sthat\sdoes\snot\suse\san\sindex,\scheck\nwhether\sor\snot\sa\srecord\smay\sappear\sin\sthe\sfinal\sresult\sset\sbefore\sadding\sit\sto\nthe\stemp\sb-tree\sused\sfor\ssorting.
-D 2018-04-26T17:43:35.709
+C The\sprevious\sfix\sfor\sticket\s[d85fffd6ffe856092ed8da]\sin\scheck-in\s\n[0a514e62ad1ebe5c12da8dae]\sdid\snot\scompletely\saddress\sthe\nprobably\sin\sthat\sit\sonly\sworked\sfor\scases\swhere\sthe\sOP_SCopy\sthat\sloaded\nthe\sregister\swas\sthe\slast\sinstruction\sin\sthe\ssequence\sfor\sthe\sexpression,\swhich\nis\snot\snecessarily\sthe\scase\sfor\sexpressions\slike\sCASE...END.\s\sThis\srevision\nprevents\sthe\sregistered\sthat\swill\sbe\srecomputed\sfrom\sbeing\scached\sin\sthe\sfirst\nplace.
+D 2018-04-26T18:34:26.853
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439
@@ -557,16 +557,16 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c bbde32eac9eb1280f5292bcdfef66f5a57e43176cbf9347e0efab9f75e133f97
F src/treeview.c 6cea286ca9af8b126dae9714799265353387244eba0d451c3cc2cd60946cc4c7
F src/trigger.c 4ace6d1d5ba9a89822deb287317f33c810440526eafe185c2d8a48c31df1e995
-F src/update.c 75ac1102d791d999ca918d7b3dced4b3023fb0ed1167a4b11591c5bc3cfbb439
+F src/update.c 5be2f501ddc704fc04183bdb28b25eab930bb8553d973429a089ec94fa85cf2b
F src/upsert.c ae4a4823b45c4daf87e8aea8c0f582a8844763271f5ed54ee5956c4c612734f4
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
F src/vacuum.c 762ee9bbf8733d87d8cd06f58d950e881982e416f8c767334a40ffd341b6bff5
F src/vdbe.c 066a4e1de2ed83e253adfd2e97a684cf562eaa41d31ee7f3d3e4c8aea4485a55
-F src/vdbe.h fff31fb658cf1aac5a2fb4d06f8d16589aef38a906e78a1565a78b8c5df7fc0a
+F src/vdbe.h 574ce9a0d57b026fc93ac379a339b8d391977f335ab4176a7e21ba902e9184bd
F src/vdbeInt.h 95f7adfdc5c8f1353321f55a6c5ec00a90877e3b85af5159e393afb41ff54110
F src/vdbeapi.c 29d2baf9c1233131ec467d7bed1b7c8a03c27579048d768c4b04acf427838858
-F src/vdbeaux.c b82ca213e6b5461ef773beb76a2cfb720b301372dd4797007eb13ef6cf6f18c4
+F src/vdbeaux.c 944bae5207bbce456c466d01dcf2aac3ad49c957325d35c0ba7de882d3e5c25c
F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
F src/vdbemem.c 0cbe9b9560e42b72983cf9e1bceba48f297e51142bfb6b57f3747cf60106b92d
F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
@@ -1477,7 +1477,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 254eb5245c472af5fd5a6d8c321f7af97b8532db2eff7a24c31ac67155a12c27
+F test/trigger1.test 17e4b43e656c4b354df2357634a6ba887990f510c43629f4feca30e3338d2a61
F test/trigger2.test 5cd7d69a7ba1143ee045e4ae2963ff32ae4c87a6
F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945
F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359
@@ -1725,8 +1725,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 0a514e62ad1ebe5c12da8daed429ae2f9d9910471d3c5cef3b6870bdadfefca1 71bf91c218334381b1b4bdba6a093e623b62e17f3e8550e154a11f0cb0b404f3
-R 4228df14b2641be536d92a6cbe9f519e
-T +closed 71bf91c218334381b1b4bdba6a093e623b62e17f3e8550e154a11f0cb0b404f3
-U dan
-Z 8a2a73a40bbf3e885ec761eb0e674078
+P 0fcfc36ceb820fc70136b799a0405fe92e50646e697be2872bbe9a53a05ed5a9
+R 678fd436c8bb55088cd3e5add9e902ed
+U drh
+Z f084b8f7ac201c9b316a44eacae3d476
diff --git a/manifest.uuid b/manifest.uuid
index 9db48c253..cf4cf4ab2 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-0fcfc36ceb820fc70136b799a0405fe92e50646e697be2872bbe9a53a05ed5a9 \ No newline at end of file
+9fd0faf517993587d2f54212638545fc85fbbc84a031bcfae8c1e5894825d83b \ No newline at end of file
diff --git a/src/update.c b/src/update.c
index d098df820..913fc2dd7 100644
--- a/src/update.c
+++ b/src/update.c
@@ -602,12 +602,6 @@ void sqlite3Update(
j = aXRef[i];
if( j>=0 ){
sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i);
- if( tmask&TRIGGER_BEFORE ){
- /* Must preserve copied values even in case the original is
- ** reloaded in the After-BEFORE-trigger-reload-loop below.
- ** Ticket d85fffd6ffe856092ed8daefa811b1e399706b28 */
- sqlite3VdbeSwapOpcode(v, -1, OP_SCopy, OP_Copy);
- }
}else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){
/* This branch loads the value of a column that will not be changed
** into a register. This is done if there are no BEFORE triggers, or
@@ -617,6 +611,12 @@ void sqlite3Update(
testcase( i==31 );
testcase( i==32 );
sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i);
+ if( tmask & TRIGGER_BEFORE ){
+ /* This value will be recomputed in After-BEFORE-trigger-reload-loop
+ ** below, so make sure that it is not cached and reused.
+ ** Ticket d85fffd6ffe856092ed8daefa811b1e399706b28. */
+ sqlite3ExprCacheRemove(pParse, regNew+i, 1);
+ }
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
}
diff --git a/src/vdbe.h b/src/vdbe.h
index 6dcf2e4dd..60525a9e9 100644
--- a/src/vdbe.h
+++ b/src/vdbe.h
@@ -200,7 +200,6 @@ void sqlite3VdbeEndCoroutine(Vdbe*,int);
VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno);
void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8);
-void sqlite3VdbeSwapOpcode(Vdbe*, u32 addr, u8, u8);
void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1);
void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2);
void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3);
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index aff08ea3e..be092b98b 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -843,12 +843,6 @@ void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){
if( p->nOp>0 ) p->aOp[p->nOp-1].p5 = p5;
}
-/* Change the opcode to iNew if it was previously iOld */
-void sqlite3VdbeSwapOpcode(Vdbe *p, u32 addr, u8 iOld, u8 iNew){
- VdbeOp *pOp = sqlite3VdbeGetOp(p,addr);
- if( pOp->opcode==iOld ) pOp->opcode = iNew;
-}
-
/*
** Change the P2 operand of instruction addr so that it points to
** the address of the next instruction to be coded.
diff --git a/test/trigger1.test b/test/trigger1.test
index f3a0e6297..8946cd85c 100644
--- a/test/trigger1.test
+++ b/test/trigger1.test
@@ -761,5 +761,11 @@ do_execsql_test trigger1-19.0 {
UPDATE t19 SET c=b WHERE a=1;
SELECT * FROM t19;
} {1 2 2}
+do_execsql_test trigger1-19.1 {
+ DELETE FROM t19;
+ INSERT INTO t19(a,b,c) VALUES(1,2,3);
+ UPDATE t19 SET c=CASE WHEN b=2 THEN b ELSE b+99 END WHERE a=1;
+ SELECT * FROM t19;
+} {1 2 2}
finish_test