On Wed, 27 Nov 2024 at 13:05, Kirill Reshke <reshkekir...@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