]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add test cases to test file "e_fkey.test".
authordan <dan@noemail.net>
Thu, 8 Oct 2009 17:42:28 +0000 (17:42 +0000)
committerdan <dan@noemail.net>
Thu, 8 Oct 2009 17:42:28 +0000 (17:42 +0000)
FossilOrigin-Name: 23e0f61a4f24315bf31f632f43b60ec232f348fb

manifest
manifest.uuid
test/e_fkey.test

index 274330f67b347bd35df7c9e2270e7b2efd47d550..73c15fadc4513080d33e9506c84eed83245bb9e7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\sin\sthe\slegacy\sgenfkey\scode\sto\sdo\swith\scolumn\snames\sthat\srequire\squoting.
-D 2009-10-08T13:42:28
+C Add\stest\scases\sto\stest\sfile\s"e_fkey.test".
+D 2009-10-08T17:42:29
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -319,7 +319,7 @@ F test/descidx2.test 1310ed1326cdfed4ea2c55169631579f082d174f
 F test/descidx3.test 3394ad4d089335cac743c36a14129d6d931c316f
 F test/diskfull.test 0cede7ef9d8f415d9d3944005c76be7589bb5ebb
 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376
-F test/e_fkey.test 1fc787e91aeb3adf09f186473d9091f66035fd22
+F test/e_fkey.test 87a5d48261adbd7500dee176b62cffdef3410ac0
 F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
 F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398
 F test/enc3.test 5c550d59ff31dccdba5d1a02ae11c7047d77c041
@@ -756,7 +756,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 533703d78ab4330b2dc8e08aaba89b4667e46331
-R ab684cf0fa4376c5eb1747e06c0968a4
+P 273ccbf18af5191807678a0a0c09cda82408b29c
+R 762331726a5577e23ac7c6aad53d3fa9
 U dan
-Z 3e243fab4d4da81ce8aeeb768378731e
+Z 4c265bdcf3668f8a9c927f36e1a29a4b
index f87d5f921751f2b1001e9105c250c62817844fea..21a5d06bab337880681b1c5458e32f3120bc954a 100644 (file)
@@ -1 +1 @@
-273ccbf18af5191807678a0a0c09cda82408b29c
\ No newline at end of file
+23e0f61a4f24315bf31f632f43b60ec232f348fb
\ No newline at end of file
index 8606b7a1d8d670e044852ad67a0be83d35d2344c..21ca85b49ab3dd84321753fc52edd9c86135e14e 100644 (file)
@@ -126,6 +126,253 @@ do_test e_fkey-7.4 {
   {CREATE TABLE c3(e, 'f col 2', FOREIGN KEY('f col 2') REFERENCES "p" ON UPDATE CASCADE)} \
 ]
 
