mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
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:
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.
|
C Ensure\sforeign\skey\srelated\sprocessing\stakes\splace\swhen\srows\sare\sdeleted\sfrom\sthe\sdatabase\sby\sREPLACE\sconflict\shandling.
|
||||||
D 2009-09-24T10:42:10
|
D 2009-09-24T11:31:22
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
|
F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@ -122,7 +122,7 @@ F src/global.c 271952d199a8cc59d4ce840b3bbbfd2f30c8ba32
|
|||||||
F src/hash.c ebcaa921ffd9d86f7ea5ae16a0a29d1c871130a7
|
F src/hash.c ebcaa921ffd9d86f7ea5ae16a0a29d1c871130a7
|
||||||
F src/hash.h 35b216c13343d0b4f87d9f21969ac55ad72174e1
|
F src/hash.h 35b216c13343d0b4f87d9f21969ac55ad72174e1
|
||||||
F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb
|
F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb
|
||||||
F src/insert.c 6043444766653e6388dbd11ba370aacbc3c39ded
|
F src/insert.c 1691e77263d075861bcb4f52f6a0e3d076e125ea
|
||||||
F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
|
F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
|
||||||
F src/legacy.c 303b4ffcf1ae652fcf5ef635846c563c254564f6
|
F src/legacy.c 303b4ffcf1ae652fcf5ef635846c563c254564f6
|
||||||
F src/lempar.c 0c4d1ab0a5ef2b0381eb81a732c54f68f27a574d
|
F src/lempar.c 0c4d1ab0a5ef2b0381eb81a732c54f68f27a574d
|
||||||
@ -330,7 +330,7 @@ F test/expr.test 9f521ae22f00e074959f72ce2e55d46b9ed23f68
|
|||||||
F test/filectrl.test 8923a6dc7630f31c8a9dd3d3d740aa0922df7bf8
|
F test/filectrl.test 8923a6dc7630f31c8a9dd3d3d740aa0922df7bf8
|
||||||
F test/filefmt.test 84e3d0fe9f12d0d2ac852465c6f8450aea0d6f43
|
F test/filefmt.test 84e3d0fe9f12d0d2ac852465c6f8450aea0d6f43
|
||||||
F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
|
F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
|
||||||
F test/fkey2.test d1d78b106da32c00e40b7a4228f591cc880147ac
|
F test/fkey2.test 30dedac189b10da51c0cbdee84e334ed3119b8f0
|
||||||
F test/fkey3.test 2183cac9075f3aae4875106eb9255bb73618444e
|
F test/fkey3.test 2183cac9075f3aae4875106eb9255bb73618444e
|
||||||
F test/fkey_malloc.test da912d000bb6ceb1cd11b655de1989762fa71ceb
|
F test/fkey_malloc.test da912d000bb6ceb1cd11b655de1989762fa71ceb
|
||||||
F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
|
F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
|
||||||
@ -755,7 +755,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 0443f7c9112ca91aa45c78a3d6287e5fcf5c3b73
|
P ce554a393401fc2fb9b5be049ddd383070102934
|
||||||
R e07c9a9cb837e7f36918e6bb0deed30f
|
R a2849bd3f51ae39c38bb8fabcd7e0cb7
|
||||||
U dan
|
U dan
|
||||||
Z beebdfe4b57e96fc594592f7d6108da4
|
Z 4a5ca8d718e5f8c0b333eb52343550a9
|
||||||
|
@ -1 +1 @@
|
|||||||
ce554a393401fc2fb9b5be049ddd383070102934
|
3f40c142c8526c1572020bd4d945c03a72019135
|
@ -1271,14 +1271,14 @@ void sqlite3GenerateConstraintChecks(
|
|||||||
if( pParse->db->flags&SQLITE_RecTriggers ){
|
if( pParse->db->flags&SQLITE_RecTriggers ){
|
||||||
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
|
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
|
||||||
}
|
}
|
||||||
if( pTrigger ){
|
sqlite3MultiWrite(pParse);
|
||||||
|
if( pTrigger || sqlite3FkRequired(pParse, pTab, 0) ){
|
||||||
sqlite3GenerateRowDelete(
|
sqlite3GenerateRowDelete(
|
||||||
pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace
|
pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace
|
||||||
);
|
);
|
||||||
}else{
|
}else{
|
||||||
sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0);
|
sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0);
|
||||||
}
|
}
|
||||||
sqlite3MultiWrite(pParse);
|
|
||||||
seenReplace = 1;
|
seenReplace = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1380,13 +1380,13 @@ void sqlite3GenerateConstraintChecks(
|
|||||||
default: {
|
default: {
|
||||||
Trigger *pTrigger = 0;
|
Trigger *pTrigger = 0;
|
||||||
assert( onError==OE_Replace );
|
assert( onError==OE_Replace );
|
||||||
|
sqlite3MultiWrite(pParse);
|
||||||
if( pParse->db->flags&SQLITE_RecTriggers ){
|
if( pParse->db->flags&SQLITE_RecTriggers ){
|
||||||
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
|
pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
|
||||||
}
|
}
|
||||||
sqlite3GenerateRowDelete(
|
sqlite3GenerateRowDelete(
|
||||||
pParse, pTab, baseCur, regR, 0, pTrigger, OE_Replace
|
pParse, pTab, baseCur, regR, 0, pTrigger, OE_Replace
|
||||||
);
|
);
|
||||||
sqlite3MultiWrite(pParse);
|
|
||||||
seenReplace = 1;
|
seenReplace = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,9 @@ ifcapable {!foreignkey||!trigger} {
|
|||||||
#
|
#
|
||||||
# fkey2-12.*: Test RESTRICT actions.
|
# 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
|
# fkey2-genfkey.*: Tests that were used with the shell tool .genfkey
|
||||||
# command. Recycled to test the built-in implementation.
|
# 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
|
# The following block of tests, those prefixed with "fkey2-genfkey.", are
|
||||||
|
Reference in New Issue
Block a user