From 598d2028e2aa2e3d5f0fc21a4e6c118faedee8ed Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2009 17:42:28 +0000 Subject: [PATCH] Add test cases to test file "e_fkey.test". FossilOrigin-Name: 23e0f61a4f24315bf31f632f43b60ec232f348fb --- manifest | 12 +-- manifest.uuid | 2 +- test/e_fkey.test | 247 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 254 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 274330f67b..73c15fadc4 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index f87d5f9217..21a5d06bab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -273ccbf18af5191807678a0a0c09cda82408b29c \ No newline at end of file +23e0f61a4f24315bf31f632f43b60ec232f348fb \ No newline at end of file diff --git a/test/e_fkey.test b/test/e_fkey.test index 8606b7a1d8..21ca85b49a 100644 --- a/test/e_fkey.test +++ b/test/e_fkey.test @@ -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 } +} {} #-------------------------------------------------------------------------