deparse: support ALTER TYPE / ADD VALUE (for enums)
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 21 Mar 2014 19:33:14 +0000 (16:33 -0300)
committerAndres Freund <andres@anarazel.de>
Fri, 5 Sep 2014 20:09:14 +0000 (22:09 +0200)
src/backend/tcop/deparse_utility.c
src/backend/tcop/utility.c

index 677e7dc32b77317570838f97b65ec1037450f253..691c78a851555ab776fdfed71e9a9529f7e5d651 100644 (file)
@@ -2165,6 +2165,43 @@ deparse_CreateSchemaStmt(Oid objectId, Node *parsetree)
    return command;
 }
 
+static char *
+deparse_AlterEnumStmt(Oid objectId, Node *parsetree)
+{
+   AlterEnumStmt *node = (AlterEnumStmt *) parsetree;
+   ObjTree    *alterEnum;
+   ObjTree    *tmp;
+   char       *command;
+
+   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);
+
+   command = jsonize_objtree(alterEnum);
+   free_objtree(alterEnum);
+
+   return command;
+}
+
 static char *
 deparse_parsenode_cmd(StashedCommand *cmd)
 {
@@ -2263,6 +2300,14 @@ deparse_parsenode_cmd(StashedCommand *cmd)
            command = NULL;
            break;
 
+       case T_AlterTableStmt:
+           command = NULL;
+           break;
+
+       case T_AlterEnumStmt:
+           command = deparse_AlterEnumStmt(objectId, parsetree);
+           break;
+
        default:
            command = NULL;
            elog(LOG, "unrecognized node type: %d",
index 452066e8e93aa10ab943f8c1e9b6181ed8db81e2..f64fc1867d218ba3d30eb2e4274da9a497897ef5 100644 (file)
@@ -1248,7 +1248,8 @@ ProcessUtilitySlow(Node *parsetree,
                break;
 
            case T_AlterEnumStmt:       /* ALTER TYPE (enum) */
-               AlterEnum((AlterEnumStmt *) parsetree, isTopLevel);
+               objectId = AlterEnum((AlterEnumStmt *) parsetree, isTopLevel);
+               EventTriggerStashCommand(objectId, OBJECT_TYPE, parsetree);
                break;
 
            case T_ViewStmt:    /* CREATE VIEW */