1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-03 20:02:46 +03:00

Repair memory leakage introduced into the non-hashed aggregate case by

7.4 rewrite for hashed aggregate support.  If the transition data type
is pass-by-reference, the transValue must be pfreed when starting a new
group boundary, else we have a one-value-per-group leakage.  Thanks to
Rae Steining for providing a reproducible test case.
This commit is contained in:
Tom Lane
2004-03-13 00:54:35 +00:00
parent ef41d22e55
commit 695c241e5a

View File

@ -45,7 +45,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeAgg.c,v 1.116 2003/08/19 01:13:40 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/nodeAgg.c,v 1.116.2.1 2004/03/13 00:54:35 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -251,6 +251,18 @@ initialize_aggregates(AggState *aggstate,
false); false);
} }
/*
* If we are reinitializing after a group boundary, we have to free
* any prior transValue to avoid memory leakage. We must check not
* only the isnull flag but whether the pointer is NULL; since
* pergroupstate is initialized with palloc0, the initial condition
* has isnull = 0 and null pointer.
*/
if (!peraggstate->transtypeByVal &&
!pergroupstate->transValueIsNull &&
DatumGetPointer(pergroupstate->transValue) != NULL)
pfree(DatumGetPointer(pergroupstate->transValue));
/* /*
* (Re)set transValue to the initial value. * (Re)set transValue to the initial value.
* *
@ -1472,6 +1484,12 @@ ExecReScanAgg(AggState *node, ExprContext *exprCtxt)
build_hash_table(node); build_hash_table(node);
node->table_filled = false; node->table_filled = false;
} }
else
{
/* Reset the per-group state (in particular, mark transvalues null) */
MemSet(node->pergroup, 0,
sizeof(AggStatePerGroupData) * node->numaggs);
}
/* /*
* if chgParam of subnode is not null then plan will be re-scanned by * if chgParam of subnode is not null then plan will be re-scanned by