This is an automated email from the ASF dual-hosted git repository. leborchuk pushed a commit to branch REL_2_STABLE in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit c485851e4bfb360900634bfb482273240d7d80b1 Author: Alvaro Herrera <[email protected]> AuthorDate: Mon Jan 22 17:48:30 2024 +0100 Abort pgbench if script end is reached with an open pipeline When a pipeline is opened with \startpipeline and not closed, pgbench will either error on the next transaction with a "already in pipeline mode" error or successfully end if this was the last transaction -- despite not sending anything that was piped in the pipeline. Make it an error to reach end of script is reached while there's an open pipeline. Backpatch to 14, where pgbench got support for pipelines. Author: Anthonin Bonnefoy <[email protected]> Reported-by: Michael Paquier <[email protected]> Discussion: https://postgr.es/m/[email protected] (cherry picked from commit 85ecff891525d61bc975584e2dc2d3c01e5a48ee) --- src/bin/pgbench/pgbench.c | 15 +++++++++++++-- src/bin/pgbench/t/001_pgbench_with_server.pl | 28 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index cedadfe6e8a..251cb59b7eb 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3348,10 +3348,21 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) case CSTATE_START_COMMAND: command = sql_script[st->use_file].commands[st->command]; - /* Transition to script end processing if done */ + /* + * Transition to script end processing if done, but close up + * shop if a pipeline is open at this point. + */ if (command == NULL) { - st->state = CSTATE_END_TX; + if (PQpipelineStatus(st->con) == PQ_PIPELINE_OFF) + st->state = CSTATE_END_TX; + else + { + pg_log_error("client %d aborted: end of script reached with pipeline open", + st->id); + st->state = CSTATE_ABORTED; + } + break; } diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index b79b18938cc..2793a24a17e 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -841,6 +841,34 @@ select 1 \gset f } }); +# Try \startpipeline without \endpipeline in a single transaction +$node->pgbench( + '-t 1 -n -M extended', + 2, + [], + [qr{end of script reached with pipeline open}], + 'error: call \startpipeline without \endpipeline in a single transaction', + { + '001_pgbench_pipeline_5' => q{ +-- startpipeline only with single transaction +\startpipeline +} + }); + +# Try \startpipeline without \endpipeline +$node->pgbench( + '-t 2 -n -M extended', + 2, + [], + [qr{end of script reached with pipeline open}], + 'error: call \startpipeline without \endpipeline', + { + '001_pgbench_pipeline_6' => q{ +-- startpipeline only +\startpipeline +} + }); + # Working \startpipeline in prepared query mode with serializable $node->pgbench( '-c4 -t 10 -n -M prepared', --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
