mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-22 13:40:56 +08:00
Add more tests for foreign key constraints on hypertables
This commit is contained in:
parent
640cb377a2
commit
6d83e0584d
@ -580,3 +580,325 @@ ERROR: hypertables cannot be used as foreign key references of hypertables
|
|||||||
DROP TABLE event;
|
DROP TABLE event;
|
||||||
DROP TABLE event2;
|
DROP TABLE event2;
|
||||||
DROP TABLE metrics;
|
DROP TABLE metrics;
|
||||||
|
-- test FK behavior with different cascading configurations
|
||||||
|
CREATE TABLE fk_no_action(fk_no_action text primary key);
|
||||||
|
CREATE TABLE fk_restrict(fk_restrict text primary key);
|
||||||
|
CREATE TABLE fk_cascade(fk_cascade text primary key);
|
||||||
|
CREATE TABLE fk_set_null(fk_set_null text primary key);
|
||||||
|
CREATE TABLE fk_set_default(fk_set_default text primary key);
|
||||||
|
CREATE TABLE ht(
|
||||||
|
time timestamptz not null,
|
||||||
|
fk_no_action text references fk_no_action(fk_no_action) ON DELETE NO ACTION ON UPDATE NO ACTION,
|
||||||
|
fk_restrict text references fk_restrict(fk_restrict) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
||||||
|
fk_cascade text references fk_cascade(fk_cascade) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
fk_set_null text references fk_set_null(fk_set_null) ON DELETE SET NULL ON UPDATE SET NULL,
|
||||||
|
fk_set_default text default 'default' references fk_set_default(fk_set_default) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT
|
||||||
|
);
|
||||||
|
SELECT table_name FROM create_hypertable('ht', 'time');
|
||||||
|
table_name
|
||||||
|
------------
|
||||||
|
ht
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
ALTER TABLE ht SET(timescaledb.compress, timescaledb.compress_segmentby='fk_no_action,fk_restrict,fk_cascade,fk_set_null,fk_set_default');
|
||||||
|
NOTICE: default order by for hypertable "ht" is set to ""time" DESC"
|
||||||
|
\set ON_ERROR_STOP 0
|
||||||
|
INSERT INTO fk_set_default(fk_set_default) VALUES ('default');
|
||||||
|
INSERT INTO ht(time) VALUES ('2020-01-01');
|
||||||
|
-- NO ACTION
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
ERROR: insert or update on table "_hyper_13_14_chunk" violates foreign key constraint "14_14_ht_fk_no_action_fkey"
|
||||||
|
-- ON UPDATE NO ACTION
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_no_action SET fk_no_action = 'fk_no_action_updated';
|
||||||
|
ERROR: update or delete on table "fk_no_action" violates foreign key constraint "ht_fk_no_action_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON UPDATE NO ACTION with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_no_action SET fk_no_action = 'fk_no_action_updated';
|
||||||
|
ERROR: update or delete on table "fk_no_action" violates foreign key constraint "ht_fk_no_action_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE NO ACTION
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_no_action;
|
||||||
|
ERROR: update or delete on table "fk_no_action" violates foreign key constraint "ht_fk_no_action_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE NO ACTION with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_no_action;
|
||||||
|
ERROR: update or delete on table "fk_no_action" violates foreign key constraint "ht_fk_no_action_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- RESTRICT
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
ERROR: insert or update on table "_hyper_13_14_chunk" violates foreign key constraint "14_15_ht_fk_restrict_fkey"
|
||||||
|
-- ON UPDATE RESTRICT
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_restrict SET fk_restrict = 'fk_restrict_updated';
|
||||||
|
ERROR: update or delete on table "fk_restrict" violates foreign key constraint "ht_fk_restrict_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON UPDATE RESTRICT with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_restrict SET fk_restrict = 'fk_restrict_updated';
|
||||||
|
ERROR: update or delete on table "fk_restrict" violates foreign key constraint "ht_fk_restrict_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE RESTRICT
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_restrict;
|
||||||
|
ERROR: update or delete on table "fk_restrict" violates foreign key constraint "ht_fk_restrict_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE RESTRICT with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_restrict;
|
||||||
|
ERROR: update or delete on table "fk_restrict" violates foreign key constraint "ht_fk_restrict_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
-- CASCADE
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
ERROR: insert or update on table "_hyper_13_14_chunk" violates foreign key constraint "14_13_ht_fk_cascade_fkey"
|
||||||
|
-- ON UPDATE CASCADE
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
-- should cascade
|
||||||
|
UPDATE fk_cascade SET fk_cascade = 'fk_cascade_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+--------------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | fk_cascade_updated | | default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON UPDATE CASCADE with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should cascade
|
||||||
|
UPDATE fk_cascade SET fk_cascade = 'fk_cascade_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+--------------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | fk_cascade_updated | | default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
QUERY PLAN
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Custom Scan (DecompressChunk) on _hyper_13_14_chunk (actual rows=2 loops=1)
|
||||||
|
-> Seq Scan on compress_hyper_14_19_chunk (actual rows=2 loops=1)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE CASCADE
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
-- should cascade
|
||||||
|
DELETE FROM fk_cascade;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE CASCADE with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should cascade
|
||||||
|
DELETE FROM fk_cascade;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
QUERY PLAN
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Custom Scan (DecompressChunk) on _hyper_13_14_chunk (actual rows=1 loops=1)
|
||||||
|
-> Seq Scan on compress_hyper_14_20_chunk (actual rows=1 loops=1)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- SET NULL
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
ERROR: insert or update on table "_hyper_13_14_chunk" violates foreign key constraint "14_17_ht_fk_set_null_fkey"
|
||||||
|
-- ON UPDATE SET NULL
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
-- should set column to null
|
||||||
|
UPDATE fk_set_null SET fk_set_null = 'fk_set_null_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON UPDATE SET NULL with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should set column to null
|
||||||
|
UPDATE fk_set_null SET fk_set_null = 'fk_set_null_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
QUERY PLAN
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Custom Scan (DecompressChunk) on _hyper_13_14_chunk (actual rows=2 loops=1)
|
||||||
|
-> Seq Scan on compress_hyper_14_21_chunk (actual rows=2 loops=1)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE SET NULL
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
-- should set column to null
|
||||||
|
DELETE FROM fk_set_null;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- ON DELETE SET NULL with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- should set column to null
|
||||||
|
DELETE FROM fk_set_null;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
QUERY PLAN
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Custom Scan (DecompressChunk) on _hyper_13_14_chunk (actual rows=2 loops=1)
|
||||||
|
-> Seq Scan on compress_hyper_14_22_chunk (actual rows=2 loops=1)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
ROLLBACK;
|
||||||
|
-- SET DEFAULT
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_set_default) VALUES ('2020-01-01', 'fk_set_default');
|
||||||
|
ERROR: insert or update on table "_hyper_13_14_chunk" violates foreign key constraint "14_16_ht_fk_set_default_fkey"
|
||||||
|
-- set default is not supported for hypertables so these will fail
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_default(fk_set_default) VALUES ('fk_set_default');
|
||||||
|
INSERT INTO ht(time, fk_set_default) VALUES ('2020-01-01', 'fk_set_default');
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | fk_set_default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
UPDATE fk_set_default SET fk_set_default = 'fk_set_default_updated' WHERE fk_set_default = 'fk_set_default';
|
||||||
|
ERROR: update or delete on table "fk_set_default" violates foreign key constraint "ht_fk_set_default_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_default(fk_set_default) VALUES ('fk_set_default');
|
||||||
|
INSERT INTO ht(time, fk_set_default) VALUES ('2020-01-01', 'fk_set_default');
|
||||||
|
SELECT * FROM ht;
|
||||||
|
time | fk_no_action | fk_restrict | fk_cascade | fk_set_null | fk_set_default
|
||||||
|
------------------------------+--------------+-------------+------------+-------------+----------------
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | default
|
||||||
|
Wed Jan 01 00:00:00 2020 PST | | | | | fk_set_default
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
DELETE FROM fk_set_default WHERE fk_set_default = 'fk_set_default';
|
||||||
|
ERROR: update or delete on table "fk_set_default" violates foreign key constraint "ht_fk_set_default_fkey" on table "ht"
|
||||||
|
ROLLBACK;
|
||||||
|
@ -395,3 +395,212 @@ SELECT table_name FROM create_hypertable('event2', 'time');
|
|||||||
DROP TABLE event;
|
DROP TABLE event;
|
||||||
DROP TABLE event2;
|
DROP TABLE event2;
|
||||||
DROP TABLE metrics;
|
DROP TABLE metrics;
|
||||||
|
|
||||||
|
-- test FK behavior with different cascading configurations
|
||||||
|
CREATE TABLE fk_no_action(fk_no_action text primary key);
|
||||||
|
CREATE TABLE fk_restrict(fk_restrict text primary key);
|
||||||
|
CREATE TABLE fk_cascade(fk_cascade text primary key);
|
||||||
|
CREATE TABLE fk_set_null(fk_set_null text primary key);
|
||||||
|
CREATE TABLE fk_set_default(fk_set_default text primary key);
|
||||||
|
|
||||||
|
CREATE TABLE ht(
|
||||||
|
time timestamptz not null,
|
||||||
|
fk_no_action text references fk_no_action(fk_no_action) ON DELETE NO ACTION ON UPDATE NO ACTION,
|
||||||
|
fk_restrict text references fk_restrict(fk_restrict) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
||||||
|
fk_cascade text references fk_cascade(fk_cascade) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
fk_set_null text references fk_set_null(fk_set_null) ON DELETE SET NULL ON UPDATE SET NULL,
|
||||||
|
fk_set_default text default 'default' references fk_set_default(fk_set_default) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT
|
||||||
|
);
|
||||||
|
|
||||||
|
SELECT table_name FROM create_hypertable('ht', 'time');
|
||||||
|
|
||||||
|
ALTER TABLE ht SET(timescaledb.compress, timescaledb.compress_segmentby='fk_no_action,fk_restrict,fk_cascade,fk_set_null,fk_set_default');
|
||||||
|
|
||||||
|
\set ON_ERROR_STOP 0
|
||||||
|
|
||||||
|
INSERT INTO fk_set_default(fk_set_default) VALUES ('default');
|
||||||
|
INSERT INTO ht(time) VALUES ('2020-01-01');
|
||||||
|
|
||||||
|
-- NO ACTION
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
|
||||||
|
-- ON UPDATE NO ACTION
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_no_action SET fk_no_action = 'fk_no_action_updated';
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON UPDATE NO ACTION with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_no_action SET fk_no_action = 'fk_no_action_updated';
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE NO ACTION
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_no_action;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE NO ACTION with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_no_action(fk_no_action) VALUES ('fk_no_action');
|
||||||
|
INSERT INTO ht(time, fk_no_action) VALUES ('2020-01-01', 'fk_no_action');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_no_action;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- RESTRICT
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
|
||||||
|
-- ON UPDATE RESTRICT
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_restrict SET fk_restrict = 'fk_restrict_updated';
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON UPDATE RESTRICT with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should error
|
||||||
|
UPDATE fk_restrict SET fk_restrict = 'fk_restrict_updated';
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE RESTRICT
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_restrict;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE RESTRICT with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_restrict(fk_restrict) VALUES ('fk_restrict');
|
||||||
|
INSERT INTO ht(time, fk_restrict) VALUES ('2020-01-01', 'fk_restrict');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should error
|
||||||
|
DELETE FROM fk_restrict;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- CASCADE
|
||||||
|
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
|
||||||
|
-- ON UPDATE CASCADE
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
-- should cascade
|
||||||
|
UPDATE fk_cascade SET fk_cascade = 'fk_cascade_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON UPDATE CASCADE with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should cascade
|
||||||
|
UPDATE fk_cascade SET fk_cascade = 'fk_cascade_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE CASCADE
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
-- should cascade
|
||||||
|
DELETE FROM fk_cascade;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE CASCADE with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_cascade(fk_cascade) VALUES ('fk_cascade');
|
||||||
|
INSERT INTO ht(time, fk_cascade) VALUES ('2020-01-01', 'fk_cascade');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should cascade
|
||||||
|
DELETE FROM fk_cascade;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- SET NULL
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
|
||||||
|
-- ON UPDATE SET NULL
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
-- should set column to null
|
||||||
|
UPDATE fk_set_null SET fk_set_null = 'fk_set_null_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON UPDATE SET NULL with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should set column to null
|
||||||
|
UPDATE fk_set_null SET fk_set_null = 'fk_set_null_updated';
|
||||||
|
SELECT * FROM ht;
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE SET NULL
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
-- should set column to null
|
||||||
|
DELETE FROM fk_set_null;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- ON DELETE SET NULL with compression
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_null(fk_set_null) VALUES ('fk_set_null');
|
||||||
|
INSERT INTO ht(time, fk_set_null) VALUES ('2020-01-01', 'fk_set_null');
|
||||||
|
SELECT count(compress_chunk(ch)) FROM show_chunks('ht') ch;
|
||||||
|
-- should set column to null
|
||||||
|
DELETE FROM fk_set_null;
|
||||||
|
SELECT * FROM ht;
|
||||||
|
EXPLAIN (analyze, costs off, timing off, summary off) SELECT * FROM ht;
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- SET DEFAULT
|
||||||
|
-- should fail with foreign key violation
|
||||||
|
INSERT INTO ht(time, fk_set_default) VALUES ('2020-01-01', 'fk_set_default');
|
||||||
|
|
||||||
|
-- set default is not supported for hypertables so these will fail
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_default(fk_set_default) VALUES ('fk_set_default');
|
||||||
|
INSERT INTO ht(time, fk_set_default) VALUES ('2020-01-01', 'fk_set_default');
|
||||||
|
SELECT * FROM ht;
|
||||||
|
UPDATE fk_set_default SET fk_set_default = 'fk_set_default_updated' WHERE fk_set_default = 'fk_set_default';
|
||||||
|
ROLLBACK;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO fk_set_default(fk_set_default) VALUES ('fk_set_default');
|
||||||
|
INSERT INTO ht(time, fk_set_default) VALUES ('2020-01-01', 'fk_set_default');
|
||||||
|
SELECT * FROM ht;
|
||||||
|
DELETE FROM fk_set_default WHERE fk_set_default = 'fk_set_default';
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user