diff --git a/doc/src/sgml/event-trigger.sgml b/doc/src/sgml/event-trigger.sgml index 04353eac3d76c0ff6e15421f12b652384e557c35..f151eb73754f1998367149a1ed377c7131d5e3ce 100644 --- a/doc/src/sgml/event-trigger.sgml +++ b/doc/src/sgml/event-trigger.sgml @@ -68,12 +68,11 @@ <para> The <literal>table_rewrite</> event occurs just before a table is - rewritten by the command <literal>ALTER TABLE</literal>. While other + rewritten by some actions of the commands <literal>ALTER TABLE</> and + <literal>ALTER TYPE</>. While other control statements are available to rewrite a table, like <literal>CLUSTER</literal> and <literal>VACUUM</literal>, - the <literal>table_rewrite</> event is currently only triggered by - the <literal>ALTER TABLE</literal> command, and only when that command - attempts to rewrite the table. + the <literal>table_rewrite</> event is not triggered by them. </para> <para> @@ -318,7 +317,7 @@ <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>-</literal></entry> - <entry align="center"><literal>-</literal></entry> + <entry align="center"><literal>X</literal></entry> <entry align="center"></entry> </row> <row> diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index dcf5b987477a5fafacf2c559fcd7e0e472eb09af..deeb8dcfaf164821eb40a6af77b4a3054f85a457 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -326,7 +326,8 @@ validate_table_rewrite_tags(const char *filtervar, List *taglist) static event_trigger_command_tag_check_result check_table_rewrite_ddl_tag(const char *tag) { - if (pg_strcasecmp(tag, "ALTER TABLE") == 0) + if (pg_strcasecmp(tag, "ALTER TABLE") == 0 || + pg_strcasecmp(tag, "ALTER TYPE") == 0) return EVENT_TRIGGER_COMMAND_TAG_OK; return EVENT_TRIGGER_COMMAND_TAG_NOT_SUPPORTED; diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 2095794576675c515bd20a96561763536d6becf8..8462fbff1c185b5a59d7c14724116425f8ad70f0 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -370,6 +370,17 @@ alter table rewriteme NOTICE: Table 'rewriteme' is being rewritten (reason = 6) -- shouldn't trigger a table_rewrite event alter table rewriteme alter column foo type numeric(12,4); +-- typed tables are rewritten when their type changes +create type rewritetype as (a int); +create table rewritemetoo1 of rewritetype; +create table rewritemetoo2 of rewritetype; +alter type rewritetype alter attribute a type text cascade; +NOTICE: Table 'rewritemetoo1' is being rewritten (reason = 4) +NOTICE: Table 'rewritemetoo2' is being rewritten (reason = 4) +-- but this doesn't work +create table rewritemetoo3 (a rewritetype); +alter type rewritetype alter attribute a type varchar cascade; +ERROR: cannot alter type "rewritetype" because column "rewritemetoo3.a" uses it drop table rewriteme; drop event trigger no_rewrite_allowed; drop function test_evtrig_no_rewrite(); diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index c6e47ed856eb7046ed57a68d6cbd2f7ffeae9726..4baad80b1df6b3c891aae097c19aee3fa025567d 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -276,6 +276,16 @@ alter table rewriteme -- shouldn't trigger a table_rewrite event alter table rewriteme alter column foo type numeric(12,4); +-- typed tables are rewritten when their type changes +create type rewritetype as (a int); +create table rewritemetoo1 of rewritetype; +create table rewritemetoo2 of rewritetype; +alter type rewritetype alter attribute a type text cascade; + +-- but this doesn't work +create table rewritemetoo3 (a rewritetype); +alter type rewritetype alter attribute a type varchar cascade; + drop table rewriteme; drop event trigger no_rewrite_allowed; drop function test_evtrig_no_rewrite();