Fix pfree issue in presorted DISTINCT aggregate code

The logic in this area was recently changed in 7da51590e, however, in that
commit, I neglected to consider that the conditions in which we should
pfree the old Datum needed to be updated after that change.  This could
result in trying to pfree a NULL value, as was demonstrated by Alexander
Lakhin.

Reported-by: Alexander Lakhin
Discussion: https://postgr.es/m/4103db46-d888-6d1d-e88d-87c21ed99472@gmail.com
This commit is contained in:
David Rowley 2023-02-13 23:38:21 +13:00
parent bd944884e9
commit ec5a010ab2

View File

@ -4254,7 +4254,8 @@ ExecEvalPreOrderedDistinctSingle(AggState *aggstate, AggStatePerTrans pertrans)
pertrans->aggCollation,
pertrans->lastdatum, value))))
{
if (pertrans->haslast && !pertrans->inputtypeByVal)
if (pertrans->haslast && !pertrans->inputtypeByVal &&
!pertrans->lastisnull)
pfree(DatumGetPointer(pertrans->lastdatum));
pertrans->haslast = true;