pgpool: Fix inconsistent internal transaction handling in Parse.

From: Taiki Koshino <koshino(at)sraoss(dot)co(dot)jp>
To: pgpool-committers(at)lists(dot)postgresql(dot)org
Subject: pgpool: Fix inconsistent internal transaction handling in Parse.
Date: 2026-09-18 05:16:59
Message-ID: E1x7Qy2-0000000D49o-3paP@gothos.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgpool-committers

Fix inconsistent internal transaction handling in Parse.

Parse() started an internal transaction for a strict query in raw mode:

if (!SL_MODE)
if (is_strict_query(...))
start_internal_transaction(...);

Bind() correctly limits the same operation to replication mode:

if (REPLICATION)
if (is_strict_query(...))
start_internal_transaction(...);

This difference left an autocommitted extended-protocol UPDATE in a
transaction in raw mode because the internal transaction was never
closed.

Add the REPLICATION condition to Parse() to make it consistent with
Bind().

The issue was verified using pgproto with the following extended-query
message sequence:

'P' "s" "UPDATE scm_pgpool_txn_probe SET value=value+1 WHERE id=1" 0
'B' "" "s" 0 0 0
'E' "" 0
'S'
'Y'
'X'

Before the fix, Pgpool-II returned:

<= BE CommandComplete(UPDATE 1)
<= BE ReadyForQuery(T)

After the fix, it returns:

<= BE CommandComplete(UPDATE 1)
<= BE ReadyForQuery(I)

Author: Taiki Koshino <koshino(at)sraoss(dot)co(dot)jp>
Discussion: https://github.com/pgpool/pgpool2/issues/172
Backpatch-through: v4.3

Branch
------
master

Details
-------
https://git.postgresql.org/gitweb?p=pgpool2.git;a=commitdiff;h=85f333b678d9acbbd0432dbcf68287d7cc8537bc

Modified Files
--------------
src/protocol/pool_proto_modules.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

Browse pgpool-committers by date

  From Date Subject
Next Message Taiki Koshino 2026-09-18 05:17:48 pgpool: Fix inconsistent internal transaction handling in Parse.
Previous Message Taiki Koshino 2026-09-18 05:10:41 pgpool: Fix response buffer pointer advancement in do_error_execute_com