@@ -1704,6 +1704,37 @@ UPDATE temporal_rng
17041704 SET valid_at = CASE WHEN lower(valid_at) = '2018-01-01' THEN daterange('2018-01-01', '2018-01-05')
17051705 WHEN lower(valid_at) = '2018-02-01' THEN daterange('2018-01-05', '2018-03-01') END
17061706 WHERE id = '[6,7)';
1707+ -- a PK update shrinking the referenced range but still valid:
1708+ -- There are two references: one fulfilled by the first pk row,
1709+ -- the other fulfilled by both pk rows combined.
1710+ INSERT INTO temporal_rng (id, valid_at) VALUES
1711+ ('[1,2)', daterange('2018-01-01', '2018-03-01')),
1712+ ('[1,2)', daterange('2018-03-01', '2018-06-01'));
1713+ INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
1714+ ('[1,2)', daterange('2018-01-15', '2018-02-01'), '[1,2)'),
1715+ ('[2,3)', daterange('2018-01-15', '2018-05-01'), '[1,2)');
1716+ UPDATE temporal_rng SET valid_at = daterange('2018-01-15', '2018-03-01')
1717+ WHERE id = '[1,2)' AND valid_at @> '2018-01-15'::date;
1718+ -- a PK update growing the referenced range is fine:
1719+ UPDATE temporal_rng SET valid_at = daterange('2018-01-01', '2018-03-01')
1720+ WHERE id = '[1,2)' AND valid_at @> '2018-01-25'::date;
1721+ -- a PK update shrinking the referenced range and changing the id invalidates the whole range (error):
1722+ UPDATE temporal_rng SET id = '[2,3)', valid_at = daterange('2018-01-15', '2018-03-01')
1723+ WHERE id = '[1,2)' AND valid_at @> '2018-01-15'::date;
1724+ ERROR: update or delete on table "temporal_rng" violates foreign key constraint "temporal_fk_rng2rng_fk" on table "temporal_fk_rng2rng"
1725+ DETAIL: Key (id, valid_at)=([1,2), [2018-01-01,2018-03-01)) is still referenced from table "temporal_fk_rng2rng".
1726+ -- a PK update changing only the id invalidates the whole range (error):
1727+ UPDATE temporal_rng SET id = '[2,3)'
1728+ WHERE id = '[1,2)' AND valid_at @> '2018-01-15'::date;
1729+ ERROR: update or delete on table "temporal_rng" violates foreign key constraint "temporal_fk_rng2rng_fk" on table "temporal_fk_rng2rng"
1730+ DETAIL: Key (id, valid_at)=([1,2), [2018-01-01,2018-03-01)) is still referenced from table "temporal_fk_rng2rng".
1731+ -- a PK update that loses time from both ends, but is still valid:
1732+ INSERT INTO temporal_rng (id, valid_at) VALUES
1733+ ('[2,3)', daterange('2018-01-01', '2018-03-01'));
1734+ INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
1735+ ('[5,6)', daterange('2018-01-15', '2018-02-01'), '[2,3)');
1736+ UPDATE temporal_rng SET valid_at = daterange('2018-01-15', '2018-02-15')
1737+ WHERE id = '[2,3)';
17071738-- a PK update that fails because both are referenced:
17081739UPDATE temporal_rng SET valid_at = daterange('2016-01-01', '2016-02-01')
17091740 WHERE id = '[5,6)' AND valid_at = daterange('2018-01-01', '2018-02-01');
@@ -2196,6 +2227,37 @@ UPDATE temporal_mltrng
21962227 SET valid_at = CASE WHEN lower(valid_at) = '2018-01-01' THEN datemultirange(daterange('2018-01-01', '2018-01-05'))
21972228 WHEN lower(valid_at) = '2018-02-01' THEN datemultirange(daterange('2018-01-05', '2018-03-01')) END
21982229 WHERE id = '[6,7)';
2230+ -- a PK update shrinking the referenced multirange but still valid:
2231+ -- There are two references: one fulfilled by the first pk row,
2232+ -- the other fulfilled by both pk rows combined.
2233+ INSERT INTO temporal_mltrng (id, valid_at) VALUES
2234+ ('[1,2)', datemultirange(daterange('2018-01-01', '2018-03-01'))),
2235+ ('[1,2)', datemultirange(daterange('2018-03-01', '2018-06-01')));
2236+ INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES
2237+ ('[1,2)', datemultirange(daterange('2018-01-15', '2018-02-01')), '[1,2)'),
2238+ ('[2,3)', datemultirange(daterange('2018-01-15', '2018-05-01')), '[1,2)');
2239+ UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2018-01-15', '2018-03-01'))
2240+ WHERE id = '[1,2)' AND valid_at @> '2018-01-15'::date;
2241+ -- a PK update growing the referenced multirange is fine:
2242+ UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2018-01-01', '2018-03-01'))
2243+ WHERE id = '[1,2)' AND valid_at @> '2018-01-25'::date;
2244+ -- a PK update shrinking the referenced multirange and changing the id invalidates the whole multirange (error):
2245+ UPDATE temporal_mltrng SET id = '[2,3)', valid_at = datemultirange(daterange('2018-01-15', '2018-03-01'))
2246+ WHERE id = '[1,2)' AND valid_at @> '2018-01-15'::date;
2247+ ERROR: update or delete on table "temporal_mltrng" violates foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
2248+ DETAIL: Key (id, valid_at)=([1,2), {[2018-01-01,2018-03-01)}) is still referenced from table "temporal_fk_mltrng2mltrng".
2249+ -- a PK update changing only the id invalidates the whole multirange (error):
2250+ UPDATE temporal_mltrng SET id = '[2,3)'
2251+ WHERE id = '[1,2)' AND valid_at @> '2018-01-15'::date;
2252+ ERROR: update or delete on table "temporal_mltrng" violates foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
2253+ DETAIL: Key (id, valid_at)=([1,2), {[2018-01-01,2018-03-01)}) is still referenced from table "temporal_fk_mltrng2mltrng".
2254+ -- a PK update that loses time from both ends, but is still valid:
2255+ INSERT INTO temporal_mltrng (id, valid_at) VALUES
2256+ ('[2,3)', datemultirange(daterange('2018-01-01', '2018-03-01')));
2257+ INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES
2258+ ('[5,6)', datemultirange(daterange('2018-01-15', '2018-02-01')), '[2,3)');
2259+ UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2018-01-15', '2018-02-15'))
2260+ WHERE id = '[2,3)';
21992261-- a PK update that fails because both are referenced:
22002262UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016-01-01', '2016-02-01'))
22012263 WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018-01-01', '2018-02-01'));
0 commit comments