setup { CREATE TABLE parent (id int4range NOT NULL, valid_at int4range NOT NULL); CREATE TABLE child (id int4range NOT NULL, valid_at int4range NOT NULL); INSERT INTO parent VALUES ('[1,2)', '[0,10)'); } teardown { DROP TABLE child, parent; } session s1 step exclusion { ALTER TABLE parent ADD CONSTRAINT parent_key EXCLUDE USING gist (id WITH =, valid_at WITH &&); ALTER TABLE child ADD CONSTRAINT child_fk FOREIGN KEY (id, PERIOD valid_at) REFERENCES parent (id, PERIOD valid_at); } step temporal_pk { ALTER TABLE parent ADD CONSTRAINT parent_key PRIMARY KEY (id, valid_at WITHOUT OVERLAPS); ALTER TABLE child ADD CONSTRAINT child_fk FOREIGN KEY (id, PERIOD valid_at) REFERENCES parent (id, PERIOD valid_at); } step s1begin { BEGIN ISOLATION LEVEL READ COMMITTED; } step s1insert { INSERT INTO child VALUES ('[1,2)', '[0,10)'); } step s1commit { COMMIT; } step result { SELECT * FROM parent; SELECT c.*, coalesce(c.valid_at <@ (SELECT range_agg(p.valid_at) FROM parent p WHERE p.id = c.id), false) AS covered FROM child c; } step validate { ALTER TABLE child DROP CONSTRAINT child_fk; ALTER TABLE child ADD CONSTRAINT child_fk FOREIGN KEY (id, PERIOD valid_at) REFERENCES parent (id, PERIOD valid_at); } session s2 step s2begin { BEGIN ISOLATION LEVEL READ COMMITTED; } step s2shrink { UPDATE parent SET valid_at = '[0,5)' WHERE id = '[1,2)'; } step s2commit { COMMIT; } # this permutation shows a wrong result, as noticeable by the result and # validate step outputs permutation exclusion s1begin s2begin s1insert s2shrink s1commit s2commit result validate # when a PK is also present everything works. permutation temporal_pk s1begin s2begin s1insert s2shrink s1commit s2commit result validate