From: dan Date: Fri, 10 Jun 2011 18:33:35 +0000 (+0000) Subject: When updating a field that requires foreign key constraints be checked, ensure that... X-Git-Tag: version-3.7.7~64 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7006c18e0043a2787b763e7fa7f3a0df964fe5cf;p=thirdparty%2Fsqlite.git When updating a field that requires foreign key constraints be checked, ensure that the indexes and tables are consistent when the FK logic is run. Otherwise, it may detect the inconsistency and report database corruption. FossilOrigin-Name: 2b3d9996a829c62fbaf7c92d50e44636340b07c6 --- diff --git a/manifest b/manifest index 79636217b0..01e7bf60e7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\sproblems\swith\sforeign\skey\sconstraints\swhere\sthe\sparent\stable\sis\sthe\ssame\sas\sthe\schild\stable. -D 2011-06-10T16:33:25.121 +C When\supdating\sa\sfield\sthat\srequires\sforeign\skey\sconstraints\sbe\schecked,\sensure\sthat\sthe\sindexes\sand\stables\sare\sconsistent\swhen\sthe\sFK\slogic\sis\srun.\sOtherwise,\sit\smay\sdetect\sthe\sinconsistency\sand\sreport\sdatabase\scorruption. +D 2011-06-10T18:33:35.602 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -232,7 +232,7 @@ F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c c819d9f72168a035d545a5bdafe9b085b20df705 F src/trigger.c c836a6caac16ba96611558922106858f6ca3d6bf -F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f +F src/update.c 80d77311d91ebc06b27149e75701f1b3e9356622 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e @@ -398,7 +398,7 @@ F test/filectrl.test 97003734290887566e01dded09dc9e99cb937e9e F test/filefmt.test f178cfc29501a14565954c961b226e61877dd32c F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da F test/fkey2.test 080969fe219b3b082b0e097ac18c6af2e5b0631f -F test/fkey3.test 0c4d36b6d5b88f2c233cf8a512d3e2eaedc06fd6 +F test/fkey3.test 5ec899d12b13bcf1e9ef40eff7fb692fdb91392e F test/fkey4.test c6c8f9f9be885f95c85c7bceb26f243ad906fd49 F test/fkey_malloc.test a5ede29bd2f6e56dea78c3d43fb86dd696c068c8 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb @@ -942,7 +942,7 @@ F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/symbols.sh bc2a3709940d47c8ac8e0a1fdf17ec801f015a00 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings.sh 347d974d143cf132f953b565fbc03026f19fcb4d -P b11b2e1f8ccadf78bebe2278f05a8e3d3e543328 -R 82679520a5c6b1fbd50bacf672964c79 +P 442d8d8bfe443797482354ba8766d97d3d6acaae +R dc98bce2b79b015d80463a3aa5591d5c U dan -Z 3e44af2707cf5eb06c1e283bd2e9d2ca +Z 8380c49075a7949acdc7a8820572b0c9 diff --git a/manifest.uuid b/manifest.uuid index 3b5ddc572a..c85de3778b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -442d8d8bfe443797482354ba8766d97d3d6acaae \ No newline at end of file +2b3d9996a829c62fbaf7c92d50e44636340b07c6 \ No newline at end of file diff --git a/src/update.c b/src/update.c index aecf75cf35..d445f01f4e 100644 --- a/src/update.c +++ b/src/update.c @@ -244,7 +244,7 @@ void sqlite3Update( } for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; - if( chngRowid ){ + if( hasFK || chngRowid ){ reg = ++pParse->nMem; }else{ reg = 0; diff --git a/test/fkey3.test b/test/fkey3.test index 2df3be530e..6a11f8883e 100644 --- a/test/fkey3.test +++ b/test/fkey3.test @@ -154,4 +154,33 @@ do_catchsql_test 3.5.5 { INSERT INTO t7 VALUES('x', 450, 'x', 451); } {1 {foreign key constraint failed}} + +do_execsql_test 3.6.1 { + CREATE TABLE t8(a, b, c, d, e, FOREIGN KEY(c, d) REFERENCES t8(a, b)); + CREATE UNIQUE INDEX t8i1 ON t8(a, b); + CREATE UNIQUE INDEX t8i2 ON t8(c); + INSERT INTO t8 VALUES(1, 1, 1, 1, 1); +} +do_catchsql_test 3.6.2 { + UPDATE t8 SET d = 2; +} {1 {foreign key constraint failed}} +do_execsql_test 3.6.3 { UPDATE t8 SET d = 1; } +do_execsql_test 3.6.4 { UPDATE t8 SET e = 2; } + +do_catchsql_test 3.6.5 { + CREATE TABLE TestTable ( + id INTEGER PRIMARY KEY, + name text, + source_id integer not null, + parent_id integer, + + foreign key(source_id, parent_id) references TestTable(source_id, id) + ); + CREATE UNIQUE INDEX testindex on TestTable(source_id, id); + PRAGMA foreign_keys=1; + INSERT INTO TestTable VALUES (1, 'parent', 1, null); + INSERT INTO TestTable VALUES (2, 'child', 1, 1); + UPDATE TestTable SET parent_id=1000 where id=2; +} {1 {foreign key constraint failed}} + finish_test