This reverts commit 
f5f30c22ed69fb37b896c4d4546b2ab823c3fd61.
Some buildfarm animals are failing with "cannot change
"client_encoding" during a parallel operation".  It looks like
assign_client_encoding is unhappy at being asked to roll back a
client_encoding setting after a parallel worker encounters a
failure.  There must be more to it though: why didn't I see this
during local testing?  In any case, it's clear that moving the
RestoreGUCState() call is not as side-effect-free as I thought.
Given that the bug 
f5f30c22e intended to fix has gone unreported
for years, it's not something that's urgent to fix; I'm not
willing to risk messing with it further with only days to our
next release wrap.
 
        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. */
         */
        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
 
  * 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,
- * or if restoring state in a parallel worker.
+ * As in check_transaction_read_only, allow it if not inside a transaction.
  */
 bool
 check_transaction_isolation(int *newval, void **extra, GucSource source)
 {
        int                     newXactIsoLevel = *newval;
 
-       if (newXactIsoLevel != XactIsoLevel &&
-               IsTransactionState() && !InitializingParallelWorker)
+       if (newXactIsoLevel != XactIsoLevel && IsTransactionState())
        {
                if (FirstSnapshotSet)
                {
 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);
 
 (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 debug_parallel_query = 1;
-select current_setting('session_authorization');
-     current_setting     
--------------------------
- regress_parallel_worker
-(1 row)
-
-rollback;
 
   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 debug_parallel_query = 1;
-select current_setting('session_authorization');
-rollback;