]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure foreign key related processing takes place when rows are deleted from the...
authordan <dan@noemail.net>
Thu, 24 Sep 2009 11:31:21 +0000 (11:31 +0000)
committerdan <dan@noemail.net>
Thu, 24 Sep 2009 11:31:21 +0000 (11:31 +0000)
FossilOrigin-Name: 3f40c142c8526c1572020bd4d945c03a72019135

manifest
manifest.uuid
src/insert.c
test/fkey2.test

index c905bafc68dac56c1a24dc7db60e5ed5508a5703..4b8239dff7e974f096a649cde6481556863b5432 100644 (file)
--- a/manifest
+++ b/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
index 6c6becd5287ac14271540ea63c09964b24137f60..5bad894f08dbc65cec04570f5b0c3320d206cdfd 100644 (file)
@@ -1 +1 @@
-ce554a393401fc2fb9b5be049ddd383070102934
\ No newline at end of file
+3f40c142c8526c1572020bd4d945c03a72019135
\ No newline at end of file
index 1c2ce5c091618cccc84ba78e527d30283f01f710..cb35d16c4f9f5dc750885edd221f5a6e9ae01a71 100644 (file)
@@ -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;
       }
index 97333dcd625f3faaa11e12d81abf8a1b330734f3..2715b2226a5f9e2989888d9bc01fe0ea32049a0d 100644 (file)
@@ -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