]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Disable the RESTRICT foreign key action if "PRAGMA defer_foreign_keys" is set.
authordan <dan@noemail.net>
Thu, 25 Feb 2016 20:17:55 +0000 (20:17 +0000)
committerdan <dan@noemail.net>
Thu, 25 Feb 2016 20:17:55 +0000 (20:17 +0000)
FossilOrigin-Name: 9ffff484bb4b67c29dda6180d7d766ad13988fe1

manifest
manifest.uuid
src/fkey.c
test/fkey6.test

index cd7f610e12d6a17a84704ded1937d5d93e3b1c48..c7fe7c9c81ed914ee0c2b7db2794c89ab7eaf3e7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Query\splanner\simprovements:\s\sTake\sthe\sLIMIT\sinto\saccount\swhen\sestimated\sthe\ncost\sof\san\sORDER\sBY.\s\sAvoid\sautomatic\sindexes\son\squery\sloops\sthat\sare\sexpected\nto\srun\sless\sthan\stwice.
-D 2016-02-25T18:40:18.408
+C Disable\sthe\sRESTRICT\sforeign\skey\saction\sif\s"PRAGMA\sdefer_foreign_keys"\sis\sset.
+D 2016-02-25T20:17:55.205
 F Makefile.in 4e90dc1521879022aa9479268a4cd141d1771142
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 28fc4ee02333996d31b3602b39eeb8e609a89ce4
@@ -304,7 +304,7 @@ F src/dbstat.c c845548d4346e606e2f2b7d2e714ace2b8a7dd1b
 F src/delete.c 48802aa3ee6339f576d074336d3ae1b5f40e240f
 F src/expr.c 9adb58153f6e943b703d43e9a1f67f77b5a75721
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
-F src/fkey.c 08edad1fce30f761f14b3997e89bad58f9f7f4e0
+F src/fkey.c a842533c411b9aef63a2814bbdc24f8a21e14cd8
 F src/func.c 552d300265aed09eea21f68ac742a440550c0062
 F src/global.c ded7b97efd16efda5062b65e857198e46c40e652
 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
@@ -640,7 +640,7 @@ F test/fkey2.test f3d27ecba480a348c328965d154214719bb158a9
 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49
 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d
 F test/fkey5.test 5a373303f201ac03c22ba1ef17a733d3f56e611a
-F test/fkey6.test abb59f866c1b44926fd02d1fdd217d831fe04f48
+F test/fkey6.test ce3c39cd4f910184f5fd4a48db6783c59956224f
 F test/fkey7.test 72e915890ee4a005daaf3002cb208e8fe973ac13
 F test/fkey8.test 7bd1dd0174a0e29a90c62c517b9e2a410a0b345d
 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749
@@ -1429,8 +1429,8 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh a98af506df552f3b3c0d904f94e4cdc4e1a6d598
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 2e67a1c823c7003e7d2619c7d8b6db6ce046c527 aab53a21894ba51d325fd8f8f4bb4163ece74391
-R 8a8e5a80c02a4dfa694df7d4a40dc042
-T +closed aab53a21894ba51d325fd8f8f4bb4163ece74391
-U drh
-Z a9e5cc9fdd4504d0ecf5a0daa8c57736
+P bf46179d4484376909dce40ffcc06fecb19b3544
+Q +8fea1166016c659ece83e0045bc348f478a9ba6a
+R c44565069d5be6a8f7796f6b44b6c97f
+U dan
+Z 38dd13c1fd26f5b1e4d5f260c4aeb7b1
index 6a068ab962b08b3e59d4fc0de45b29a4447e7705..5cb14812a5b7752e41ccc482a50a551c0929bc94 100644 (file)
@@ -1 +1 @@
-bf46179d4484376909dce40ffcc06fecb19b3544
\ No newline at end of file
+9ffff484bb4b67c29dda6180d7d766ad13988fe1
\ No newline at end of file
index 38fd4f756b79f3b4ca6709385b7ea2c9320ff7fc..97eba1ddd7273bbf95cb30c546b0d13a34690526 100644 (file)
@@ -1163,6 +1163,9 @@ static Trigger *fkActionTrigger(
 
   action = pFKey->aAction[iAction];
   pTrigger = pFKey->apTrigger[iAction];
+  if( (db->flags & SQLITE_DeferFKs) && action==OE_Restrict ){
+    return 0;
+  }
 
   if( action!=OE_None && !pTrigger ){
     char const *zFrom;            /* Name of child table */
index 6fc3de211c8e9b0a76403b616146d884ff97a4cc..45ad1ef2ccb5c79978a9b81db536cef1fd3e21d3 100644 (file)
@@ -23,6 +23,7 @@
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+set testprefix fkey6
 
 ifcapable {!foreignkey} {
   finish_test
@@ -171,5 +172,58 @@ do_execsql_test fkey6-2.6 {
   PRAGMA defer_foreign_keys;
 } {0}
 
+#--------------------------------------------------------------------------
+# Test that defer_foreign_keys disables RESTRICT.
+#
+do_execsql_test 3.1 {
+  CREATE TABLE p2(a PRIMARY KEY, b);
+  CREATE TABLE c2(x, y REFERENCES p2 ON DELETE RESTRICT ON UPDATE RESTRICT);
+  INSERT INTO p2 VALUES(1, 'one');
+  INSERT INTO p2 VALUES(2, 'two');
+  INSERT INTO c2 VALUES('i', 1);
+}
+
+do_catchsql_test 3.2.1 {
+  BEGIN;
+    UPDATE p2 SET a=a-1;
+} {1 {FOREIGN KEY constraint failed}}
+do_execsql_test 3.2.2 { COMMIT }
+
+do_execsql_test 3.2.3 {
+  BEGIN;
+    PRAGMA defer_foreign_keys = 1;
+    UPDATE p2 SET a=a-1;
+  COMMIT;
+}
+
+do_execsql_test 3.2.4 {
+  BEGIN;
+    PRAGMA defer_foreign_keys = 1;
+    UPDATE p2 SET a=a-1;
+}
+do_catchsql_test 3.2.5 {
+  COMMIT;
+} {1 {FOREIGN KEY constraint failed}}
+do_execsql_test 3.2.6 { ROLLBACK }
+
+do_execsql_test 3.3.1 {
+  CREATE TRIGGER p2t AFTER DELETE ON p2 BEGIN
+    INSERT INTO p2 VALUES(old.a, 'deleted!');
+  END;
+}
+do_catchsql_test 3.3.2 {
+  BEGIN;
+    DELETE FROM p2 WHERE a=1;
+} {1 {FOREIGN KEY constraint failed}}
+do_execsql_test 3.3.3 { COMMIT }
+
+do_execsql_test 3.3.4 {
+  BEGIN;
+    PRAGMA defer_foreign_keys = 1;
+    DELETE FROM p2 WHERE a=1;
+  COMMIT;
+  SELECT * FROM p2;
+} {0 one 1 deleted!}
+
 
 finish_test