mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +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:
parent
58e351113f
commit
642cd0ab13
@ -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
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.118 2004/02/03 17:34:02 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.119 2004/03/13 00:54:10 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -251,6 +251,18 @@ initialize_aggregates(AggState *aggstate,
|
|||||||
work_mem, false);
|
work_mem, 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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user