On Tue, Oct 21, 2025 at 9:58 AM Fujii Masao <masao.fujii@gmail.com> wrote:
> I agree that connection failures should prevent further processing even with
> --continue-on-error, and pgbench should focus on handling that first.
> However, the patch doesn't seem to handle cases where the connection is
> terminated by an admin (e.g., via pg_terminate_backend()) correctly.
> Please see the following test case, which is the same one I shared earlier:
>
> -----------------------------------------
> $ cat pipeline.sql
> \startpipeline
> DO $$
> BEGIN
> PERFORM pg_sleep(3);
> PERFORM pg_terminate_backend(pg_backend_pid());
> END $$;
> \endpipeline
>
> $ pgbench -n -f pipeline.sql -c 2 -t 4 -M extended --continue-on-error
> -----------------------------------------
>
> In this case, PQstatus() (added in readCommandResponse() by the patch)
> still returns CONNECTION_OK (BTW, the SQLSTATE is 57P01 in this case).
> As a result, the expected error message like “client ... script ... aborted
> in command ...” isn't reported. So the PQstatus() check alone that
> the patch added doesn't fully fix the issue.
One approach to address this issue is to keep calling PQgetResult() until
it returns NULL, and then check the connection status when getSQLErrorStatus()
determines the error state. If the connection status is CONNECTION_BAD
at that point, we can treat it as a connection failure and stop processing
even when --continue-on-error is specified. Attached is a WIP patch
implementing this idea based on the v17 patch. It still needs more testing,
review, and possibly documentation updates.
Another option would be to explicitly list all SQLSTATE codes (e.g., 57P01)
that should prevent continued processing, even with --continue-on-error,
inside getSQLErrorStatus(). However, maintaining such a list would be
cumbersome, so I believe the first approach is preferable. Thought?
Regards,
--
Fujii Masao