]> granicus.if.org Git - postgresql/commitdiff
The deferred trigger queue pushing to disk patch pointed out
authorBruce Momjian <bruce@momjian.us>
Sun, 27 Jul 2003 03:13:17 +0000 (03:13 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 27 Jul 2003 03:13:17 +0000 (03:13 +0000)
that the regression tests for foreign keys didn't seem to test
a deferred constraint that was not satisified by a later
statement and was not made immediate by set constraints,
so here's a simple added test with a single invalid insert and
a commit.

Stephan Szabo

src/test/regress/expected/foreign_key.out
src/test/regress/sql/foreign_key.sql

index cb6fc35eb6d134ad59f3490f3fb67b13e397ce96..cde52f46e00abf04e31a53900f2ddb0cb0fa8952 100644 (file)
@@ -1053,3 +1053,22 @@ INSERT INTO pktable VALUES (2000, 3); -- too late
 ERROR:  current transaction is aborted, queries ignored until end of transaction block
 COMMIT;
 DROP TABLE fktable, pktable;
+-- deferrable, initially deferred
+CREATE TABLE pktable (
+       id              INT4 PRIMARY KEY,
+       other   INT4
+);
+NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pktable_pkey" for table "pktable"
+CREATE TABLE fktable (
+       id              INT4 PRIMARY KEY,
+       fk              INT4 REFERENCES pktable DEFERRABLE INITIALLY DEFERRED
+);
+NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "fktable_pkey" for table "fktable"
+NOTICE:  CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s)
+BEGIN;
+-- no error here
+INSERT INTO fktable VALUES (100, 200);
+-- error here on commit
+COMMIT;
+ERROR:  insert or update on "fktable" violates foreign key constraint "$1"
+DETAIL:  Key (fk)=(200) is not present in "pktable".
index f314b5f1993f6197656dd8de93f7f6107af96a86..609be4d98e701d92da7925eecd320f7993396ee5 100644 (file)
@@ -674,3 +674,23 @@ INSERT INTO pktable VALUES (2000, 3); -- too late
 COMMIT;
 
 DROP TABLE fktable, pktable;
+
+-- deferrable, initially deferred
+CREATE TABLE pktable (
+       id              INT4 PRIMARY KEY,
+       other   INT4
+);
+
+CREATE TABLE fktable (
+       id              INT4 PRIMARY KEY,
+       fk              INT4 REFERENCES pktable DEFERRABLE INITIALLY DEFERRED
+);
+
+BEGIN;
+
+-- no error here
+INSERT INTO fktable VALUES (100, 200);
+
+-- error here on commit
+COMMIT;
+