Ensure foreign key related processing takes place when rows are deleted from the database by REPLACE conflict handling.
FossilOrigin-Name: 3f40c142c8526c1572020bd4d945c03a72019135
This commit is contained in:
parent
4bb3b679b0
commit
1bea559a94
14
manifest
14
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
|
||||
|
@ -1 +1 @@
|
||||
ce554a393401fc2fb9b5be049ddd383070102934
|
||||
3f40c142c8526c1572020bd4d945c03a72019135
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user