Thread

  1. Re: Add Pipelining support in psql

    Anthonin Bonnefoy <anthonin.bonnefoy@datadoghq.com> — 2025-02-20T09:29:33Z

    On Thu, Feb 20, 2025 at 9:02 AM Michael Paquier <michael@paquier.xyz> wrote:
    > You have forgotten the expected output.  Not a big issue as the input
    > was sent.
    
    I was writing the mail with the missing file when you sent this mail.
    This is fixed.
    
    > While testing, I have been able to run into an assertion failure by
    > adding some tests in psql.sql to check for the case of inactive
    > branches for \if.  For example:
    > --- a/src/test/regress/sql/psql.sql
    > +++ b/src/test/regress/sql/psql.sql
    > @@ -1047,11 +1047,15 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two;
    >     \echo arg1 arg2 arg3 arg4 arg5
    >     \echo arg1
    >     \encoding arg1
    > +   \endpipeline
    >     \errverbose
    >
    > And the report:
    > +psql: mainloop.c:513: MainLoop: Assertion `conditional_active(cond_stack)' failed.
    >
    > We should have tests for all new six meta-commands in psql.sql.
    > MainLoop() is wrong when in pipeline mode for inactive branches.
    
    Ha yeah, I forgot about the inactive branches. I've added the new
    commands and fixed the behaviour.
    
    A small issue I've noticed while testing: When a pipeline has at least
    one queue command, pqClearConnErrorState isn't called in
    PQsendQueryStart and errors are appended. For example:
    
    \startpipeline
    select 1 \bind \g
    select 1;
    PQsendQuery not allowed in pipeline mode
    select 1;
    PQsendQuery not allowed in pipeline mode
    PQsendQuery not allowed in pipeline mode
    
    This looks more like an issue on libpq's side as there's no way to
    reset or advance the errorReported from ExecQueryAndProcessResults
    (plus PQerrorMessage seems to ignore errorReported). I've added an
    additional test to track this behaviour for now as this would probably
    be better discussed in a dedicated thread.