/* Is there a parallel message pending which we need to receive? */
bool ParallelMessagePending = false;
+/* Are we initializing a parallel worker? */
+bool InitializingParallelWorker = false;
+
/* Pointer to our fixed parallel state. */
static FixedParallelState *MyFixedParallelState;
char *tstatespace;
StringInfoData msgbuf;
+ /* Set flag to indicate that we're initializing a parallel worker. */
+ InitializingParallelWorker = true;
+
/* Establish signal handlers. */
pqsignal(SIGTERM, die);
BackgroundWorkerUnblockSignals();
* We've initialized all of our state now; nothing should change
* hereafter.
*/
+ InitializingParallelWorker = false;
EnterParallelMode();
/*
#include <ctype.h>
#include "access/htup_details.h"
+#include "access/parallel.h"
#include "access/xact.h"
#include "access/xlog.h"
#include "catalog/pg_authid.h"
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_errmsg("permission denied to set role \"%s\"",
extern bool ParallelMessagePending;
extern int ParallelWorkerNumber;
+extern bool InitializingParallelWorker;
#define IsParallelWorker() (ParallelWorkerNumber >= 0)