From ec5a010ab25bf40012fde78b34724971e38e08a4 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Mon, 13 Feb 2023 23:38:21 +1300 Subject: [PATCH] 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 --- src/backend/executor/execExprInterp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 827c65cc85..19351fe34b 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -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;