From 2ec6700cccf9d258ed1b532e42a19285eb5b6f18 Mon Sep 17 00:00:00 2001 From: tianzhou Date: Tue, 21 Jul 2026 20:02:27 -0700 Subject: [PATCH] fix: emit COMMENT and DISABLE for newly added table triggers (#515) The added-trigger branch in table.go collected CREATE TRIGGER SQL but did not call generateTriggerComment or generateTriggerEnabledState, causing trigger comments (and disabled state) to be silently dropped on first apply. The modified-trigger and view-trigger paths already handled both correctly. Co-Authored-By: Claude Opus 4.6 --- internal/diff/table.go | 8 ++++++++ testdata/diff/create_trigger/add_trigger/diff.sql | 2 ++ testdata/diff/create_trigger/add_trigger/new.sql | 2 ++ testdata/diff/create_trigger/add_trigger/plan.json | 6 ++++++ testdata/diff/create_trigger/add_trigger/plan.sql | 2 ++ testdata/diff/create_trigger/add_trigger/plan.txt | 5 ++++- 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/internal/diff/table.go b/internal/diff/table.go index 405cf855..16f4d493 100644 --- a/internal/diff/table.go +++ b/internal/diff/table.go @@ -1511,6 +1511,14 @@ func (td *tableDiff) generateAlterTableStatements(targetSchema string, collector CanRunInTransaction: true, } collector.collect(context, sql) + + if trigger.Comment != "" { + generateTriggerComment(trigger, td.Table.Schema, td.Table.Name, targetSchema, DiffTypeTableTrigger, collector) + } + + if trigger.Disabled { + generateTriggerEnabledState(trigger, td.Table.Schema, td.Table.Name, targetSchema, DiffTypeTableTrigger, collector) + } } // Add policies - already sorted by the Diff operation diff --git a/testdata/diff/create_trigger/add_trigger/diff.sql b/testdata/diff/create_trigger/add_trigger/diff.sql index 6f7c2e73..388c3624 100644 --- a/testdata/diff/create_trigger/add_trigger/diff.sql +++ b/testdata/diff/create_trigger/add_trigger/diff.sql @@ -8,6 +8,8 @@ CREATE OR REPLACE TRIGGER employees_last_modified_trigger FOR EACH ROW EXECUTE FUNCTION update_last_modified(); +COMMENT ON TRIGGER employees_last_modified_trigger ON employees IS 'Updates last_modified timestamp on every row update'; + CREATE OR REPLACE TRIGGER employees_salary_update_trigger BEFORE UPDATE OF salary ON employees FOR EACH ROW diff --git a/testdata/diff/create_trigger/add_trigger/new.sql b/testdata/diff/create_trigger/add_trigger/new.sql index 6453df3f..23b2b18b 100644 --- a/testdata/diff/create_trigger/add_trigger/new.sql +++ b/testdata/diff/create_trigger/add_trigger/new.sql @@ -18,6 +18,8 @@ CREATE TRIGGER employees_last_modified_trigger FOR EACH ROW EXECUTE FUNCTION public.update_last_modified(); +COMMENT ON TRIGGER employees_last_modified_trigger ON public.employees IS 'Updates last_modified timestamp on every row update'; + CREATE TRIGGER employees_insert_timestamp_trigger AFTER INSERT ON public.employees FOR EACH ROW diff --git a/testdata/diff/create_trigger/add_trigger/plan.json b/testdata/diff/create_trigger/add_trigger/plan.json index 90f48675..78a5b45a 100644 --- a/testdata/diff/create_trigger/add_trigger/plan.json +++ b/testdata/diff/create_trigger/add_trigger/plan.json @@ -20,6 +20,12 @@ "operation": "create", "path": "public.employees.employees_last_modified_trigger" }, + { + "sql": "COMMENT ON TRIGGER employees_last_modified_trigger ON employees IS 'Updates last_modified timestamp on every row update';", + "type": "table.trigger", + "operation": "alter", + "path": "public.employees.employees_last_modified_trigger" + }, { "sql": "CREATE OR REPLACE TRIGGER employees_salary_update_trigger\n BEFORE UPDATE OF salary ON employees\n FOR EACH ROW\n EXECUTE FUNCTION update_last_modified();", "type": "table.trigger", diff --git a/testdata/diff/create_trigger/add_trigger/plan.sql b/testdata/diff/create_trigger/add_trigger/plan.sql index 6f7c2e73..388c3624 100644 --- a/testdata/diff/create_trigger/add_trigger/plan.sql +++ b/testdata/diff/create_trigger/add_trigger/plan.sql @@ -8,6 +8,8 @@ CREATE OR REPLACE TRIGGER employees_last_modified_trigger FOR EACH ROW EXECUTE FUNCTION update_last_modified(); +COMMENT ON TRIGGER employees_last_modified_trigger ON employees IS 'Updates last_modified timestamp on every row update'; + CREATE OR REPLACE TRIGGER employees_salary_update_trigger BEFORE UPDATE OF salary ON employees FOR EACH ROW diff --git a/testdata/diff/create_trigger/add_trigger/plan.txt b/testdata/diff/create_trigger/add_trigger/plan.txt index a7d32981..71977f9f 100644 --- a/testdata/diff/create_trigger/add_trigger/plan.txt +++ b/testdata/diff/create_trigger/add_trigger/plan.txt @@ -8,6 +8,7 @@ Tables: ~ employees + employees_insert_timestamp_trigger (trigger) + employees_last_modified_trigger (trigger) + ~ employees_last_modified_trigger (trigger) + employees_salary_update_trigger (trigger) + employees_truncate_log_trigger (trigger) @@ -28,6 +29,8 @@ CREATE OR REPLACE TRIGGER employees_last_modified_trigger FOR EACH ROW EXECUTE FUNCTION update_last_modified(); +COMMENT ON TRIGGER employees_last_modified_trigger ON employees IS 'Updates last_modified timestamp on every row update'; + CREATE OR REPLACE TRIGGER employees_salary_update_trigger BEFORE UPDATE OF salary ON employees FOR EACH ROW @@ -41,4 +44,4 @@ CREATE OR REPLACE TRIGGER employees_truncate_log_trigger CREATE OR REPLACE TRIGGER trg_employee_emails_insert INSTEAD OF INSERT ON employee_emails FOR EACH ROW - EXECUTE FUNCTION insert_employee_emails(); + EXECUTE FUNCTION insert_employee_emails(); \ No newline at end of file