Re: Add Pipelining support in psql
Anthonin Bonnefoy <anthonin.bonnefoy@datadoghq.com>
Attachments
- v02-0001-Add-pipelining-support-in-psql.patch (application/octet-stream) patch v2-0001
On Wed, Nov 27, 2024 at 11:46 AM Kirill Reshke <reshkekirill@gmail.com> wrote: > I'm very doubtful about the \syncpipeline . Maybe we should instead > support \sync meta-command in psql? This will be a useful contribution > itself. \syncpipeline is useful to cover regression tests involving implicit transaction blocks within a pipeline where a sync acts as an implicit COMMIT. What would be the use of sending a \sync outside of a pipeline? All extended queries meta-commands sent by psql already send a sync if you're not in a pipeline, so the only use of a \sync meta-command would be to send a single sync (which could be achieved with \startpipeline followed by a \endpipeline). On Wed, Nov 27, 2024 at 1:54 PM Jelte Fennema-Nio <postgres@jeltef.nl> wrote: > 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: I don't think that's the case here. Nothing was sent to the server so there's no active transaction yet. From prompt.c, psql will show a '*' when PQtransactionStatus is either PQTRANS_ACTIVE or PQTRANS_INTRANS. Looking at the state of the PGConn, after a \startpipeline, we have: db->xactStatus: (PGTransactionStatusType) PQTRANS_IDLE db->asyncStatus: (PGAsyncStatusType) PGASYNC_IDLE db->pipelineStatus: (PGpipelineStatus) PQ_PIPELINE_ON After the first command is sent to the pipeline: db->asyncStatus: (PGAsyncStatusType) PGASYNC_BUSY db->xactStatus: (PGTransactionStatusType) PQTRANS_IDLE db->pipelineStatus: (PGpipelineStatus) PQ_PIPELINE_ON The xactStatus is idle, however, since asyncStatus reports busy, we fall in the "if (conn->asyncStatus != PGASYNC_IDLE) return PQTRANS_ACTIVE;" and psql display '*' in the prompt. This might be a bit misleading since there's no ongoing transaction block on the server and maybe it's worth having a new state? I've updated the patch to display a tentative '|' when there's an ongoing pipeline. On the other hand, a pipeline will start an implicit transaction block even without BEGIN so leaving the '*' may be a good way to reflect that? On Wed, Nov 27, 2024 at 1:45 PM Jelte Fennema-Nio <postgres@jeltef.nl> wrote: > I played around quickly with this patch and it works quite well. A few > things that would be nice improvements I think. Feel free to change > the command names: > 1. Add a \flush command that calls PQflush > 2. Add a \flushrequest command that calls PQsendFlushRequest > 3. Add a \getresult command so you can get a result from a query > without having to close the pipeline > > To be clear, not having those additional commands isn't a blocker for > this patch imho, but I'd definitely miss them if they weren't there > when I would be using it. I will need a bit of time to check those and how they can be included in the regression tests.
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
psql: Fix assertion failures with pipeline mode
- 3631612eae9c 18.0 landed
-
psql: Rework TAP routine psql_fails_like() to define WAL sender context
- 0ff95e0a5be1 18.0 landed
-
psql: Split extended query protocol meta-commands in --help=commands
- 78231baaf967 18.0 landed
-
psql: Improve descriptions of \\flush[request] in --help
- 5743d122fcf3 18.0 landed
-
psql: Fix incorrect status code returned by \getresults
- 5ee7bd944ee8 18.0 landed
-
psql: Allow queries terminated by semicolons while in pipeline mode
- 2cce0fe440fb 18.0 landed
-
psql: Add \sendpipeline to send query buffers while in a pipeline
- 17caf6644546 18.0 landed
-
psql: Fix memory leak with \gx used within a pipeline
- 54d23601b978 18.0 landed
-
psql: Add pipeline status to prompt and some state variables
- 3ce357584e79 18.0 landed
-
Add more tests for utility commands in pipelines
- a4e986ef5a46 18.0 landed
-
psql: Add support for pipelines
- 41625ab8ea3d 18.0 landed
-
Add braces for if block with large comment in psql's common.c
- 40af897eb777 18.0 landed