deparse: Support ALTER TYPE / ADD VALUE (enums)
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 21 Mar 2014 19:33:14 +0000 (16:33 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 7 Apr 2015 17:09:37 +0000 (14:09 -0300)
src/backend/tcop/deparse_utility.c

index b896fa4b658a1fc60da8afb65f15b3005e57eac0..4828cb1949bbb3f9a9428405c60202454c938b8a 100644 (file)
@@ -2325,6 +2325,39 @@ deparse_CreateSchemaStmt(Oid objectId, Node *parsetree)
    return createSchema;
 }
 
+static ObjTree *
+deparse_AlterEnumStmt(Oid objectId, Node *parsetree)
+{
+   AlterEnumStmt *node = (AlterEnumStmt *) parsetree;
+   ObjTree    *alterEnum;
+   ObjTree    *tmp;
+
+   alterEnum =
+       new_objtree_VA("ALTER TYPE %{identity}D ADD VALUE %{if_not_exists}s %{value}L %{position}s",
+                      0);
+
+   append_string_object(alterEnum, "if_not_exists",
+                        node->skipIfExists ? "IF NOT EXISTS" : "");
+   append_object_object(alterEnum, "identity",
+                        new_objtree_for_qualname_id(TypeRelationId,
+                                                    objectId));
+   append_string_object(alterEnum, "value", node->newVal);
+   tmp = new_objtree_VA("%{after_or_before}s %{neighbour}L", 0);
+   if (node->newValNeighbor)
+   {
+       append_string_object(tmp, "after_or_before",
+                            node->newValIsAfter ? "AFTER" : "BEFORE");
+       append_string_object(tmp, "neighbour", node->newValNeighbor);
+   }
+   else
+   {
+       append_bool_object(tmp, "present", false);
+   }
+   append_object_object(alterEnum, "position", tmp);
+
+   return alterEnum;
+}
+
 /*
  * Handle deparsing of simple commands.
  *
@@ -2437,7 +2470,7 @@ deparse_simple_command(StashedCommand *cmd)
            break;
 
        case T_AlterEnumStmt:
-           elog(ERROR, "unimplemented deparse of %s", CreateCommandTag(parsetree));
+           command = deparse_AlterEnumStmt(objectId, parsetree);
            break;
 
        case T_ViewStmt:        /* CREATE VIEW */