Thread: Re: Add Pipelining support in psql

Re: Add Pipelining support in psql

From
Kirill Reshke
Date:
On Wed, 27 Nov 2024 at 14:50, Anthonin Bonnefoy
<anthonin.bonnefoy@datadoghq.com> wrote:
>
> Hi,
>
> With \bind, \parse, \bind_named and \close, it is possible to issue
> queries from psql using the extended protocol. However, it wasn't
> possible to send those queries using pipelining and the only way to
> test pipelined queries was through pgbench's tap tests.
>
> The attached patch adds pipelining support to psql with 3 new
> meta-commands, mirroring what's already done in pgbench:
> - \startpipeline starts a new pipeline. All extended queries will be
> queued until the end of the pipeline is reached.
> - \endpipeline ends an ongoing pipeline. All queued commands will be
> sent to the server and all responses will be processed by the psql.
> - \syncpipeline queue a synchronisation point without flushing the
> commands to the server
>
> Those meta-commands will allow testing pipelined query behaviour using
> psql regression tests.
>
> Regards,
> Anthonin

Hi! I stopped this:

```
db1=# \startpipeline
db1=# begin \parse p1
db1=*#
```
Notice the asterisks that appeared after parse the message. This
typically indicates we are in the tx block. this is however untrue
before the bind+exec message for p1 will be sent (\bind_name
metacommand). Am I correct?


-- 
Best regards,
Kirill Reshke



Re: Add Pipelining support in psql

From
Jelte Fennema-Nio
Date:
On Wed, 27 Nov 2024 at 13:05, Kirill Reshke <reshkekirill@gmail.com> wrote:
> ```
> db1=# \startpipeline
> db1=# begin \parse p1
> db1=*#
> ```
> Notice the asterisks that appeared after parse the message. This
> typically indicates we are in the tx block. this is however untrue
> before the bind+exec message for p1 will be sent (\bind_name
> metacommand). Am I correct?

This behaviour is expected, it also happens if you send "SELECT 1"
instead of "begin" in the parse message:
db1=# \startpipeline
db1=# SELECT 1 \parse p1
db1=*#

The reason this happens is that the first command in a pipeline sent
to the server opens an implicit transaction. See the "implicit COMMIT"
wording here[1], or look at this code in exec_parse_message:

    /*
     * Start up a transaction command so we can run parse analysis etc. (Note
     * that this will normally change current memory context.) Nothing happens
     * if we are already in one.  This also arms the statement timeout if
     * necessary.
     */
    start_xact_command();


[1]: https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-PIPELINING