Re: libpq async duplicate error results - Mailing list pgsql-hackers

From Peter Eisentraut
Subject Re: libpq async duplicate error results
Date
Msg-id 22d52a5b-31ce-d951-1f5f-3403d793cec3@enterprisedb.com
Whole thread Raw
In response to libpq async duplicate error results  (Peter Eisentraut <peter.eisentraut@enterprisedb.com>)
Responses Re: libpq async duplicate error results  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
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




pgsql-hackers by date:

Previous
From: Peter Eisentraut
Date:
Subject: Re: Support for NSS as a libpq TLS backend
Next
From: Dag Lem
Date:
Subject: Re: daitch_mokotoff module