pgsql: Allow parallel workers to cope with a newly-created session user - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Allow parallel workers to cope with a newly-created session user
Date
Msg-id E1sZIDF-00269h-Gm@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Allow parallel workers to cope with a newly-created session user ID.

Parallel workers failed after a sequence like
        BEGIN;
        CREATE USER foo;
        SET SESSION AUTHORIZATION foo;
because check_session_authorization could not see the uncommitted
pg_authid row for "foo".  This is because we ran RestoreGUCState()
in a separate transaction using an ordinary just-created snapshot.
The same disease afflicts any other GUC that requires catalog lookups
and isn't forgiving about the lookups failing.

To fix, postpone RestoreGUCState() into the worker's main transaction
after we've set up a snapshot duplicating the leader's.  This affects
check_transaction_isolation and check_transaction_deferrable, which
think they should only run during transaction start.  Make them
act like check_transaction_read_only, which already knows it should
silently accept the value when InitializingParallelWorker.

Per bug #18545 from Andrey Rachitskiy.  Back-patch to all
supported branches, because this has been wrong for awhile.

Discussion: https://postgr.es/m/18545-feba138862f19aaa@postgresql.org

Branch
------
REL_16_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/849326e49a5dd56941eb8fb4699130c301bff303

Modified Files
--------------
src/backend/access/transam/parallel.c         | 12 ++++++++----
src/backend/commands/variable.c               | 10 ++++++++--
src/test/regress/expected/select_parallel.out | 18 ++++++++++++++++++
src/test/regress/sql/select_parallel.sql      |  9 +++++++++
4 files changed, 43 insertions(+), 6 deletions(-)


pgsql-committers by date:

Previous
From: Nathan Bossart
Date:
Subject: pgsql: Improve performance of dumpSequence().
Next
From: Jeff Davis
Date:
Subject: pgsql: Remove unused ParamListInfo argument from ExecRefreshMatView.