Rework ReplicateGrantStmt to use new flow

This was the impetus for the previous commit that changed from using a
DDLJob * to a List * of them.
pull/1278/head
Jason Petersen 2017-03-15 19:07:26 -06:00
parent 23f5e4282d
commit d95b5bbad3
No known key found for this signature in database
GPG Key ID: 9F1D3510D110ABA9
2 changed files with 13 additions and 9 deletions

View File

@ -382,6 +382,7 @@ multi_ProcessUtility(Node *parsetree,
foreach(ddlJobCell, ddlJobs)
{
DDLJob *ddlJob = (DDLJob *) lfirst(ddlJobCell);
ExecuteDistributedDDLJob(ddlJob);
}
}
@ -2362,15 +2363,14 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
/*
* ReplicateGrantStmt replicates GRANT/REVOKE command to worker nodes if the
* PlanGrantStmt replicates GRANT/REVOKE command to worker nodes if the
* the statement affects distributed tables.
*
* NB: So far column level privileges are not supported.
*/
void
ReplicateGrantStmt(Node *parsetree)
List *
PlanGrantStmt(GrantStmt *grantStmt)
{
GrantStmt *grantStmt = (GrantStmt *) parsetree;
StringInfoData privsString;
StringInfoData granteesString;
StringInfoData targetString;
@ -2378,7 +2378,7 @@ ReplicateGrantStmt(Node *parsetree)
ListCell *granteeCell = NULL;
ListCell *objectCell = NULL;
bool isFirst = true;
DDLJob *ddlJob = palloc(sizeof(DDLJob));
List *ddlJobs = NIL;
initStringInfo(&privsString);
initStringInfo(&granteesString);
@ -2392,7 +2392,7 @@ ReplicateGrantStmt(Node *parsetree)
if (grantStmt->targtype != ACL_TARGET_OBJECT ||
grantStmt->objtype != ACL_OBJECT_RELATION)
{
return;
return NIL;
}
/* deparse the privileges */
@ -2463,6 +2463,7 @@ ReplicateGrantStmt(Node *parsetree)
RangeVar *relvar = (RangeVar *) lfirst(objectCell);
Oid relOid = RangeVarGetRelid(relvar, NoLock, false);
const char *grantOption = "";
DDLJob *ddlJob = NULL;
if (!IsDistributedTable(relOid))
{
@ -2495,12 +2496,15 @@ ReplicateGrantStmt(Node *parsetree)
granteesString.data);
}
ddlJob = palloc0(sizeof(DDLJob));
ddlJob->targetRelationId = relOid;
ddlJob->commandString = ddlString.data;
ddlJob->commandString = pstrdup(ddlString.data);
ddlJob->taskList = DDLTaskList(relOid, ddlString.data);
ExecuteDistributedDDLJob(ddlJob);
ddlJobs = lappend(ddlJobs, ddlJob);
resetStringInfo(&ddlString);
}
return ddlJobs;
}

View File

@ -24,7 +24,7 @@ typedef struct DDLJob
extern void multi_ProcessUtility(Node *parsetree, const char *queryString,
ProcessUtilityContext context, ParamListInfo params,
DestReceiver *dest, char *completionTag);
extern void ReplicateGrantStmt(Node *parsetree);
extern List * PlanGrantStmt(GrantStmt *grantStmt);
#endif /* MULTI_UTILITY_H */