index fcadcd8d6e51baf9b26946ca187c218ae657c170..e38472079ccee3798e1020ebc340a2dbee83f696 100644 (file)
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
ON UPDATE RESTRICT;
--- a PK update that succeeds because the numeric id isn't referenced:
-INSERT INTO temporal_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年01月01日', '2018年02月01日'));
-UPDATE temporal_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日') WHERE id = '[5,6)';
--- a PK update that succeeds even though the numeric id is referenced because the range isn't:
-DELETE FROM temporal_rng WHERE id = '[5,6)';
-INSERT INTO temporal_rng (id, valid_at) VALUES
- ('[5,6)', daterange('2018年01月01日', '2018年02月01日')),
- ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
- ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-UPDATE temporal_rng SET valid_at = daterange('2016年02月01日', '2016年03月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- A PK update sliding the edge between two referenced rows:
-INSERT INTO temporal_rng (id, valid_at) VALUES
- ('[6,7)', daterange('2018年01月01日', '2018年02月01日')),
- ('[6,7)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
- ('[4,5)', daterange('2018年01月15日', '2018年02月15日'), '[6,7)');
-UPDATE temporal_rng
- SET valid_at = CASE WHEN lower(valid_at) = '2018年01月01日' THEN daterange('2018年01月01日', '2018年01月05日')
- WHEN lower(valid_at) = '2018年02月01日' THEN daterange('2018年01月05日', '2018年03月01日') END
- WHERE id = '[6,7)';
-ERROR: update or delete on table "temporal_rng" violates RESTRICT setting of foreign key constraint "temporal_fk_rng2rng_fk" on table "temporal_fk_rng2rng"
-DETAIL: Key (id, valid_at)=([6,7), [2018年01月01日,2018年02月01日)) is referenced from table "temporal_fk_rng2rng".
--- a PK update that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_rng2rng
- ALTER CONSTRAINT temporal_fk_rng2rng_fk
- DEFERRABLE INITIALLY DEFERRED;
- UPDATE temporal_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ERROR: update or delete on table "temporal_rng" violates RESTRICT setting of foreign key constraint "temporal_fk_rng2rng_fk" on table "temporal_fk_rng2rng"
-DETAIL: Key (id, valid_at)=([5,6), [2018年01月01日,2018年02月01日)) is referenced from table "temporal_fk_rng2rng".
-ROLLBACK;
--- changing the scalar part fails:
-UPDATE temporal_rng SET id = '[7,8)'
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ERROR: update or delete on table "temporal_rng" violates RESTRICT setting of foreign key constraint "temporal_fk_rng2rng_fk" on table "temporal_fk_rng2rng"
-DETAIL: Key (id, valid_at)=([5,6), [2018年01月01日,2018年02月01日)) is referenced from table "temporal_fk_rng2rng".
--- then delete the objecting FK record and the same PK update succeeds:
-DELETE FROM temporal_fk_rng2rng WHERE id = '[3,4)';
-UPDATE temporal_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
+ERROR: unsupported ON UPDATE action for foreign key constraint using PERIOD
--
-- test FK referenced deletes NO ACTION
--
TRUNCATE temporal_rng, temporal_fk_rng2rng;
-ALTER TABLE temporal_fk_rng2rng
- DROP CONSTRAINT temporal_fk_rng2rng_fk;
ALTER TABLE temporal_fk_rng2rng
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
ON DELETE RESTRICT;
-INSERT INTO temporal_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年01月01日', '2018年02月01日'));
-DELETE FROM temporal_rng WHERE id = '[5,6)';
--- a PK delete that succeeds even though the numeric id is referenced because the range isn't:
-INSERT INTO temporal_rng (id, valid_at) VALUES
- ('[5,6)', daterange('2018年01月01日', '2018年02月01日')),
- ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
- ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- a PK delete that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_rng2rng
- ALTER CONSTRAINT temporal_fk_rng2rng_fk
- DEFERRABLE INITIALLY DEFERRED;
- DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ERROR: update or delete on table "temporal_rng" violates RESTRICT setting of foreign key constraint "temporal_fk_rng2rng_fk" on table "temporal_fk_rng2rng"
-DETAIL: Key (id, valid_at)=([5,6), [2018年01月01日,2018年02月01日)) is referenced from table "temporal_fk_rng2rng".
-ROLLBACK;
--- then delete the objecting FK record and the same PK delete succeeds:
-DELETE FROM temporal_fk_rng2rng WHERE id = '[3,4)';
-DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
+ERROR: unsupported ON DELETE action for foreign key constraint using PERIOD
--
-- test ON UPDATE/DELETE options
--
@@ -1888,7 +1824,6 @@ DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日
INSERT INTO temporal_rng (id, valid_at) VALUES ('[6,7)', daterange('2018年01月01日', '2021年01月01日'));
INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES ('[4,5)', daterange('2018年01月01日', '2021年01月01日'), '[6,7)');
ALTER TABLE temporal_fk_rng2rng
- DROP CONSTRAINT temporal_fk_rng2rng_fk,
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
@@ -1898,7 +1833,6 @@ ERROR: unsupported ON UPDATE action for foreign key constraint using PERIOD
INSERT INTO temporal_rng (id, valid_at) VALUES ('[9,10)', daterange('2018年01月01日', '2021年01月01日'));
INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES ('[6,7)', daterange('2018年01月01日', '2021年01月01日'), '[9,10)');
ALTER TABLE temporal_fk_rng2rng
- DROP CONSTRAINT temporal_fk_rng2rng_fk,
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
@@ -1910,7 +1844,6 @@ INSERT INTO temporal_rng (id, valid_at) VALUES ('[12,13)', daterange('2018年01月01日
INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES ('[8,9)', daterange('2018年01月01日', '2021年01月01日'), '[12,13)');
ALTER TABLE temporal_fk_rng2rng
ALTER COLUMN parent_id SET DEFAULT '[-1,-1]',
- DROP CONSTRAINT temporal_fk_rng2rng_fk,
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_mltrng (id, PERIOD valid_at)
ON UPDATE RESTRICT;
--- a PK update that succeeds because the numeric id isn't referenced:
-INSERT INTO temporal_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日')));
-UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016年01月01日', '2016年02月01日')) WHERE id = '[5,6)';
--- a PK update that succeeds even though the numeric id is referenced because the range isn't:
-DELETE FROM temporal_mltrng WHERE id = '[5,6)';
-INSERT INTO temporal_mltrng (id, valid_at) VALUES
- ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日'))),
- ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES
- ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016年02月01日', '2016年03月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- A PK update sliding the edge between two referenced rows:
-INSERT INTO temporal_mltrng (id, valid_at) VALUES
- ('[6,7)', datemultirange(daterange('2018年01月01日', '2018年02月01日'))),
- ('[6,7)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES
- ('[4,5)', datemultirange(daterange('2018年01月15日', '2018年02月15日')), '[6,7)');
-UPDATE temporal_mltrng
- SET valid_at = CASE WHEN lower(valid_at) = '2018年01月01日' THEN datemultirange(daterange('2018年01月01日', '2018年01月05日'))
- WHEN lower(valid_at) = '2018年02月01日' THEN datemultirange(daterange('2018年01月05日', '2018年03月01日')) END
- WHERE id = '[6,7)';
-ERROR: update or delete on table "temporal_mltrng" violates RESTRICT setting of foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
-DETAIL: Key (id, valid_at)=([6,7), {[2018年01月01日,2018年02月01日)}) is referenced from table "temporal_fk_mltrng2mltrng".
--- a PK update that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_mltrng2mltrng
- ALTER CONSTRAINT temporal_fk_mltrng2mltrng_fk
- DEFERRABLE INITIALLY DEFERRED;
- UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016年01月01日', '2016年02月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ERROR: update or delete on table "temporal_mltrng" violates RESTRICT setting of foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
-DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is referenced from table "temporal_fk_mltrng2mltrng".
-ROLLBACK;
--- changing the scalar part fails:
-UPDATE temporal_mltrng SET id = '[7,8)'
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ERROR: update or delete on table "temporal_mltrng" violates RESTRICT setting of foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
-DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is referenced from table "temporal_fk_mltrng2mltrng".
+ERROR: unsupported ON UPDATE action for foreign key constraint using PERIOD
--
-- test FK referenced deletes NO ACTION
--
TRUNCATE temporal_mltrng, temporal_fk_mltrng2mltrng;
-ALTER TABLE temporal_fk_mltrng2mltrng
- DROP CONSTRAINT temporal_fk_mltrng2mltrng_fk;
ALTER TABLE temporal_fk_mltrng2mltrng
ADD CONSTRAINT temporal_fk_mltrng2mltrng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
ERROR: update or delete on table "temporal_mltrng" violates foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is still referenced from table "temporal_fk_mltrng2mltrng".
--
--- test FK referenced deletes RESTRICT
---
-TRUNCATE temporal_mltrng, temporal_fk_mltrng2mltrng;
-ALTER TABLE temporal_fk_mltrng2mltrng
- DROP CONSTRAINT temporal_fk_mltrng2mltrng_fk;
-ALTER TABLE temporal_fk_mltrng2mltrng
- ADD CONSTRAINT temporal_fk_mltrng2mltrng_fk
- FOREIGN KEY (parent_id, PERIOD valid_at)
- REFERENCES temporal_mltrng (id, PERIOD valid_at)
- ON DELETE RESTRICT;
-INSERT INTO temporal_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日')));
-DELETE FROM temporal_mltrng WHERE id = '[5,6)';
--- a PK delete that succeeds even though the numeric id is referenced because the range isn't:
-INSERT INTO temporal_mltrng (id, valid_at) VALUES
- ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日'))),
- ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-DELETE FROM temporal_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- a PK delete that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_mltrng2mltrng
- ALTER CONSTRAINT temporal_fk_mltrng2mltrng_fk
- DEFERRABLE INITIALLY DEFERRED;
- DELETE FROM temporal_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ERROR: update or delete on table "temporal_mltrng" violates RESTRICT setting of foreign key constraint "temporal_fk_mltrng2mltrng_fk" on table "temporal_fk_mltrng2mltrng"
-DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is referenced from table "temporal_fk_mltrng2mltrng".
-ROLLBACK;
---
-- FK between partitioned tables: ranges
--
CREATE TABLE temporal_partitioned_rng (
@@ -2469,40 +2334,6 @@ DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange
ERROR: update or delete on table "tp1" violates foreign key constraint "temporal_partitioned_fk_rng2rng_parent_id_valid_at_fkey" on table "temporal_partitioned_fk_rng2rng"
DETAIL: Key (id, valid_at)=([5,6), [2018年01月01日,2018年02月01日)) is still referenced from table "temporal_partitioned_fk_rng2rng".
--
--- partitioned FK referenced updates RESTRICT
---
-TRUNCATE temporal_partitioned_rng, temporal_partitioned_fk_rng2rng;
-ALTER TABLE temporal_partitioned_fk_rng2rng
- DROP CONSTRAINT temporal_partitioned_fk_rng2rng_fk;
-ALTER TABLE temporal_partitioned_fk_rng2rng
- ADD CONSTRAINT temporal_partitioned_fk_rng2rng_fk
- FOREIGN KEY (parent_id, PERIOD valid_at)
- REFERENCES temporal_partitioned_rng
- ON DELETE RESTRICT;
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2016年01月01日', '2016年02月01日'));
-UPDATE temporal_partitioned_rng SET valid_at = daterange('2018年01月01日', '2018年02月01日') WHERE id = '[5,6)';
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_partitioned_fk_rng2rng (id, valid_at, parent_id) VALUES ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-UPDATE temporal_partitioned_rng SET valid_at = daterange('2016年02月01日', '2016年03月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- should fail:
-UPDATE temporal_partitioned_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ERROR: update or delete on table "tp1" violates foreign key constraint "temporal_partitioned_fk_rng2rng_parent_id_valid_at_fkey" on table "temporal_partitioned_fk_rng2rng"
-DETAIL: Key (id, valid_at)=([5,6), [2018年01月01日,2018年02月01日)) is still referenced from table "temporal_partitioned_fk_rng2rng".
---
--- partitioned FK referenced deletes RESTRICT
---
-TRUNCATE temporal_partitioned_rng, temporal_partitioned_fk_rng2rng;
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年01月01日', '2018年02月01日'));
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_partitioned_fk_rng2rng (id, valid_at, parent_id) VALUES ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- should fail:
-DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ERROR: update or delete on table "tp1" violates RESTRICT setting of foreign key constraint "temporal_partitioned_fk_rng2rng_parent_id_valid_at_fkey" on table "temporal_partitioned_fk_rng2rng"
-DETAIL: Key (id, valid_at)=([5,6), [2018年01月01日,2018年02月01日)) is referenced from table "temporal_partitioned_fk_rng2rng".
---
-- partitioned FK referenced updates CASCADE
--
ALTER TABLE temporal_partitioned_fk_rng2rng
@@ -2625,40 +2456,6 @@ DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemu
ERROR: update or delete on table "tp1" violates foreign key constraint "temporal_partitioned_fk_mltrng2mltrng_parent_id_valid_at_fkey1" on table "temporal_partitioned_fk_mltrng2mltrng"
DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is still referenced from table "temporal_partitioned_fk_mltrng2mltrng".
--
--- partitioned FK referenced updates RESTRICT
---
-TRUNCATE temporal_partitioned_mltrng, temporal_partitioned_fk_mltrng2mltrng;
-ALTER TABLE temporal_partitioned_fk_mltrng2mltrng
- DROP CONSTRAINT temporal_partitioned_fk_mltrng2mltrng_fk;
-ALTER TABLE temporal_partitioned_fk_mltrng2mltrng
- ADD CONSTRAINT temporal_partitioned_fk_mltrng2mltrng_fk
- FOREIGN KEY (parent_id, PERIOD valid_at)
- REFERENCES temporal_partitioned_mltrng
- ON DELETE RESTRICT;
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2016年01月01日', '2016年02月01日')));
-UPDATE temporal_partitioned_mltrng SET valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日')) WHERE id = '[5,6)';
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_partitioned_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-UPDATE temporal_partitioned_mltrng SET valid_at = datemultirange(daterange('2016年02月01日', '2016年03月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- should fail:
-UPDATE temporal_partitioned_mltrng SET valid_at = datemultirange(daterange('2016年01月01日', '2016年02月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ERROR: update or delete on table "tp1" violates foreign key constraint "temporal_partitioned_fk_mltrng2mltrng_parent_id_valid_at_fkey1" on table "temporal_partitioned_fk_mltrng2mltrng"
-DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is still referenced from table "temporal_partitioned_fk_mltrng2mltrng".
---
--- partitioned FK referenced deletes RESTRICT
---
-TRUNCATE temporal_partitioned_mltrng, temporal_partitioned_fk_mltrng2mltrng;
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日')));
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_partitioned_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- should fail:
-DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ERROR: update or delete on table "tp1" violates RESTRICT setting of foreign key constraint "temporal_partitioned_fk_mltrng2mltrng_parent_id_valid_at_fkey1" on table "temporal_partitioned_fk_mltrng2mltrng"
-DETAIL: Key (id, valid_at)=([5,6), {[2018年01月01日,2018年02月01日)}) is referenced from table "temporal_partitioned_fk_mltrng2mltrng".
---
-- partitioned FK referenced updates CASCADE
--
ALTER TABLE temporal_partitioned_fk_mltrng2mltrng
index f1d8bc2bcb104d1fe88fecfb5ff5f5d5afcc3ddf..4aaca242bbece491e0479e917ec4ae12dedf1b83 100644 (file)
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
ON UPDATE RESTRICT;
--- a PK update that succeeds because the numeric id isn't referenced:
-INSERT INTO temporal_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年01月01日', '2018年02月01日'));
-UPDATE temporal_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日') WHERE id = '[5,6)';
--- a PK update that succeeds even though the numeric id is referenced because the range isn't:
-DELETE FROM temporal_rng WHERE id = '[5,6)';
-INSERT INTO temporal_rng (id, valid_at) VALUES
- ('[5,6)', daterange('2018年01月01日', '2018年02月01日')),
- ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
- ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-UPDATE temporal_rng SET valid_at = daterange('2016年02月01日', '2016年03月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- A PK update sliding the edge between two referenced rows:
-INSERT INTO temporal_rng (id, valid_at) VALUES
- ('[6,7)', daterange('2018年01月01日', '2018年02月01日')),
- ('[6,7)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
- ('[4,5)', daterange('2018年01月15日', '2018年02月15日'), '[6,7)');
-UPDATE temporal_rng
- SET valid_at = CASE WHEN lower(valid_at) = '2018年01月01日' THEN daterange('2018年01月01日', '2018年01月05日')
- WHEN lower(valid_at) = '2018年02月01日' THEN daterange('2018年01月05日', '2018年03月01日') END
- WHERE id = '[6,7)';
--- a PK update that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_rng2rng
- ALTER CONSTRAINT temporal_fk_rng2rng_fk
- DEFERRABLE INITIALLY DEFERRED;
- UPDATE temporal_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ROLLBACK;
--- changing the scalar part fails:
-UPDATE temporal_rng SET id = '[7,8)'
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
--- then delete the objecting FK record and the same PK update succeeds:
-DELETE FROM temporal_fk_rng2rng WHERE id = '[3,4)';
-UPDATE temporal_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
--
-- test FK referenced deletes NO ACTION
--
TRUNCATE temporal_rng, temporal_fk_rng2rng;
-ALTER TABLE temporal_fk_rng2rng
- DROP CONSTRAINT temporal_fk_rng2rng_fk;
ALTER TABLE temporal_fk_rng2rng
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
ON DELETE RESTRICT;
-INSERT INTO temporal_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年01月01日', '2018年02月01日'));
-DELETE FROM temporal_rng WHERE id = '[5,6)';
--- a PK delete that succeeds even though the numeric id is referenced because the range isn't:
-INSERT INTO temporal_rng (id, valid_at) VALUES
- ('[5,6)', daterange('2018年01月01日', '2018年02月01日')),
- ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES
- ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- a PK delete that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_rng2rng
- ALTER CONSTRAINT temporal_fk_rng2rng_fk
- DEFERRABLE INITIALLY DEFERRED;
- DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-ROLLBACK;
--- then delete the objecting FK record and the same PK delete succeeds:
-DELETE FROM temporal_fk_rng2rng WHERE id = '[3,4)';
-DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
--
-- test ON UPDATE/DELETE options
@@ -1421,7 +1363,6 @@ DELETE FROM temporal_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日
INSERT INTO temporal_rng (id, valid_at) VALUES ('[6,7)', daterange('2018年01月01日', '2021年01月01日'));
INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES ('[4,5)', daterange('2018年01月01日', '2021年01月01日'), '[6,7)');
ALTER TABLE temporal_fk_rng2rng
- DROP CONSTRAINT temporal_fk_rng2rng_fk,
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
INSERT INTO temporal_rng (id, valid_at) VALUES ('[9,10)', daterange('2018年01月01日', '2021年01月01日'));
INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES ('[6,7)', daterange('2018年01月01日', '2021年01月01日'), '[9,10)');
ALTER TABLE temporal_fk_rng2rng
- DROP CONSTRAINT temporal_fk_rng2rng_fk,
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
@@ -1443,7 +1383,6 @@ INSERT INTO temporal_rng (id, valid_at) VALUES ('[12,13)', daterange('2018年01月01日
INSERT INTO temporal_fk_rng2rng (id, valid_at, parent_id) VALUES ('[8,9)', daterange('2018年01月01日', '2021年01月01日'), '[12,13)');
ALTER TABLE temporal_fk_rng2rng
ALTER COLUMN parent_id SET DEFAULT '[-1,-1]',
- DROP CONSTRAINT temporal_fk_rng2rng_fk,
ADD CONSTRAINT temporal_fk_rng2rng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_rng
FOREIGN KEY (parent_id, PERIOD valid_at)
REFERENCES temporal_mltrng (id, PERIOD valid_at)
ON UPDATE RESTRICT;
--- a PK update that succeeds because the numeric id isn't referenced:
-INSERT INTO temporal_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日')));
-UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016年01月01日', '2016年02月01日')) WHERE id = '[5,6)';
--- a PK update that succeeds even though the numeric id is referenced because the range isn't:
-DELETE FROM temporal_mltrng WHERE id = '[5,6)';
-INSERT INTO temporal_mltrng (id, valid_at) VALUES
- ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日'))),
- ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES
- ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016年02月01日', '2016年03月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- A PK update sliding the edge between two referenced rows:
-INSERT INTO temporal_mltrng (id, valid_at) VALUES
- ('[6,7)', datemultirange(daterange('2018年01月01日', '2018年02月01日'))),
- ('[6,7)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES
- ('[4,5)', datemultirange(daterange('2018年01月15日', '2018年02月15日')), '[6,7)');
-UPDATE temporal_mltrng
- SET valid_at = CASE WHEN lower(valid_at) = '2018年01月01日' THEN datemultirange(daterange('2018年01月01日', '2018年01月05日'))
- WHEN lower(valid_at) = '2018年02月01日' THEN datemultirange(daterange('2018年01月05日', '2018年03月01日')) END
- WHERE id = '[6,7)';
--- a PK update that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_mltrng2mltrng
- ALTER CONSTRAINT temporal_fk_mltrng2mltrng_fk
- DEFERRABLE INITIALLY DEFERRED;
-
- UPDATE temporal_mltrng SET valid_at = datemultirange(daterange('2016年01月01日', '2016年02月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ROLLBACK;
--- changing the scalar part fails:
-UPDATE temporal_mltrng SET id = '[7,8)'
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
--
-- test FK referenced deletes NO ACTION
--
TRUNCATE temporal_mltrng, temporal_fk_mltrng2mltrng;
-ALTER TABLE temporal_fk_mltrng2mltrng
- DROP CONSTRAINT temporal_fk_mltrng2mltrng_fk;
ALTER TABLE temporal_fk_mltrng2mltrng
ADD CONSTRAINT temporal_fk_mltrng2mltrng_fk
FOREIGN KEY (parent_id, PERIOD valid_at)
DELETE FROM temporal_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
COMMIT;
---
--- test FK referenced deletes RESTRICT
---
-
-TRUNCATE temporal_mltrng, temporal_fk_mltrng2mltrng;
-ALTER TABLE temporal_fk_mltrng2mltrng
- DROP CONSTRAINT temporal_fk_mltrng2mltrng_fk;
-ALTER TABLE temporal_fk_mltrng2mltrng
- ADD CONSTRAINT temporal_fk_mltrng2mltrng_fk
- FOREIGN KEY (parent_id, PERIOD valid_at)
- REFERENCES temporal_mltrng (id, PERIOD valid_at)
- ON DELETE RESTRICT;
-INSERT INTO temporal_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日')));
-DELETE FROM temporal_mltrng WHERE id = '[5,6)';
--- a PK delete that succeeds even though the numeric id is referenced because the range isn't:
-INSERT INTO temporal_mltrng (id, valid_at) VALUES
- ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日'))),
- ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-DELETE FROM temporal_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- a PK delete that fails because both are referenced (even before commit):
-BEGIN;
- ALTER TABLE temporal_fk_mltrng2mltrng
- ALTER CONSTRAINT temporal_fk_mltrng2mltrng_fk
- DEFERRABLE INITIALLY DEFERRED;
-
- DELETE FROM temporal_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-ROLLBACK;
-
--
-- FK between partitioned tables: ranges
--
@@ -1968,40 +1842,6 @@ DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange
-- should fail:
DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
---
--- partitioned FK referenced updates RESTRICT
---
-
-TRUNCATE temporal_partitioned_rng, temporal_partitioned_fk_rng2rng;
-ALTER TABLE temporal_partitioned_fk_rng2rng
- DROP CONSTRAINT temporal_partitioned_fk_rng2rng_fk;
-ALTER TABLE temporal_partitioned_fk_rng2rng
- ADD CONSTRAINT temporal_partitioned_fk_rng2rng_fk
- FOREIGN KEY (parent_id, PERIOD valid_at)
- REFERENCES temporal_partitioned_rng
- ON DELETE RESTRICT;
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2016年01月01日', '2016年02月01日'));
-UPDATE temporal_partitioned_rng SET valid_at = daterange('2018年01月01日', '2018年02月01日') WHERE id = '[5,6)';
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_partitioned_fk_rng2rng (id, valid_at, parent_id) VALUES ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-UPDATE temporal_partitioned_rng SET valid_at = daterange('2016年02月01日', '2016年03月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- should fail:
-UPDATE temporal_partitioned_rng SET valid_at = daterange('2016年01月01日', '2016年02月01日')
- WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-
---
--- partitioned FK referenced deletes RESTRICT
---
-
-TRUNCATE temporal_partitioned_rng, temporal_partitioned_fk_rng2rng;
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年01月01日', '2018年02月01日'));
-INSERT INTO temporal_partitioned_rng (id, valid_at) VALUES ('[5,6)', daterange('2018年02月01日', '2018年03月01日'));
-INSERT INTO temporal_partitioned_fk_rng2rng (id, valid_at, parent_id) VALUES ('[3,4)', daterange('2018年01月05日', '2018年01月10日'), '[5,6)');
-DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年02月01日', '2018年03月01日');
--- should fail:
-DELETE FROM temporal_partitioned_rng WHERE id = '[5,6)' AND valid_at = daterange('2018年01月01日', '2018年02月01日');
-
--
-- partitioned FK referenced updates CASCADE
--
@@ -2132,40 +1972,6 @@ DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemu
-- should fail:
DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
---
--- partitioned FK referenced updates RESTRICT
---
-
-TRUNCATE temporal_partitioned_mltrng, temporal_partitioned_fk_mltrng2mltrng;
-ALTER TABLE temporal_partitioned_fk_mltrng2mltrng
- DROP CONSTRAINT temporal_partitioned_fk_mltrng2mltrng_fk;
-ALTER TABLE temporal_partitioned_fk_mltrng2mltrng
- ADD CONSTRAINT temporal_partitioned_fk_mltrng2mltrng_fk
- FOREIGN KEY (parent_id, PERIOD valid_at)
- REFERENCES temporal_partitioned_mltrng
- ON DELETE RESTRICT;
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2016年01月01日', '2016年02月01日')));
-UPDATE temporal_partitioned_mltrng SET valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日')) WHERE id = '[5,6)';
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_partitioned_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-UPDATE temporal_partitioned_mltrng SET valid_at = datemultirange(daterange('2016年02月01日', '2016年03月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- should fail:
-UPDATE temporal_partitioned_mltrng SET valid_at = datemultirange(daterange('2016年01月01日', '2016年02月01日'))
- WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-
---
--- partitioned FK referenced deletes RESTRICT
---
-
-TRUNCATE temporal_partitioned_mltrng, temporal_partitioned_fk_mltrng2mltrng;
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年01月01日', '2018年02月01日')));
-INSERT INTO temporal_partitioned_mltrng (id, valid_at) VALUES ('[5,6)', datemultirange(daterange('2018年02月01日', '2018年03月01日')));
-INSERT INTO temporal_partitioned_fk_mltrng2mltrng (id, valid_at, parent_id) VALUES ('[3,4)', datemultirange(daterange('2018年01月05日', '2018年01月10日')), '[5,6)');
-DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年02月01日', '2018年03月01日'));
--- should fail:
-DELETE FROM temporal_partitioned_mltrng WHERE id = '[5,6)' AND valid_at = datemultirange(daterange('2018年01月01日', '2018年02月01日'));
-
--
-- partitioned FK referenced updates CASCADE
--