Commit 82b37765 authored by Robert Haas's avatar Robert Haas

Fix a problem with parallel workers being unable to restore role.

check_role() tries to verify that the user has permission to become the
requested role, but this is inappropriate in a parallel worker, which
needs to exactly recreate the master's authorization settings.  So skip
the check in that case.

This fixes a bug in commit 924bcf4f.
parent 6de6d96d
...@@ -96,6 +96,9 @@ int ParallelWorkerNumber = -1; ...@@ -96,6 +96,9 @@ int ParallelWorkerNumber = -1;
/* Is there a parallel message pending which we need to receive? */ /* Is there a parallel message pending which we need to receive? */
bool ParallelMessagePending = false; bool ParallelMessagePending = false;
/* Are we initializing a parallel worker? */
bool InitializingParallelWorker = false;
/* Pointer to our fixed parallel state. */ /* Pointer to our fixed parallel state. */
static FixedParallelState *MyFixedParallelState; static FixedParallelState *MyFixedParallelState;
...@@ -815,6 +818,9 @@ ParallelWorkerMain(Datum main_arg) ...@@ -815,6 +818,9 @@ ParallelWorkerMain(Datum main_arg)
char *tstatespace; char *tstatespace;
StringInfoData msgbuf; StringInfoData msgbuf;
/* Set flag to indicate that we're initializing a parallel worker. */
InitializingParallelWorker = true;
/* Establish signal handlers. */ /* Establish signal handlers. */
pqsignal(SIGTERM, die); pqsignal(SIGTERM, die);
BackgroundWorkerUnblockSignals(); BackgroundWorkerUnblockSignals();
...@@ -942,6 +948,7 @@ ParallelWorkerMain(Datum main_arg) ...@@ -942,6 +948,7 @@ ParallelWorkerMain(Datum main_arg)
* We've initialized all of our state now; nothing should change * We've initialized all of our state now; nothing should change
* hereafter. * hereafter.
*/ */
InitializingParallelWorker = false;
EnterParallelMode(); EnterParallelMode();
/* /*
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <ctype.h> #include <ctype.h>
#include "access/htup_details.h" #include "access/htup_details.h"
#include "access/parallel.h"
#include "access/xact.h" #include "access/xact.h"
#include "access/xlog.h" #include "access/xlog.h"
#include "catalog/pg_authid.h" #include "catalog/pg_authid.h"
...@@ -877,9 +878,12 @@ check_role(char **newval, void **extra, GucSource source) ...@@ -877,9 +878,12 @@ check_role(char **newval, void **extra, GucSource source)
ReleaseSysCache(roleTup); ReleaseSysCache(roleTup);
/* /*
* Verify that session user is allowed to become this role * Verify that session user is allowed to become this role, but
* skip this in parallel mode, where we must blindly recreate the
* parallel leader's state.
*/ */
if (!is_member_of_role(GetSessionUserId(), roleid)) if (!InitializingParallelWorker &&
!is_member_of_role(GetSessionUserId(), roleid))
{ {
GUC_check_errcode(ERRCODE_INSUFFICIENT_PRIVILEGE); GUC_check_errcode(ERRCODE_INSUFFICIENT_PRIVILEGE);
GUC_check_errmsg("permission denied to set role \"%s\"", GUC_check_errmsg("permission denied to set role \"%s\"",
......
...@@ -48,6 +48,7 @@ typedef struct ParallelContext ...@@ -48,6 +48,7 @@ typedef struct ParallelContext
extern bool ParallelMessagePending; extern bool ParallelMessagePending;
extern int ParallelWorkerNumber; extern int ParallelWorkerNumber;
extern bool InitializingParallelWorker;
#define IsParallelWorker() (ParallelWorkerNumber >= 0) #define IsParallelWorker() (ParallelWorkerNumber >= 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment