deparse: Support CREATE CONVERSION
authorAbhijit Menon-Sen <ams@2ndQuadrant.com>
Wed, 30 Apr 2014 12:00:07 +0000 (17:30 +0530)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 7 Apr 2015 17:09:38 +0000 (14:09 -0300)
src/backend/tcop/deparse_utility.c

index 07daf08dfcabfc8f971d13e3232021d68aad8f93..3439d15f995315180a4ec943e2cc15e3d27779e3 100644 (file)
@@ -3534,6 +3534,41 @@ deparse_AlterEnumStmt(Oid objectId, Node *parsetree)
    return alterEnum;
 }
 
+static ObjTree *
+deparse_CreateConversion(Oid objectId, Node *parsetree)
+{
+   HeapTuple   conTup;
+   Relation    convrel;
+   Form_pg_conversion conForm;
+   ObjTree    *ccStmt;
+
+   convrel = heap_open(ConversionRelationId, AccessShareLock);
+   conTup = get_catalog_object_by_oid(convrel, objectId);
+   if (!HeapTupleIsValid(conTup))
+       elog(ERROR, "cache lookup failed for conversion with OID %u", objectId);
+   conForm = (Form_pg_conversion) GETSTRUCT(conTup);
+
+   ccStmt = new_objtree_VA("CREATE %{default}s CONVERSION %{identity}D FOR "
+                           "%{source}L TO %{dest}L FROM %{function}D", 0);
+
+   append_string_object(ccStmt, "default",
+                        conForm->condefault ? "DEFAULT" : "");
+   append_object_object(ccStmt, "identity",
+                        new_objtree_for_qualname(conForm->connamespace,
+                                                 NameStr(conForm->conname)));
+   append_string_object(ccStmt, "source", (char *)
+                        pg_encoding_to_char(conForm->conforencoding));
+   append_string_object(ccStmt, "dest", (char *)
+                        pg_encoding_to_char(conForm->contoencoding));
+   append_object_object(ccStmt, "function",
+                        new_objtree_for_qualname_id(ProcedureRelationId,
+                                                    conForm->conproc));
+
+   heap_close(convrel, AccessShareLock);
+
+   return ccStmt;
+}
+
 static ObjTree *
 deparse_CreateOpFamily(Oid objectId, Node *parsetree)
 {
@@ -4292,7 +4327,7 @@ deparse_simple_command(StashedCommand *cmd)
            break;
 
        case T_CreateConversionStmt:
-           elog(ERROR, "unimplemented deparse of %s", CreateCommandTag(parsetree));
+           command = deparse_CreateConversion(objectId, parsetree);
            break;
 
        case T_CreateCastStmt: