pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Fabien COELHO <coelho@cri.ensmp.fr>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Subject: Re: libpq async duplicate error results
Date: Thu, 3 Feb 2022 15:10:14 +0100
Message-ID: <22d52a5b-31ce-d951-1f5f-3403d793cec3@enterprisedb.com> (raw)
In-Reply-To: <ab4288f8-be5c-57fb-2400-e3e857f53e46@enterprisedb.com>
References: <ab4288f8-be5c-57fb-2400-e3e857f53e46@enterprisedb.com>

Tom, you worked on reorganzing the error message handling in libpq in 
PostgreSQL 14 (commit ffa2e4670123124b92f037d335a1e844c3782d3f).  Any 
thoughts on this?


On 25.01.22 09:32, Peter Eisentraut wrote:
> 
> This issue was discovered by Fabien in the SHOW_ALL_RESULTS thread.  I'm 
> posting it here separately, because I think it ought to be addressed in 
> libpq rather than with a workaround in psql, as proposed over there.
> 
> When using PQsendQuery() + PQgetResult() and the server crashes during 
> the execution of the command, PQgetResult() then returns two result sets 
> with partially duplicated error messages, like this from the attached 
> test program:
> 
> command = SELECT 'before';
> result 1 status = PGRES_TUPLES_OK
> error message = ""
> 
> command = SELECT pg_terminate_backend(pg_backend_pid());
> result 1 status = PGRES_FATAL_ERROR
> error message = "FATAL:  terminating connection due to administrator 
> command
> "
> result 2 status = PGRES_FATAL_ERROR
> error message = "FATAL:  terminating connection due to administrator 
> command
> server closed the connection unexpectedly
>      This probably means the server terminated abnormally
>      before or while processing the request.
> "
> 
> command = SELECT 'after';
> PQsendQuery() error: no connection to the server
> 
> 
> This is hidden in normal use because PQexec() throws away all but the 
> last result set, but the extra one is still generated internally.
> 
> Apparently, this has changed between PG13 and PG14.  In PG13 and 
> earlier, the output is
> 
> command = SELECT 'before';
> result 1 status = PGRES_TUPLES_OK
> error message = ""
> 
> command = SELECT pg_terminate_backend(pg_backend_pid());
> result 1 status = PGRES_FATAL_ERROR
> error message = "FATAL:  terminating connection due to administrator 
> command
> "
> result 2 status = PGRES_FATAL_ERROR
> error message = "server closed the connection unexpectedly
>      This probably means the server terminated abnormally
>      before or while processing the request.
> "
> 
> command = SELECT 'after';
> PQsendQuery() error: no connection to the server
> 
> In PG13, PQexec() concatenates all the error messages from multiple 
> results, so a user of PQexec() sees the same output before and after. 
> But for users of the lower-level APIs, things have become a bit more 
> confusing.
> 
> Also, why are there multiple results being generated in the first place?
> 
> 
> [0]: 
> https://www.postgresql.org/message-id/alpine.DEB.2.22.394.2112230703530.2668598@pseudo






view thread (19+ messages)  latest in thread

Message-ID: <22d52a5b-31ce-d951-1f5f-3403d793cec3@enterprisedb.com>
Permalink:  ../22d52a5b-31ce-d951-1f5f-3403d793cec3@enterprisedb.com/
Also on:    postgresql.org/message-id/22d52a5b-31ce-d951-1f5f-3403d793cec3@enterprisedb.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: peter.eisentraut@enterprisedb.com, tgl@sss.pgh.pa.us, coelho@cri.ensmp.fr
  Subject: Re: libpq async duplicate error results
  In-Reply-To: <22d52a5b-31ce-d951-1f5f-3403d793cec3@enterprisedb.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox