pgsql: Fix use of incorrect TupleTableSlot in DISTINCT aggregates

From: David Rowley <drowley(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix use of incorrect TupleTableSlot in DISTINCT aggregates
Date: 2024-01-04 07:40:32
Message-ID: E1rLILA-00DQ8S-AR@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix use of incorrect TupleTableSlot in DISTINCT aggregates

1349d2790 added code to allow DISTINCT and ORDER BY aggregates to work
more efficiently by using presorted input. That commit added some code
that made use of the AggState's tmpcontext and adjusted the
ecxt_outertuple and ecxt_innertuple slots before checking if the current
row is distinct from the previously seen row. That code forgot to set the
TupleTableSlots back to what they were originally, which could result in
errors such as:

ERROR: attribute 1 of type record has wrong type

This only affects aggregate functions which have multiple arguments when
DISTINCT is used. For example: string_agg(DISTINCT col, ', ')

Thanks to Tom Lane for identifying the breaking commit.

Bug: #18264
Reported-by: Vojtěch Beneš
Discussion: https://postgr.es/m/18264-e363593d7e9feb7d@postgresql.org
Backpatch-through: 16, where 1349d2790 was added

Branch
------
REL_16_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/6298673f4b91b8b5815855785cc30f0ac390988e

Modified Files
--------------
src/backend/executor/execExprInterp.c | 20 +++++++++++++++++---
src/test/regress/expected/aggregates.out | 13 +++++++++++++
src/test/regress/sql/aggregates.sql | 9 +++++++++
3 files changed, 39 insertions(+), 3 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2024-01-04 15:46:04 pgsql: ALTER TABLE command to change generation expression
Previous Message David Rowley 2024-01-04 07:39:58 pgsql: Fix use of incorrect TupleTableSlot in DISTINCT aggregates