aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2015-02-27 18:38:33 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2015-02-27 18:39:53 -0300
commit3f190f67eb45ae61d696fbce8ab48d246a12f709 (patch)
tree6f412618fbfc2a4ac704f86d050c75404fd7e916 /src
parentbda76c1c8cfb1d11751ba6be88f0242850481733 (diff)
downloadpostgresql-3f190f67eb45ae61d696fbce8ab48d246a12f709.tar.gz
postgresql-3f190f67eb45ae61d696fbce8ab48d246a12f709.zip
Fix table_rewrite event trigger for ALTER TYPE/SET DATA TYPE CASCADE
When a composite type being used in a typed table is modified by way of ALTER TYPE, a table rewrite occurs appearing to come from ALTER TYPE. The existing event_trigger.c code was unable to cope with that and raised a spurious error. The fix is just to accept that command tag for the event, and document this properly. Noted while fooling with deparsing of DDL commands. This appears to be an oversight in commit 618c9430a. Thanks to Mark Wong for documentation wording help.
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/event_trigger.c3
-rw-r--r--src/test/regress/expected/event_trigger.out11
-rw-r--r--src/test/regress/sql/event_trigger.sql10
3 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c
index dcf5b987477..deeb8dcfaf1 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 20957945766..8462fbff1c1 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 c6e47ed856e..4baad80b1df 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();