mirror of https://github.com/citusdata/citus.git
159 lines
3.6 KiB
C
159 lines
3.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* deparse_schema_stmts.c
|
|
* All routines to deparse schema 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 schema statements.
|
|
*
|
|
* Copyright (c) Citus Data, Inc.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include "distributed/citus_ruleutils.h"
|
|
#include "distributed/deparser.h"
|
|
#include "lib/stringinfo.h"
|
|
#include "nodes/nodes.h"
|
|
#include "utils/builtins.h"
|
|
|
|
static void AppendGrantOnSchemaStmt(StringInfo buf, GrantStmt *stmt);
|
|
static void AppendGrantOnSchemaPrivileges(StringInfo buf, GrantStmt *stmt);
|
|
static void AppendGrantOnSchemaSchemas(StringInfo buf, GrantStmt *stmt);
|
|
static void AppendGrantOnSchemaGrantees(StringInfo buf, GrantStmt *stmt);
|
|
static void AppendAlterSchemaRenameStmt(StringInfo buf, RenameStmt *stmt);
|
|
|
|
char *
|
|
DeparseGrantOnSchemaStmt(Node *node)
|
|
{
|
|
GrantStmt *stmt = castNode(GrantStmt, node);
|
|
Assert(stmt->objtype == OBJECT_SCHEMA);
|
|
|
|
StringInfoData str = { 0 };
|
|
initStringInfo(&str);
|
|
|
|
AppendGrantOnSchemaStmt(&str, stmt);
|
|
|
|
return str.data;
|
|
}
|
|
|
|
|
|
char *
|
|
DeparseAlterSchemaRenameStmt(Node *node)
|
|
{
|
|
RenameStmt *stmt = castNode(RenameStmt, node);
|
|
|
|
StringInfoData str = { 0 };
|
|
initStringInfo(&str);
|
|
|
|
AppendAlterSchemaRenameStmt(&str, stmt);
|
|
|
|
return str.data;
|
|
}
|
|
|
|
|
|
static void
|
|
AppendGrantOnSchemaStmt(StringInfo buf, GrantStmt *stmt)
|
|
{
|
|
Assert(stmt->objtype == OBJECT_SCHEMA);
|
|
|
|
appendStringInfo(buf, "%s ", stmt->is_grant ? "GRANT" : "REVOKE");
|
|
|
|
if (!stmt->is_grant && stmt->grant_option)
|
|
{
|
|
appendStringInfo(buf, "GRANT OPTION FOR ");
|
|
}
|
|
|
|
AppendGrantOnSchemaPrivileges(buf, stmt);
|
|
|
|
AppendGrantOnSchemaSchemas(buf, stmt);
|
|
|
|
AppendGrantOnSchemaGrantees(buf, stmt);
|
|
|
|
if (stmt->is_grant && stmt->grant_option)
|
|
{
|
|
appendStringInfo(buf, " WITH GRANT OPTION");
|
|
}
|
|
if (!stmt->is_grant)
|
|
{
|
|
if (stmt->behavior == DROP_RESTRICT)
|
|
{
|
|
appendStringInfo(buf, " RESTRICT");
|
|
}
|
|
else if (stmt->behavior == DROP_CASCADE)
|
|
{
|
|
appendStringInfo(buf, " CASCADE");
|
|
}
|
|
}
|
|
appendStringInfo(buf, ";");
|
|
}
|
|
|
|
|
|
static void
|
|
AppendGrantOnSchemaPrivileges(StringInfo buf, GrantStmt *stmt)
|
|
{
|
|
if (list_length(stmt->privileges) == 0)
|
|
{
|
|
appendStringInfo(buf, "ALL PRIVILEGES");
|
|
}
|
|
else
|
|
{
|
|
ListCell *cell = NULL;
|
|
foreach(cell, stmt->privileges)
|
|
{
|
|
AccessPriv *privilege = (AccessPriv *) lfirst(cell);
|
|
appendStringInfoString(buf, privilege->priv_name);
|
|
if (cell != list_tail(stmt->privileges))
|
|
{
|
|
appendStringInfo(buf, ", ");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
AppendGrantOnSchemaSchemas(StringInfo buf, GrantStmt *stmt)
|
|
{
|
|
ListCell *cell = NULL;
|
|
appendStringInfo(buf, " ON SCHEMA ");
|
|
|
|
foreach(cell, stmt->objects)
|
|
{
|
|
char *schema = strVal(lfirst(cell));
|
|
appendStringInfoString(buf, quote_identifier(schema));
|
|
if (cell != list_tail(stmt->objects))
|
|
{
|
|
appendStringInfo(buf, ", ");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
AppendGrantOnSchemaGrantees(StringInfo buf, GrantStmt *stmt)
|
|
{
|
|
ListCell *cell = NULL;
|
|
appendStringInfo(buf, " %s ", stmt->is_grant ? "TO" : "FROM");
|
|
|
|
foreach(cell, stmt->grantees)
|
|
{
|
|
RoleSpec *grantee = (RoleSpec *) lfirst(cell);
|
|
appendStringInfoString(buf, RoleSpecString(grantee, true));
|
|
if (cell != list_tail(stmt->grantees))
|
|
{
|
|
appendStringInfo(buf, ", ");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
AppendAlterSchemaRenameStmt(StringInfo buf, RenameStmt *stmt)
|
|
{
|
|
Assert(stmt->renameType == OBJECT_SCHEMA);
|
|
|
|
appendStringInfo(buf, "ALTER SCHEMA %s RENAME TO %s;",
|
|
quote_identifier(stmt->subname), quote_identifier(stmt->newname));
|
|
}
|