citus/src/backend/distributed/deparser/deparse_collation_stmts.c

182 lines
4.3 KiB
C

/*-------------------------------------------------------------------------
*
* deparse_collation_stmts.c
* All routines to deparse collation statements.
* This file contains all entry points specific for type statement deparsing as well as
* functions that are currently only used for deparsing of the type statements.
*
* Copyright (c) Citus Data, Inc.
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "catalog/namespace.h"
#include "lib/stringinfo.h"
#include "nodes/value.h"
#include "utils/builtins.h"
#include "distributed/deparser.h"
#include "distributed/citus_ruleutils.h"
static void AppendDropCollationStmt(StringInfo buf, DropStmt *stmt);
static void AppendRenameCollationStmt(StringInfo buf, RenameStmt *stmt);
static void AppendAlterCollationSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt);
static void AppendAlterCollationOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt);
static void AppendNameList(StringInfo buf, List *objects);
/*
* DeparseDropCollationStmt builds and returns a string representing the DropStmt
*/
char *
DeparseDropCollationStmt(Node *node)
{
DropStmt *stmt = castNode(DropStmt, node);
StringInfoData str = { 0 };
initStringInfo(&str);
Assert(stmt->removeType == OBJECT_COLLATION);
AppendDropCollationStmt(&str, stmt);
return str.data;
}
/*
* AppendDropCollationStmt appends a string representing the DropStmt to a buffer
*/
static void
AppendDropCollationStmt(StringInfo buf, DropStmt *stmt)
{
appendStringInfoString(buf, "DROP COLLATION ");
if (stmt->missing_ok)
{
appendStringInfoString(buf, "IF EXISTS ");
}
AppendNameList(buf, stmt->objects);
if (stmt->behavior == DROP_CASCADE)
{
appendStringInfoString(buf, " CASCADE");
}
}
/*
* DeparseRenameCollationStmt builds and returns a string representing the RenameStmt
*/
char *
DeparseRenameCollationStmt(Node *node)
{
RenameStmt *stmt = castNode(RenameStmt, node);
StringInfoData str = { 0 };
initStringInfo(&str);
Assert(stmt->renameType == OBJECT_COLLATION);
AppendRenameCollationStmt(&str, stmt);
return str.data;
}
/*
* AppendRenameCollationStmt appends a string representing the RenameStmt to a buffer
*/
static void
AppendRenameCollationStmt(StringInfo buf, RenameStmt *stmt)
{
List *names = (List *) stmt->object;
appendStringInfo(buf, "ALTER COLLATION %s RENAME TO %s;",
NameListToQuotedString(names),
quote_identifier(stmt->newname));
}
/*
* DeparseAlterCollationSchemaStmt builds and returns a string representing the AlterObjectSchemaStmt
*/
char *
DeparseAlterCollationSchemaStmt(Node *node)
{
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node);
StringInfoData str = { 0 };
initStringInfo(&str);
Assert(stmt->objectType == OBJECT_COLLATION);
AppendAlterCollationSchemaStmt(&str, stmt);
return str.data;
}
/*
* AppendAlterCollationSchemaStmt appends a string representing the AlterObjectSchemaStmt to a buffer
*/
static void
AppendAlterCollationSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt)
{
Assert(stmt->objectType == OBJECT_COLLATION);
List *names = (List *) stmt->object;
appendStringInfo(buf, "ALTER COLLATION %s SET SCHEMA %s;", NameListToQuotedString(
names),
quote_identifier(stmt->newschema));
}
/*
* DeparseAlterCollationOwnerStmt builds and returns a string representing the AlterOwnerStmt
*/
char *
DeparseAlterCollationOwnerStmt(Node *node)
{
AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node);
StringInfoData str = { 0 };
initStringInfo(&str);
Assert(stmt->objectType == OBJECT_COLLATION);
AppendAlterCollationOwnerStmt(&str, stmt);
return str.data;
}
/*
* AppendAlterCollationOwnerStmt appends a string representing the AlterOwnerStmt to a buffer
*/
static void
AppendAlterCollationOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt)
{
Assert(stmt->objectType == OBJECT_COLLATION);
List *names = (List *) stmt->object;
appendStringInfo(buf, "ALTER COLLATION %s OWNER TO %s;", NameListToQuotedString(
names),
RoleSpecString(stmt->newowner, true));
}
static void
AppendNameList(StringInfo buf, List *objects)
{
ListCell *objectCell = NULL;
foreach(objectCell, objects)
{
List *name = castNode(List, lfirst(objectCell));
if (objectCell != list_head(objects))
{
appendStringInfo(buf, ", ");
}
appendStringInfoString(buf, NameListToQuotedString(name));
}
}