From ff37c4078729e5d24fa80aa803a1e2c7baf1b25d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Oct 2019 20:54:20 +0000 Subject: [PATCH] Correctly generate pre-UPDATE content for virtual columns that are used by foreign key constraints. Ticket [b9befa4b83a660cc] FossilOrigin-Name: 40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/update.c | 7 ++----- test/gencol1.test | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7dd006225a..c837271d2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sfew\ssimple\sTCL\stest\scases\sfor\sgenerated\scolumns.\s\s(Full\stest\scoverage\nof\sthe\sgenerated\scolumn\slogic\sis\sprovided\sseparately\sby\sTH3.) -D 2019-10-31T17:13:17.010 +C Correctly\sgenerate\spre-UPDATE\scontent\sfor\svirtual\scolumns\sthat\sare\sused\nby\sforeign\skey\sconstraints.\s\sTicket\s[b9befa4b83a660cc] +D 2019-10-31T20:54:20.920 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -593,7 +593,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c 1de448df044dd9f011010b62966fb9b1bdde6e0a21173c686c9b2064227f6119 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c ae657f0db6a255011759ab9345ded7b54b828329a9dba04f94b4d4fa6e70e1ad +F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 6dd63ec525059f2235e494148bfa8c1ab506eb46e403a8d5bf13004f3b165631 +F test/gencol1.test 159b28fa98f256ba7ea272dce8449b9a8218ce58591ce25da5df5cc4b61a147a F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,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 329820673a12ff6a6c8759f40989d4ccf272441064b0366a5f491695b55ad0e9 -R e7170d3b73879549c652c7bfb423787f +P acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b +R 1be119fb445ff01fe8cfe5427a3a8828 U drh -Z b826a93b8f760fe88872664a0ccdde39 +Z 669096ece6f155f81405fdaa75b25c9a diff --git a/manifest.uuid b/manifest.uuid index e59896f02e..50038f8e4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b \ No newline at end of file +40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 816a6818be..935e1d9377 100644 --- a/src/update.c +++ b/src/update.c @@ -661,12 +661,9 @@ void sqlite3Update( oldmask |= sqlite3TriggerColmask(pParse, pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError ); - for(i=0, k=regOld; inCol; i++, k++){ + for(i=0; inCol; i++){ u32 colFlags = pTab->aCol[i].colFlags; - if( colFlags & COLFLAG_VIRTUAL ){ - k--; - continue; - } + k = sqlite3TableColumnToStorage(pTab, i) + regOld; if( oldmask==0xffffffff || (i<32 && (oldmask & MASKBIT32(i))!=0) || (colFlags & COLFLAG_PRIMKEY)!=0 diff --git a/test/gencol1.test b/test/gencol1.test index 63e397b218..653513929b 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -145,4 +145,18 @@ foreach {tn schema} { } {30 null ntalo | 40 text balaya | 150 integer {} | 1010 real {} |} } +# 2019-10-31 ticket b9befa4b83a660cc +db close +sqlite3 db :memory: +do_execsql_test gencol1-3.100 { + PRAGMA foreign_keys = true; + CREATE TABLE t0(c0 PRIMARY KEY, c1, c2 AS (c0+c1-c3) REFERENCES t0, c3); + INSERT INTO t0 VALUES (0, 0, 0), (11, 5, 5); + UPDATE t0 SET c1 = c0, c3 = c0; + SELECT *, '|' FROM t0 ORDER BY +c0; +} {0 0 0 0 | 11 11 11 11 |} +do_catchsql_test gencol1-3.110 { + UPDATE t0 SET c1 = c0, c3 = c0+1; +} {1 {FOREIGN KEY constraint failed}} + finish_test