in ext/pg_query/pg_query_deparse.c [6846:6930]
static void deparseDefineStmt(StringInfo str, DefineStmt *define_stmt)
{
ListCell *lc;
appendStringInfoString(str, "CREATE ");
if (define_stmt->replace)
appendStringInfoString(str, "OR REPLACE ");
switch (define_stmt->kind)
{
case OBJECT_AGGREGATE:
appendStringInfoString(str, "AGGREGATE ");
break;
case OBJECT_OPERATOR:
appendStringInfoString(str, "OPERATOR ");
break;
case OBJECT_TYPE:
appendStringInfoString(str, "TYPE ");
break;
case OBJECT_TSPARSER:
appendStringInfoString(str, "TEXT SEARCH PARSER ");
break;
case OBJECT_TSDICTIONARY:
appendStringInfoString(str, "TEXT SEARCH DICTIONARY ");
break;
case OBJECT_TSTEMPLATE:
appendStringInfoString(str, "TEXT SEARCH TEMPLATE ");
break;
case OBJECT_TSCONFIGURATION:
appendStringInfoString(str, "TEXT SEARCH CONFIGURATION ");
break;
case OBJECT_COLLATION:
appendStringInfoString(str, "COLLATION ");
break;
default:
// This shouldn't happen
Assert(false);
break;
}
if (define_stmt->if_not_exists)
appendStringInfoString(str, "IF NOT EXISTS ");
switch (define_stmt->kind)
{
case OBJECT_AGGREGATE:
deparseFuncName(str, define_stmt->defnames);
break;
case OBJECT_OPERATOR:
deparseAnyOperator(str, define_stmt->defnames);
break;
case OBJECT_TYPE:
case OBJECT_TSPARSER:
case OBJECT_TSDICTIONARY:
case OBJECT_TSTEMPLATE:
case OBJECT_TSCONFIGURATION:
case OBJECT_COLLATION:
deparseAnyName(str, define_stmt->defnames);
break;
default:
Assert(false);
}
appendStringInfoChar(str, ' ');
if (!define_stmt->oldstyle && define_stmt->kind == OBJECT_AGGREGATE)
{
deparseAggrArgs(str, define_stmt->args);
appendStringInfoChar(str, ' ');
}
if (define_stmt->kind == OBJECT_COLLATION &&
list_length(define_stmt->definition) == 1 &&
strcmp(castNode(DefElem, linitial(define_stmt->definition))->defname, "from") == 0)
{
appendStringInfoString(str, "FROM ");
deparseAnyName(str, castNode(List, castNode(DefElem, linitial(define_stmt->definition))->arg));
}
else if (list_length(define_stmt->definition) > 0)
{
deparseDefinition(str, define_stmt->definition);
}
removeTrailingSpace(str);
}