-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
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
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
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
-ce554a393401fc2fb9b5be049ddd383070102934
\ No newline at end of file
+3f40c142c8526c1572020bd4d945c03a72019135
\ No newline at end of file
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;
}
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;
}
#
# 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.
#
}
} {}
-
+#-------------------------------------------------------------------------
+# 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