From: | Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com> |
---|---|
To: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Cc: | Fabien COELHO <coelho(at)cri(dot)ensmp(dot)fr> |
Subject: | libpq async duplicate error results |
Date: | 2022-01-25 08:32:41 |
Message-ID: | ab4288f8-be5c-57fb-2400-e3e857f53e46@enterprisedb.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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
Attachment | Content-Type | Size |
---|---|---|
test.c | text/plain | 1015 bytes |
From | Date | Subject | |
---|---|---|---|
Next Message | Kyotaro Horiguchi | 2022-01-25 08:34:56 | Re: Make mesage at end-of-recovery less scary. |
Previous Message | David Rowley | 2022-01-25 08:20:25 | Re: Fix BUG #17335: Duplicate result rows in Gather node |