Thread: pgsql: Fix several mistakes around parallel workers and client_encoding

pgsql: Fix several mistakes around parallel workers and client_encoding

From
Robert Haas
Date:
Fix several mistakes around parallel workers and client_encoding.

Previously, workers sent data to the leader using the client encoding.
That mostly worked, but the leader the converted the data back to the
server encoding.  Since not all encoding conversions are reversible,
that could provoke failures.  Fix by using the database encoding for
all communication between worker and leader.

Also, while temporary changes to GUC settings, as from the SET clause
of a function, are in general OK for parallel query, changing
client_encoding this way inside of a parallel worker is not OK.
Previously, that would have confused the leader; with these changes,
it would not confuse the leader, but it wouldn't do anything either.
So refuse such changes in parallel workers.

Also, the previous code naively assumed that when it received a
NotifyResonse from the worker, it could pass that directly back to the
user.  But now that worker-to-leader communication always uses the
database encoding, that's clearly no longer correct - though,
actually, the old way was always broken for V2 clients.  So
disassemble and reconstitute the message instead.

Issues reported by Peter Eisentraut.  Patch by me, reviewed by
Peter Eisentraut.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/10c0558ffefcd12bf1d3dc35587eba41d1ce4571

Modified Files
--------------
src/backend/access/transam/parallel.c | 18 +++++++++++++++++-
src/backend/commands/async.c          |  5 +----
src/backend/commands/variable.c       | 24 ++++++++++++++++++++++++
src/backend/libpq/pqformat.c          | 30 ++++++++++++++++++++++++++++++
src/backend/libpq/pqmq.c              |  2 +-
src/include/commands/async.h          |  4 ++++
src/include/libpq/pqformat.h          |  1 +
7 files changed, 78 insertions(+), 6 deletions(-)


Actually, a significant part of this was derived from Peter's patch. I should have credited him as a co-author as well
asa reviewer. I apologize for the oversight. 

...Robert

> On Jun 30, 2016, at 6:46 PM, Robert Haas <rhaas@postgresql.org> wrote:
>
> Fix several mistakes around parallel workers and client_encoding.
>
> Previously, workers sent data to the leader using the client encoding.
> That mostly worked, but the leader the converted the data back to the
> server encoding.  Since not all encoding conversions are reversible,
> that could provoke failures.  Fix by using the database encoding for
> all communication between worker and leader.
>
> Also, while temporary changes to GUC settings, as from the SET clause
> of a function, are in general OK for parallel query, changing
> client_encoding this way inside of a parallel worker is not OK.
> Previously, that would have confused the leader; with these changes,
> it would not confuse the leader, but it wouldn't do anything either.
> So refuse such changes in parallel workers.
>
> Also, the previous code naively assumed that when it received a
> NotifyResonse from the worker, it could pass that directly back to the
> user.  But now that worker-to-leader communication always uses the
> database encoding, that's clearly no longer correct - though,
> actually, the old way was always broken for V2 clients.  So
> disassemble and reconstitute the message instead.
>
> Issues reported by Peter Eisentraut.  Patch by me, reviewed by
> Peter Eisentraut.
>
> Branch
> ------
> master
>
> Details
> -------
> http://git.postgresql.org/pg/commitdiff/10c0558ffefcd12bf1d3dc35587eba41d1ce4571
>
> Modified Files
> --------------
> src/backend/access/transam/parallel.c | 18 +++++++++++++++++-
> src/backend/commands/async.c          |  5 +----
> src/backend/commands/variable.c       | 24 ++++++++++++++++++++++++
> src/backend/libpq/pqformat.c          | 30 ++++++++++++++++++++++++++++++
> src/backend/libpq/pqmq.c              |  2 +-
> src/include/commands/async.h          |  4 ++++
> src/include/libpq/pqformat.h          |  1 +
> 7 files changed, 78 insertions(+), 6 deletions(-)
>
>
> --
> Sent via pgsql-committers mailing list (pgsql-committers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-committers