mirror of https://github.com/citusdata/citus.git
182 lines
4.3 KiB
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));
|
|
}
|
|
}
|