hi I am confused by (pk,fk) on delete on update (restriction and no action) result based on v13. related post: https://stackoverflow.com/questions/14921668/difference-between-restrict-and-no-action Please check the following test and comments.
---common setup for test0, test1,test2,test3 BEGIN; DROP TABLE IF EXISTS temporal_rng, temporal_fk_rng2rng; CREATE TABLE temporal_rng ( id int4range,valid_at tsrange); ALTER TABLE temporal_rng ADD CONSTRAINT temporal_rng_pk PRIMARY KEY (id, valid_at WITHOUT OVERLAPS); CREATE TABLE temporal_fk_rng2rng ( id int4range, valid_at tsrange, parent_id int4range ); commit; ----------------no_action_vs_restriction test0 BEGIN; ALTER TABLE temporal_fk_rng2rng DROP CONSTRAINT IF EXISTS temporal_fk_rng2rng_fk; ALTER TABLE temporal_fk_rng2rng ADD CONSTRAINT temporal_fk_rng2rng_fk FOREIGN KEY (parent_id, PERIOD valid_at) REFERENCES temporal_rng ON DELETE NO ACTION ON UPDATE NO ACTION; INSERT INTO temporal_rng VALUES ('[5,5]', tsrange('2018-01-01', '2018-02-01')), ('[5,5]', tsrange('2018-02-01', '2018-03-01')); INSERT INTO temporal_fk_rng2rng VALUES ('[3,3]', tsrange('2018-01-05', '2018-01-10'), '[5,5]'); /* expect below to fail. since to be deleted range is being referenced (in temporal_fk_rng2rng) but the v13 patch won't fail. */ delete from temporal_rng FOR PORTION OF valid_at FROM '2018-01-06' TO '2018-01-11' WHERE id = '[5,5]' AND valid_at @> '2018-01-05'::timestamp; TABLE temporal_rng \; table temporal_fk_rng2rng; ROLLBACK; ----------------no_action_vs_restriction test1 BEGIN; ALTER TABLE temporal_fk_rng2rng DROP CONSTRAINT IF EXISTS temporal_fk_rng2rng_fk; ALTER TABLE temporal_fk_rng2rng ADD CONSTRAINT temporal_fk_rng2rng_fk FOREIGN KEY (parent_id, PERIOD valid_at) REFERENCES temporal_rng ON DELETE RESTRICT ON UPDATE RESTRICT; INSERT INTO temporal_rng VALUES ('[5,5]', tsrange('2018-01-01', '2018-02-01')), ('[5,5]', tsrange('2018-02-01', '2018-03-01')); INSERT INTO temporal_fk_rng2rng VALUES ('[3,3]', tsrange('2018-01-05', '2018-01-10'), '[5,5]'); /* expect the below command not to fail. since to be deleted range is not being referenced in temporal_fk_rng2rng) but the v13 patch will fail. */ delete from temporal_rng FOR PORTION OF valid_at FROM '2018-01-12' TO '2018-01-20' WHERE id = '[5,5]' AND valid_at @> '2018-01-05'::timestamp; ROLLBACK; ----------------no_action_vs_restriction test2 BEGIN; ALTER TABLE temporal_fk_rng2rng DROP CONSTRAINT IF EXISTS temporal_fk_rng2rng_fk; ALTER TABLE temporal_fk_rng2rng ADD CONSTRAINT temporal_fk_rng2rng_fk FOREIGN KEY (parent_id, PERIOD valid_at) REFERENCES temporal_rng ON DELETE no action ON UPDATE no action; INSERT INTO temporal_rng VALUES ('[5,5]', tsrange('2018-01-01', '2018-02-01')), ('[5,5]', tsrange('2018-02-01', '2018-03-01')); INSERT INTO temporal_fk_rng2rng VALUES ('[3,3]', tsrange('2018-01-05', '2018-01-10'), '[5,5]'); /* expect below command fail. since to be deleted range is being referenced (in temporal_fk_rng2rng) */ UPDATE temporal_rng FOR PORTION OF valid_at FROM '2018-01-06' TO '2018-01-08' SET id = '[7,7]' WHERE id = '[5,5]' AND valid_at @> '2018-01-05'::timestamp; TABLE temporal_rng \; table temporal_fk_rng2rng; ROLLBACK; ----------------no_action_vs_restriction test3 BEGIN; ALTER TABLE temporal_fk_rng2rng DROP CONSTRAINT IF EXISTS temporal_fk_rng2rng_fk; ALTER TABLE temporal_fk_rng2rng ADD CONSTRAINT temporal_fk_rng2rng_fk FOREIGN KEY (parent_id, PERIOD valid_at) REFERENCES temporal_rng ON DELETE RESTRICT ON UPDATE RESTRICT; INSERT INTO temporal_rng VALUES ('[5,5]', tsrange('2018-01-01', '2018-02-01')), ('[5,5]', tsrange('2018-02-01', '2018-03-01')); INSERT INTO temporal_fk_rng2rng VALUES ('[3,3]', tsrange('2018-01-05', '2018-01-10'), '[5,5]'); /* expect the below command not to fail. since to be deleted range is not being referenced in temporal_fk_rng2rng) but the v13 patch will fail. */ UPDATE temporal_rng FOR PORTION OF valid_at FROM '2018-01-12' TO '2018-01-20' SET id = '[7,7]' WHERE id = '[5,5]' AND valid_at @> '2018-01-05'::timestamp; ROLLBACK;