Thread
-
Re: CREATE TABLE LIKE INCLUDING TRIGGERS
Zsolt Parragi <zsolt.parragi@percona.com> — 2026-05-27T22:53:13Z
Hello! Sorry for the late reply, somehow I missed the previous updates. I found one more problematic scenario, I think the patch should ignore INSTEAD OF triggers: CREATE TABLE base (id int, val text); CREATE VIEW v_instead AS SELECT id, val FROM base; CREATE FUNCTION v_instead_ins() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN INSERT INTO base VALUES (NEW.id, NEW.val); RETURN NEW; END; $$; CREATE TRIGGER v_instead_trg INSTEAD OF INSERT ON v_instead FOR EACH ROW EXECUTE FUNCTION v_instead_ins(); -- currently fails -- ERROR: "t_all" is a table -- DETAIL: Tables cannot have INSTEAD OF triggers. CREATE TABLE t_all (LIKE v_instead INCLUDING ALL); And also, either I don't understand something here, or the diff can be simplified a bit: - /* Transform expression. Copy to be sure we don't modify original */ - whenClause = transformWhereClause(pstate, - copyObject(stmt->whenClause), - EXPR_KIND_TRIGGER_WHEN, - "WHEN"); - /* we have to fix its collations too */ - assign_expr_collations(pstate, whenClause); + if (stmt->transformed) + whenClause = stmt->whenClause; + else + { + /* Transform expression. Copy to be sure we don't modify original */ + whenClause = transformWhereClause(pstate, + copyObject(stmt->whenClause), + EXPR_KIND_TRIGGER_WHEN, + "WHEN"); + + /* we have to fix its collations too */ + assign_expr_collations(pstate, whenClause); + + stmt->transformed = true; + } Do we need the last assignment in this diff? It sets stmt->transformed, but we don't actually transform the statement, we create a copy. The flag also doesn't seem to be used after that. Everything seems to work fine if I remove this assignment, and we don't need the const related function signature changes without it.