+#-------------------------------------------------------------------------
+# /* EV: R-14208-23986 */
+# /* EV: R-11078-03945 */
+#
+# Check that a DROP TABLE does an implicit DELETE FROM. Which does not
+# cause any triggers to fire, but does fire foreign key actions.
+#
+do_test e_fkey-8.1 {
+  drop_all_tables
+  execsql {
+    CREATE TABLE p(a, b, PRIMARY KEY(a, b));
+
+    CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE SET NULL);
+    CREATE TABLE c2(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE SET DEFAULT);
+    CREATE TABLE c3(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE CASCADE);
+    CREATE TABLE c4(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE RESTRICT);
+    CREATE TABLE c5(c, d, FOREIGN KEY(c, d) REFERENCES p ON DELETE NO ACTION);
+
+    CREATE TABLE c6(c, d, 
+      FOREIGN KEY(c, d) REFERENCES p ON DELETE RESTRICT 
+      DEFERRABLE INITIALLY DEFERRED
+    );
+    CREATE TABLE c7(c, d, 
+      FOREIGN KEY(c, d) REFERENCES p ON DELETE NO ACTION
+      DEFERRABLE INITIALLY DEFERRED
+    );
+
+    CREATE TABLE log(msg);
+    CREATE TRIGGER tt AFTER DELETE ON p BEGIN
+      INSERT INTO log VALUES('delete ' || old.rowid);
+    END;
+  }
+} {}
+
+do_test e_fkey-8.2 {
+  execsql {
+    INSERT INTO p VALUES('a', 'b');
+    INSERT INTO c1 VALUES('a', 'b');
+    INSERT INTO c2 VALUES('a', 'b');
+    INSERT INTO c3 VALUES('a', 'b');
+    BEGIN;
+      DROP TABLE p;
+      SELECT * FROM c1;
+  }
+} {{} {}}
+do_test e_fkey-8.3 {
+  execsql { SELECT * FROM c2 }
+} {{} {}}
+do_test e_fkey-8.4 {
+  execsql { SELECT * FROM c3 }
+} {}
+do_test e_fkey-8.5 {
+  execsql { SELECT * FROM log }
+} {}
+do_test e_fkey-8.6 {
+  execsql ROLLBACK
+} {}
+do_test e_fkey-8.7 {
+  execsql {
+    BEGIN;
+      DELETE FROM p;
+      SELECT * FROM log;
+    ROLLBACK;
+  }
+} {{delete 1}}
+
+#-------------------------------------------------------------------------
+# /* EV: R-32768-47925 */
+#
+# If an IMMEDIATE foreign key fails as a result of a DROP TABLE, the
+# DROP TABLE command fails.
+#
+do_test e_fkey-9.1 {
+  execsql { 
+    DELETE FROM c1;
+    DELETE FROM c2;
+    DELETE FROM c3;
+  }
+  execsql { INSERT INTO c5 VALUES('a', 'b') }
+  catchsql { DROP TABLE p }
+} {1 {foreign key constraint failed}}
+do_test e_fkey-9.2 {
+  execsql { SELECT * FROM p }
+} {a b}
+do_test e_fkey-9.3 {
+  catchsql {
+    BEGIN;
+      DROP TABLE p;
+  }
+} {1 {foreign key constraint failed}}
+do_test e_fkey-9.4 {
+  execsql {
+    SELECT * FROM p;
+    SELECT * FROM c5;
+    ROLLBACK;
+  }
+} {a b a b}
+
+#-------------------------------------------------------------------------
+# /* EV: R-05903-08460 */
+#
+# If a DEFERRED foreign key fails as a result of a DROP TABLE, attempting
+# to commit the transaction fails unless the violation is fixed.
+#
+do_test e_fkey-10.1 {
+  execsql { 
+    DELETE FROM c1 ; DELETE FROM c2 ; DELETE FROM c3 ;
+    DELETE FROM c4 ; DELETE FROM c5 ; DELETE FROM c6 ;
+    DELETE FROM c7 
+  }
+} {}
+do_test e_fkey-10.2 {
+  execsql { INSERT INTO c7 VALUES('a', 'b') }
+  execsql {
+    BEGIN;
+      DROP TABLE p;
+  }
+} {}
+do_test e_fkey-10.3 {
+  catchsql COMMIT
+} {1 {foreign key constraint failed}}
+do_test e_fkey-10.4 {
+  execsql { CREATE TABLE p(a, b, PRIMARY KEY(a, b)) }
+  catchsql COMMIT
+} {1 {foreign key constraint failed}}
+do_test e_fkey-10.5 {
+  execsql { INSERT INTO p VALUES('a', 'b') }
+  execsql COMMIT
+} {}
+
+#-------------------------------------------------------------------------
+# /* EV: R-57242-37005 */
+#
+# Any "foreign key mismatch" errors encountered while running an implicit
+# "DELETE FROM tbl" are ignored.
+#
+drop_all_tables
+do_test e_fkey-11.1 {
+  execsql {
+    PRAGMA foreign_keys = OFF;
+
+    CREATE TABLE p(a PRIMARY KEY, b REFERENCES nosuchtable);
+    CREATE TABLE c1(c, d, FOREIGN KEY(c, d) REFERENCES a);
+    CREATE TABLE c2(c REFERENCES p(b), d);
+    CREATE TABLE c3(c REFERENCES p ON DELETE SET NULL, d);
+
+    INSERT INTO p VALUES(1, 2);
+    INSERT INTO c1 VALUES(1, 2);
+    INSERT INTO c2 VALUES(1, 2);
+    INSERT INTO c3 VALUES(1, 2);
+  }
+} {}
+do_test e_fkey-11.2 {
+  execsql { PRAGMA foreign_keys = ON }
+  catchsql { DELETE FROM p }
+} {1 {no such table: main.nosuchtable}}
+do_test e_fkey-11.3 {
+  execsql {
+    BEGIN;
+      DROP TABLE p;
+      SELECT * FROM c3;
+    ROLLBACK;
+  }
+} {{} 2}
+do_test e_fkey-11.4 {
+  execsql { CREATE TABLE nosuchtable(x PRIMARY KEY) }
+  catchsql { DELETE FROM p }
+} {1 {foreign key mismatch}}
+do_test e_fkey-11.5 {
+  execsql { DROP TABLE c1 }
+  catchsql { DELETE FROM p }
+} {1 {foreign key mismatch}}
+do_test e_fkey-11.6 {
+  execsql { DROP TABLE c2 }
+  execsql { DELETE FROM p }
+} {}
+
+#-------------------------------------------------------------------------
+# /* EV: R-54142-41346 */
+#
+# Test that the special behaviours of ALTER and DROP TABLE are only
+# activated when foreign keys are enabled. Special behaviours are:
+#
+#   1. ADD COLUMN not allowing a REFERENCES clause with a non-NULL 
+#      default value.
+#   2. Modifying foreign key definitions when a parent table is RENAMEd.
+#   3. Running an implicit DELETE FROM command as part of DROP TABLE.
+#
+do_test e_fkey-12.1.1 {
+  drop_all_tables
+  execsql { CREATE TABLE t1(a, b) }
+  catchsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 }
+} {1 {Cannot add a REFERENCES column with non-NULL default value}}
+do_test e_fkey-12.1.2 {
+  execsql { PRAGMA foreign_keys = OFF }
+  execsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 }
+  execsql { SELECT sql FROM sqlite_master WHERE name = 't1' }
+} {{CREATE TABLE t1(a, b, c DEFAULT 'xxx' REFERENCES t2)}}
+do_test e_fkey-12.1.3 {
+  execsql { PRAGMA foreign_keys = ON }
+} {}
+
+do_test e_fkey-12.2.1 {
+  drop_all_tables
+  execsql {
+    CREATE TABLE p(a UNIQUE);
+    CREATE TABLE c(b REFERENCES p(a));
+    BEGIN;
+      ALTER TABLE p RENAME TO parent;
+      SELECT sql FROM sqlite_master WHERE name = 'c';
+    ROLLBACK;
+  }
+} {{CREATE TABLE c(b REFERENCES "parent"(a))}}
+do_test e_fkey-12.2.2 {
+  execsql {
+    PRAGMA foreign_keys = OFF;
+    ALTER TABLE p RENAME TO parent;
+    SELECT sql FROM sqlite_master WHERE name = 'c';
+  }
+} {{CREATE TABLE c(b REFERENCES p(a))}}
+do_test e_fkey-12.2.3 {
+  execsql { PRAGMA foreign_keys = ON }
+} {}
+
+do_test e_fkey-12.3.1 {
+  drop_all_tables
+  execsql {
+    CREATE TABLE p(a UNIQUE);
+    CREATE TABLE c(b REFERENCES p(a) ON DELETE SET NULL);
+    INSERT INTO p VALUES('x');
+    INSERT INTO c VALUES('x');
+    BEGIN;
+      DROP TABLE p;
+      SELECT * FROM c;
+    ROLLBACK;
+  }
+} {{}}
+do_test e_fkey-12.3.2 {
+  execsql {
+    PRAGMA foreign_keys = OFF;
+    DROP TABLE p;
+    SELECT * FROM c;
+  }
+} {x}
+do_test e_fkey-12.3.3 {
+  execsql { PRAGMA foreign_keys = ON }
+} {}
 
 
 #-------------------------------------------------------------------------