>From 6183f96c14f63270fd1e724405dd046b8ef8c92a Mon Sep 17 00:00:00 2001 From: Abhijit Menon-Sen Date: Wed, 30 Apr 2014 17:30:07 +0530 Subject: [PATCH 16/30] deparse: Support CREATE CONVERSION --- src/backend/tcop/deparse_utility.c | 41 +++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/backend/tcop/deparse_utility.c b/src/backend/tcop/deparse_utility.c index 44fda78..f4c3e09 100644 --- a/src/backend/tcop/deparse_utility.c +++ b/src/backend/tcop/deparse_utility.c @@ -35,6 +35,7 @@ #include "catalog/pg_class.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" +#include "catalog/pg_conversion.h" #include "catalog/pg_depend.h" #include "catalog/pg_extension.h" #include "catalog/pg_inherits.h" @@ -52,6 +53,7 @@ #include "funcapi.h" #include "lib/ilist.h" #include "lib/stringinfo.h" +#include "mb/pg_wchar.h" #include "nodes/makefuncs.h" #include "nodes/parsenodes.h" #include "parser/analyze.h" @@ -2839,6 +2841,43 @@ deparse_AlterEnumStmt(Oid objectId, Node *parsetree) } static char * +deparse_CreateConversion(Oid objectId, Node *parsetree) +{ + HeapTuple conTup; + Form_pg_conversion conForm; + ObjTree *ccStmt; + char *command; + + conTup = SearchSysCache1(CONDEFAULT, ObjectIdGetDatum(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)); + + command = jsonize_objtree(ccStmt); + free_objtree(ccStmt); + + ReleaseSysCache(conTup); + + return command; +} + +static char * deparse_CreateOpFamily(Oid objectId, Node *parsetree) { HeapTuple opfTup; @@ -3394,7 +3433,7 @@ deparse_parsenode_cmd(StashedCommand *cmd) break; case T_CreateConversionStmt: - command = NULL; + command = deparse_CreateConversion(objectId, parsetree); break; case T_CreateCastStmt: -- 1.9.1