From 57d8cbc4f37b1a60ddfbe12b653d8a2b16e36dcc Mon Sep 17 00:00:00 2001 From: Mats Kindahl Date: Mon, 25 Nov 2024 18:45:40 +0100 Subject: [PATCH] Emit error on transition table trigger for chunks If a transition table trigger is added to a hypertable, an error is generated indicating that this is not supported. However, if it is added to a chunk, it is accepted but inserts/updates/deletes are silently ignored and if the compression flag is set on the hypertable, this generate an assertion failure in debug builds. Instead, we generate an error when an attempt is made to add a transition table trigger to a chunk of a hypertable, regardless of whether the compression flag is set or not. --- .unreleased/pr_7488 | 1 + src/process_utility.c | 6 ++++++ test/expected/triggers.out | 9 +++++++++ test/sql/triggers.sql | 7 +++++++ 4 files changed, 23 insertions(+) create mode 100644 .unreleased/pr_7488 diff --git a/.unreleased/pr_7488 b/.unreleased/pr_7488 new file mode 100644 index 000000000..f8050f7eb --- /dev/null +++ b/.unreleased/pr_7488 @@ -0,0 +1 @@ +Fixes: #7488 Emit error for transition table trigger on chunks diff --git a/src/process_utility.c b/src/process_utility.c index 7cddcff23..039a134ee 100644 --- a/src/process_utility.c +++ b/src/process_utility.c @@ -4452,6 +4452,12 @@ process_create_trigger_start(ProcessUtilityArgs *args) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("triggers are not supported on continuous aggregate"))); + if (stmt->transitionRels) + if (ts_chunk_get_by_relid(relid, false) != NULL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg( + "trigger with transition tables not supported on hypertable chunks"))); return DDL_CONTINUE; } diff --git a/test/expected/triggers.out b/test/expected/triggers.out index 8d11999dd..56bc3ba92 100644 --- a/test/expected/triggers.out +++ b/test/expected/triggers.out @@ -428,6 +428,9 @@ SELECT create_hypertable('transition_test','time'); (4,public,transition_test,t) (1 row) +-- Insert some rows to create a chunk +INSERT INTO transition_test values ('2020-01-10'); +SELECT chunk FROM show_chunks('transition_test') tbl(chunk) limit 1 \gset -- test creating trigger with transition tables on existing hypertable \set ON_ERROR_STOP 0 CREATE TRIGGER t2 AFTER INSERT ON transition_test REFERENCING NEW TABLE AS new_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); @@ -436,6 +439,12 @@ CREATE TRIGGER t3 AFTER UPDATE ON transition_test REFERENCING NEW TABLE AS new_t ERROR: trigger with transition tables not supported on hypertables CREATE TRIGGER t4 AFTER DELETE ON transition_test REFERENCING OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); ERROR: trigger with transition tables not supported on hypertables +CREATE TRIGGER t2 AFTER INSERT ON :chunk REFERENCING NEW TABLE AS new_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); +ERROR: trigger with transition tables not supported on hypertable chunks +CREATE TRIGGER t3 AFTER UPDATE ON :chunk REFERENCING NEW TABLE AS new_trans OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); +ERROR: trigger with transition tables not supported on hypertable chunks +CREATE TRIGGER t4 AFTER DELETE ON :chunk REFERENCING OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); +ERROR: trigger with transition tables not supported on hypertable chunks CREATE TRIGGER t2 AFTER INSERT ON transition_test REFERENCING NEW TABLE AS new_trans FOR EACH ROW EXECUTE FUNCTION test_trigger(); ERROR: trigger with transition tables not supported on hypertables CREATE TRIGGER t3 AFTER UPDATE ON transition_test REFERENCING NEW TABLE AS new_trans OLD TABLE AS old_trans FOR EACH ROW EXECUTE FUNCTION test_trigger(); diff --git a/test/sql/triggers.sql b/test/sql/triggers.sql index 1904f27f1..949e1e5fd 100644 --- a/test/sql/triggers.sql +++ b/test/sql/triggers.sql @@ -313,11 +313,18 @@ SELECT create_hypertable('transition_test','time'); DROP TRIGGER t1 ON transition_test; SELECT create_hypertable('transition_test','time'); +-- Insert some rows to create a chunk +INSERT INTO transition_test values ('2020-01-10'); +SELECT chunk FROM show_chunks('transition_test') tbl(chunk) limit 1 \gset + -- test creating trigger with transition tables on existing hypertable \set ON_ERROR_STOP 0 CREATE TRIGGER t2 AFTER INSERT ON transition_test REFERENCING NEW TABLE AS new_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); CREATE TRIGGER t3 AFTER UPDATE ON transition_test REFERENCING NEW TABLE AS new_trans OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); CREATE TRIGGER t4 AFTER DELETE ON transition_test REFERENCING OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); +CREATE TRIGGER t2 AFTER INSERT ON :chunk REFERENCING NEW TABLE AS new_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); +CREATE TRIGGER t3 AFTER UPDATE ON :chunk REFERENCING NEW TABLE AS new_trans OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); +CREATE TRIGGER t4 AFTER DELETE ON :chunk REFERENCING OLD TABLE AS old_trans FOR EACH STATEMENT EXECUTE FUNCTION test_trigger(); CREATE TRIGGER t2 AFTER INSERT ON transition_test REFERENCING NEW TABLE AS new_trans FOR EACH ROW EXECUTE FUNCTION test_trigger(); CREATE TRIGGER t3 AFTER UPDATE ON transition_test REFERENCING NEW TABLE AS new_trans OLD TABLE AS old_trans FOR EACH ROW EXECUTE FUNCTION test_trigger();