]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Disable the RESTRICT foreign key action if "PRAGMA defer_foreign_keys" is set. disable-restrict
authordan <dan@noemail.net>
Thu, 21 Jan 2016 17:25:56 +0000 (17:25 +0000)
committerdan <dan@noemail.net>
Thu, 21 Jan 2016 17:25:56 +0000 (17:25 +0000)
FossilOrigin-Name: 82470d1c3a41221c78bcdd402b2219c4c21c43af

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

index 5649e9098855569e6b336b85faf0a13c25bb740b..66d0b52411589991156d2a344b310dcf95f41884 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\sthe\sLIKE-operator\sbug\sfix\sfrom\strunk.
-D 2016-01-20T16:02:48.763
+C Disable\sthe\sRESTRICT\sforeign\skey\saction\sif\s"PRAGMA\sdefer_foreign_keys"\sis\sset.
+D 2016-01-21T17:25:56.966
 F Makefile.in a47ec69daac0cdfe3413e50ceea6dc8da3dc4ecb
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc b4d0270955b3f102214b2242f2a1b802c22ee21b
@@ -320,7 +320,7 @@ F src/dbstat.c ffd63fc8ba7541476ced189b95e95d7f2bc63f78
 F src/delete.c 86e3940d07fe69a40270c2aaf6ca6c7adf19246c
 F src/expr.c df0d7c3230d59abd679da22ff5ce4cfd0e3a0e63
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
-F src/fkey.c e18b3dff7d47c7bcac5ac4fc178a89b9fd322b44
+F src/fkey.c 3fd2e17526d8586fdeafa376672c9303b7e35e7f
 F src/func.c ba6c03f9e440f5693086c08ee88e6e60212b3504
 F src/global.c bd5a0af3f30b0c01be6db756c626cd3c33a3d260
 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
@@ -656,7 +656,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 6697550baa38505c9952eff130ab26a2d156c0cc
+F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0
 F test/fkey7.test 72e915890ee4a005daaf3002cb208e8fe973ac13
 F test/fkey8.test 8f08203458321e6c19a263829de4cfc936274ab0
 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749
@@ -1440,7 +1440,10 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 327af5f644a49b2f41d5456958f9d61a2b704e1c e8adeb64d4e463772feb58dbd6f00715b92e735c
-R ed9d6c66302fd811ae6a8e53c4d95620
-U drh
-Z 8662dc0834e686268b7ae44f172fcd73
+P 36cb3d6e274a06a78693ca506feaad0b14bde11d
+R f0ee48a1a8d6b1b8328a4821e1589857
+T *branch * disable-restrict
+T *sym-disable-restrict *
+T -sym-sessions *
+U dan
+Z 284a240298ca9699332d11236aa182a9
index df02854c570fe3da20e9e8d4116a643c583d4283..f82434f679e548fd8813a101bc7efac70a391dab 100644 (file)
@@ -1 +1 @@
-36cb3d6e274a06a78693ca506feaad0b14bde11d
\ No newline at end of file
+82470d1c3a41221c78bcdd402b2219c4c21c43af
\ No newline at end of file
index 2abd06c693b7614977c4bc8c221b0a889ed80b69..8ad6cfbe785f10f4257bf4d096d522b27f62fa67 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 ){
     u8 enableLookaside;           /* Copy of db->lookaside.bEnabled */
index 7c24704e0340bec2471216f0b1358f3a6359a036..b658f20fea19665ef32cf00ea13ab1c9fa4edbdc 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