aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordan <dan@noemail.net>2009-09-24 11:31:21 +0000
committerdan <dan@noemail.net>2009-09-24 11:31:21 +0000
commit1bea559a94cc8fc8b4cc2bed95afc2cbbce50b64 (patch)
treeb2ec462cc7e1db4d5cb398246709ea88ffc957b6
parent4bb3b679b0deddbc9554e4274f841dcbf781744d (diff)
downloadsqlite-1bea559a94cc8fc8b4cc2bed95afc2cbbce50b64.tar.gz
sqlite-1bea559a94cc8fc8b4cc2bed95afc2cbbce50b64.zip
Ensure foreign key related processing takes place when rows are deleted from the database by REPLACE conflict handling.
FossilOrigin-Name: 3f40c142c8526c1572020bd4d945c03a72019135
-rw-r--r--manifest14
-rw-r--r--manifest.uuid2
-rw-r--r--src/insert.c6
-rw-r--r--test/fkey2.test56
4 files changed, 66 insertions, 12 deletions
diff --git a/manifest b/manifest
index c905bafc6..4b8239dff 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Use\ssqlite3FkOldmask()\sin\sdelete.c\sinstead\sof\sassuming\sthat\sforeign\skey\sconstraints\salways\srequire\sall\scolumns\sof\sthe\sdeleted\srow\sto\sbe\sstored\sin\sregisters.
-D 2009-09-24T10:42:10
+C Ensure\sforeign\skey\srelated\sprocessing\stakes\splace\swhen\srows\sare\sdeleted\sfrom\sthe\sdatabase\sby\sREPLACE\sconflict\shandling.
+D 2009-09-24T11:31:22
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -122,7 +122,7 @@ F src/global.c 271952d199a8cc59d4ce840b3bbbfd2f30c8ba32
F src/hash.c ebcaa921ffd9d86f7ea5ae16a0a29d1c871130a7
F src/hash.h 35b216c13343d0b4f87d9f21969ac55ad72174e1
F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb
-F src/insert.c 6043444766653e6388dbd11ba370aacbc3c39ded
+F src/insert.c 1691e77263d075861bcb4f52f6a0e3d076e125ea
F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
F src/legacy.c 303b4ffcf1ae652fcf5ef635846c563c254564f6
F src/lempar.c 0c4d1ab0a5ef2b0381eb81a732c54f68f27a574d
@@ -330,7 +330,7 @@ F test/expr.test 9f521ae22f00e074959f72ce2e55d46b9ed23f68
F test/filectrl.test 8923a6dc7630f31c8a9dd3d3d740aa0922df7bf8
F test/filefmt.test 84e3d0fe9f12d0d2ac852465c6f8450aea0d6f43
F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
-F test/fkey2.test d1d78b106da32c00e40b7a4228f591cc880147ac
+F test/fkey2.test 30dedac189b10da51c0cbdee84e334ed3119b8f0
F test/fkey3.test 2183cac9075f3aae4875106eb9255bb73618444e
F test/fkey_malloc.test da912d000bb6ceb1cd11b655de1989762fa71ceb
F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
@@ -755,7 +755,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 0443f7c9112ca91aa45c78a3d6287e5fcf5c3b73
-R e07c9a9cb837e7f36918e6bb0deed30f
+P ce554a393401fc2fb9b5be049ddd383070102934
+R a2849bd3f51ae39c38bb8fabcd7e0cb7
U dan
-Z beebdfe4b57e96fc594592f7d6108da4
+Z 4a5ca8d718e5f8c0b333eb52343550a9
diff --git a/manifest.uuid b/manifest.uuid
index 6c6becd52..5bad894f0 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-ce554a393401fc2fb9b5be049ddd383070102934 \ No newline at end of file
+3f40c142c8526c1572020bd4d945c03a72019135 \ No newline at end of file
diff --git a/src/insert.c b/src/insert.c
index 1c2ce5c09..cb35d16c4 100644
--- a/src/insert.c
+++ b/src/insert.c
@@ -1271,14 +1271,14 @@ void sqlite3GenerateConstraintChecks(
if( pParse->db->flags&SQLITE_RecTriggers ){
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
}
- if( pTrigger ){
+ sqlite3MultiWrite(pParse);
+ if( pTrigger || sqlite3FkRequired(pParse, pTab, 0) ){
sqlite3GenerateRowDelete(
pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace
);
}else{
sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0);
}
- sqlite3MultiWrite(pParse);
seenReplace = 1;
break;
}
@@ -1380,13 +1380,13 @@ void sqlite3GenerateConstraintChecks(
default: {
Trigger *pTrigger = 0;
assert( onError==OE_Replace );
+ sqlite3MultiWrite(pParse);
if( pParse->db->flags&SQLITE_RecTriggers ){
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
}
sqlite3GenerateRowDelete(
pParse, pTab, baseCur, regR, 0, pTrigger, OE_Replace
);
- sqlite3MultiWrite(pParse);
seenReplace = 1;
break;
}
diff --git a/test/fkey2.test b/test/fkey2.test
index 97333dcd6..2715b2226 100644
--- a/test/fkey2.test
+++ b/test/fkey2.test
@@ -55,6 +55,9 @@ ifcapable {!foreignkey||!trigger} {
#
# fkey2-12.*: Test RESTRICT actions.
#
+# fkey2-13.*: Test that FK processing is performed when a row is REPLACED by
+# an UPDATE or INSERT statement.
+#
# fkey2-genfkey.*: Tests that were used with the shell tool .genfkey
# command. Recycled to test the built-in implementation.
#
@@ -636,7 +639,58 @@ do_test fkey2-12.1.7 {
}
} {}
-
+#-------------------------------------------------------------------------
+# The following tests, fkey2-13.*, test that FK processing is performed
+# when rows are REPLACEd.
+#
+drop_all_tables
+do_test fkey2-13.1.1 {
+ execsql {
+ CREATE TABLE pp(a UNIQUE, b, c, PRIMARY KEY(b, c));
+ CREATE TABLE cc(d, e, f UNIQUE, FOREIGN KEY(d, e) REFERENCES pp);
+ INSERT INTO pp VALUES(1, 2, 3);
+ INSERT INTO cc VALUES(2, 3, 1);
+ }
+} {}
+foreach {tn stmt} {
+ 1 "REPLACE INTO pp VALUES(1, 4, 5)"
+ 2 "REPLACE INTO pp(rowid, a, b, c) VALUES(1, 2, 3, 4)"
+} {
+ do_test fkey2-13.1.$tn.1 {
+ catchsql $stmt
+ } {1 {foreign key constraint failed}}
+ do_test fkey2-13.1.$tn.2 {
+ execsql {
+ SELECT * FROM pp;
+ SELECT * FROM cc;
+ }
+ } {1 2 3 2 3 1}
+ do_test fkey2-13.1.$tn.3 {
+ execsql BEGIN;
+ catchsql $stmt
+ } {1 {foreign key constraint failed}}
+ do_test fkey2-13.1.$tn.4 {
+ execsql {
+ COMMIT;
+ SELECT * FROM pp;
+ SELECT * FROM cc;
+ }
+ } {1 2 3 2 3 1}
+}
+do_test fkey2-13.1.3 {
+ execsql {
+ REPLACE INTO pp(rowid, a, b, c) VALUES(1, 2, 2, 3);
+ SELECT rowid, * FROM pp;
+ SELECT * FROM cc;
+ }
+} {1 2 2 3 2 3 1}
+do_test fkey2-13.1.4 {
+ execsql {
+ REPLACE INTO pp(rowid, a, b, c) VALUES(2, 2, 2, 3);
+ SELECT rowid, * FROM pp;
+ SELECT * FROM cc;
+ }
+} {2 2 2 3 2 3 1}
#-------------------------------------------------------------------------
# The following block of tests, those prefixed with "fkey2-genfkey.", are