*
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.332 2010/07/06 19:18:56 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.333 2010/07/23 20:04:18 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
                 Node *options, bool isReset);
 static void ATExecSetStorage(Relation rel, const char *colName,
                 Node *newValue);
+static void ATPrepDropColumn(Relation rel, bool recurse, AlterTableCmd *cmd);
 static void ATExecDropColumn(List **wqueue, Relation rel, const char *colName,
                 DropBehavior behavior,
                 bool recurse, bool recursing,
                           char fires_when, bool skip_system);
 static void ATExecEnableDisableRule(Relation rel, char *rulename,
                        char fires_when);
-static void ATExecAddInherit(Relation rel, RangeVar *parent);
+static void ATPrepAddInherit(Relation child_rel);
+static void ATExecAddInherit(Relation child_rel, RangeVar *parent);
 static void ATExecDropInherit(Relation rel, RangeVar *parent);
 static void copy_relation_data(SMgrRelation rel, SMgrRelation dst,
                   ForkNumber forkNum, bool istemp);
            break;
        case AT_DropColumn:     /* DROP COLUMN */
            ATSimplePermissions(rel, false);
+           ATPrepDropColumn(rel, recurse, cmd);
            /* Recursion occurs during execution phase */
-           /* No command-specific prep needed except saving recurse flag */
-           if (recurse)
-               cmd->subtype = AT_DropColumnRecurse;
            pass = AT_PASS_DROP;
            break;
        case AT_AddIndex:       /* ADD INDEX */
            /* No command-specific prep needed */
            pass = AT_PASS_MISC;
            break;
+       case AT_AddInherit:     /* INHERIT */
+           ATSimplePermissions(rel, false);
+           /* This command never recurses */
+           ATPrepAddInherit(rel);
+           pass = AT_PASS_MISC;
+           break;
        case AT_EnableTrig:     /* ENABLE TRIGGER variants */
        case AT_EnableAlwaysTrig:
        case AT_EnableReplicaTrig:
        case AT_EnableAlwaysRule:
        case AT_EnableReplicaRule:
        case AT_DisableRule:
-       case AT_AddInherit:     /* INHERIT / NO INHERIT */
-       case AT_DropInherit:
+       case AT_DropInherit:    /* NO INHERIT */
            ATSimplePermissions(rel, false);
            /* These commands never recurse */
            /* No command-specific prep needed */
 ATPrepAddColumn(List **wqueue, Relation rel, bool recurse,
                AlterTableCmd *cmd)
 {
+   if (rel->rd_rel->reloftype)
+       ereport(ERROR,
+               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                errmsg("cannot add column to typed table")));
+
    /*
     * Recurse to add the column to child classes, if requested.
     *
    Form_pg_type tform;
    Expr       *defval;
 
-   if (rel->rd_rel->reloftype)
-       ereport(ERROR,
-               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                errmsg("cannot add column to typed table")));
-
    attrdesc = heap_open(AttributeRelationId, RowExclusiveLock);
 
    /*
  * static pre-pass because it won't handle multiple inheritance situations
  * correctly.)
  */
+static void
+ATPrepDropColumn(Relation rel, bool recurse, AlterTableCmd *cmd)
+{
+   if (rel->rd_rel->reloftype)
+       ereport(ERROR,
+               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                errmsg("cannot drop column from typed table")));
+
+   /* No command-specific prep needed except saving recurse flag */
+   if (recurse)
+       cmd->subtype = AT_DropColumnRecurse;
+}
+
 static void
 ATExecDropColumn(List **wqueue, Relation rel, const char *colName,
                 DropBehavior behavior,
    List       *children;
    ObjectAddress object;
 
-   if (rel->rd_rel->reloftype)
-       ereport(ERROR,
-               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                errmsg("cannot drop column from typed table")));
-
    /* At top level, permission check was done in ATPrepCmd, else do it */
    if (recursing)
        ATSimplePermissions(rel, false);
    NewColumnValue *newval;
    ParseState *pstate = make_parsestate(NULL);
 
+   if (rel->rd_rel->reloftype)
+       ereport(ERROR,
+               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                errmsg("cannot alter column type of typed table")));
+
    /* lookup the attribute so we can check inheritance status */
    tuple = SearchSysCacheAttName(RelationGetRelid(rel), colName);
    if (!HeapTupleIsValid(tuple))
  * check constraints of the parent appear in the child and that they have the
  * same data types and expressions.
  */
+static void
+ATPrepAddInherit(Relation child_rel)
+{
+   if (child_rel->rd_rel->reloftype)
+       ereport(ERROR,
+               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                errmsg("cannot change inheritance of typed table")));
+}
+
 static void
 ATExecAddInherit(Relation child_rel, RangeVar *parent)
 {