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

111 lines
2.6 KiB
C

#include "postgres.h"
#include "lib/stringinfo.h"
#include "nodes/parsenodes.h"
#include "distributed/deparser.h"
#include "distributed/citus_ruleutils.h"
/*
* Append the 'WITH GRANT OPTION' clause to the given buffer if the given
* statement is a 'GRANT' statement and the grant option is specified.
*/
void
AppendWithGrantOption(StringInfo buf, GrantStmt *stmt)
{
if (stmt->is_grant && stmt->grant_option)
{
appendStringInfo(buf, " WITH GRANT OPTION");
}
}
/*
* Append the 'GRANT OPTION FOR' clause to the given buffer if the given
* statement is a 'REVOKE' statement and the grant option is specified.
*/
void
AppendGrantOptionFor(StringInfo buf, GrantStmt *stmt)
{
if (!stmt->is_grant && stmt->grant_option)
{
appendStringInfo(buf, "GRANT OPTION FOR ");
}
}
/*
* Append the 'RESTRICT' or 'CASCADE' clause to the given buffer if the given
* statement is a 'REVOKE' statement and the behavior is specified.
*/
void
AppendGrantRestrictAndCascadeForRoleSpec(StringInfo buf, DropBehavior behavior, bool
isGrant)
{
if (!isGrant)
{
if (behavior == DROP_RESTRICT)
{
appendStringInfo(buf, " RESTRICT");
}
else if (behavior == DROP_CASCADE)
{
appendStringInfo(buf, " CASCADE");
}
}
}
/*
* Append the 'RESTRICT' or 'CASCADE' clause to the given buffer using 'GrantStmt',
* if the given statement is a 'REVOKE' statement and the behavior is specified.
*/
void
AppendGrantRestrictAndCascade(StringInfo buf, GrantStmt *stmt)
{
AppendGrantRestrictAndCascadeForRoleSpec(buf, stmt->behavior, stmt->is_grant);
}
/*
* Append the 'GRANTED BY' clause to the given buffer if the given statement is a
* 'GRANT' statement and the grantor is specified.
*/
void
AppendGrantedByInGrantForRoleSpec(StringInfo buf, RoleSpec *grantor, bool isGrant)
{
if (isGrant && grantor)
{
appendStringInfo(buf, " GRANTED BY %s", RoleSpecString(grantor, true));
}
}
/*
* Append the 'GRANTED BY' clause to the given buffer using 'GrantStmt',
* if the given statement is a 'GRANT' statement and the grantor is specified.
*/
void
AppendGrantedByInGrant(StringInfo buf, GrantStmt *stmt)
{
AppendGrantedByInGrantForRoleSpec(buf, stmt->grantor, stmt->is_grant);
}
void
AppendGrantSharedPrefix(StringInfo buf, GrantStmt *stmt)
{
appendStringInfo(buf, "%s ", stmt->is_grant ? "GRANT" : "REVOKE");
AppendGrantOptionFor(buf, stmt);
AppendGrantPrivileges(buf, stmt);
}
void
AppendGrantSharedSuffix(StringInfo buf, GrantStmt *stmt)
{
AppendGrantGrantees(buf, stmt);
AppendWithGrantOption(buf, stmt);
AppendGrantRestrictAndCascade(buf, stmt);
AppendGrantedByInGrant(buf, stmt);
appendStringInfo(buf, ";");
}