diff options
author | David Rowley <drowley@postgresql.org> | 2023-02-13 23:38:21 +1300 |
---|---|---|
committer | David Rowley <drowley@postgresql.org> | 2023-02-13 23:38:21 +1300 |
commit | ec5a010ab25bf40012fde78b34724971e38e08a4 (patch) | |
tree | 617773338050b68f053354767ed3332d207e7dbf | |
parent | bd944884e92af7082063428a1124a15041597c33 (diff) | |
download | postgresql-ec5a010ab25bf40012fde78b34724971e38e08a4.tar.gz postgresql-ec5a010ab25bf40012fde78b34724971e38e08a4.zip |
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
-rw-r--r-- | src/backend/executor/execExprInterp.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 827c65cc852..19351fe34bf 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; |