diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/parallel.c | 12 | ||||
-rw-r--r-- | src/backend/commands/variable.c | 10 | ||||
-rw-r--r-- | src/test/regress/expected/select_parallel.out | 18 | ||||
-rw-r--r-- | src/test/regress/sql/select_parallel.sql | 9 |
4 files changed, 43 insertions, 6 deletions
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index df0cd775588..d5bee10cd4b 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -1402,10 +1402,6 @@ ParallelWorkerMain(Datum main_arg) libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false); StartTransactionCommand(); RestoreLibraryState(libraryspace); - - /* Restore GUC values from launching backend. */ - gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false); - RestoreGUCState(gucspace); CommitTransactionCommand(); /* Crank up a transaction state appropriate to a parallel worker. */ @@ -1448,6 +1444,14 @@ ParallelWorkerMain(Datum main_arg) InvalidateSystemCaches(); /* + * Restore GUC values from launching backend. We can't do this earlier, + * because GUC check hooks that do catalog lookups need to see the same + * database state as the leader. + */ + gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false); + RestoreGUCState(gucspace); + + /* * Restore current role id. Skip verifying whether session user is * allowed to become this role and blindly restore the leader's state for * current role. diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index e5ddcda0b4a..b2336ad7efd 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -519,14 +519,16 @@ check_transaction_read_only(bool *newval, void **extra, GucSource source) * We allow idempotent changes at any time, but otherwise this can only be * changed in a toplevel transaction that has not yet taken a snapshot. * - * As in check_transaction_read_only, allow it if not inside a transaction. + * As in check_transaction_read_only, allow it if not inside a transaction, + * or if restoring state in a parallel worker. */ bool check_XactIsoLevel(int *newval, void **extra, GucSource source) { int newXactIsoLevel = *newval; - if (newXactIsoLevel != XactIsoLevel && IsTransactionState()) + if (newXactIsoLevel != XactIsoLevel && + IsTransactionState() && !InitializingParallelWorker) { if (FirstSnapshotSet) { @@ -561,6 +563,10 @@ check_XactIsoLevel(int *newval, void **extra, GucSource source) bool check_transaction_deferrable(bool *newval, void **extra, GucSource source) { + /* Just accept the value when restoring state in a parallel worker */ + if (InitializingParallelWorker) + return true; + if (IsSubTransaction()) { GUC_check_errcode(ERRCODE_ACTIVE_SQL_TRANSACTION); diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.out index 91f74fe47a3..3c6887fcb97 100644 --- a/src/test/regress/expected/select_parallel.out +++ b/src/test/regress/expected/select_parallel.out @@ -1219,3 +1219,21 @@ SELECT 1 FROM tenk1_vw_sec (9 rows) rollback; +-- test that a newly-created session role propagates to workers. +begin; +create role regress_parallel_worker; +set session authorization regress_parallel_worker; +select current_setting('session_authorization'); + current_setting +------------------------- + regress_parallel_worker +(1 row) + +set force_parallel_mode = 1; +select current_setting('session_authorization'); + current_setting +------------------------- + regress_parallel_worker +(1 row) + +rollback; diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql index 62fb68c7a04..11d861584ef 100644 --- a/src/test/regress/sql/select_parallel.sql +++ b/src/test/regress/sql/select_parallel.sql @@ -462,3 +462,12 @@ SELECT 1 FROM tenk1_vw_sec WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100; rollback; + +-- test that a newly-created session role propagates to workers. +begin; +create role regress_parallel_worker; +set session authorization regress_parallel_worker; +select current_setting('session_authorization'); +set force_parallel_mode = 1; +select current_setting('session_authorization'); +rollback; |