]> granicus.if.org Git - postgresql/commitdiff
Throw an appropriate error if ALTER COLUMN TYPE finds a dependent trigger.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 2 Oct 2010 22:21:41 +0000 (18:21 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 2 Oct 2010 22:21:41 +0000 (18:21 -0400)
Actually making this case work, if the column is used in the trigger's
WHEN condition, will take some new code that probably isn't appropriate
to back-patch.  For now, just throw a FEATURE_NOT_SUPPORTED error rather
than allowing control to reach the "unexpected object" case.  Per bug #5688
from Daniel Grace.  Back-patch to 9.0 where the possibility of such a
dependency was introduced.

src/backend/commands/tablecmds.c

index a5d7af604209c9fa9bc23a981f402011bf2cba5f..403e55af917147684174e1d9d82abccc6bad213c 100644 (file)
@@ -6411,6 +6411,24 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
                                                                   colName)));
                                break;
 
+                       case OCLASS_TRIGGER:
+                               /*
+                                * A trigger can depend on a column because the column is
+                                * specified as an update target, or because the column is
+                                * used in the trigger's WHEN condition.  The first case would
+                                * not require any extra work, but the second case would
+                                * require updating the WHEN expression, which will take a
+                                * significant amount of new code.  Since we can't easily tell
+                                * which case applies, we punt for both.  FIXME someday.
+                                */
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                errmsg("cannot alter type of a column used in a trigger definition"),
+                                                errdetail("%s depends on column \"%s\"",
+                                                                  getObjectDescription(&foundObject),
+                                                                  colName)));
+                               break;
+
                        case OCLASS_DEFAULT:
 
                                /*
@@ -6431,7 +6449,6 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
                        case OCLASS_OPFAMILY:
                        case OCLASS_AMOP:
                        case OCLASS_AMPROC:
-                       case OCLASS_TRIGGER:
                        case OCLASS_SCHEMA:
                        case OCLASS_TSPARSER:
                        case OCLASS_TSDICT: