-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
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
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
{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 }
+} {}
#-------------------------------------------------------------------------