Fix for aggregate memory leaks from Erik Riedel.

This commit is contained in:
Bruce Momjian 1999-03-20 01:13:22 +00:00
parent 9ede867281
commit 7d0ab659ac
4 changed files with 76 additions and 4 deletions

View File

@ -26,7 +26,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.80 1999/03/19 18:56:36 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.81 1999/03/20 01:13:21 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -394,8 +394,26 @@ ExecutorEnd(QueryDesc *queryDesc, EState *estate)
EndPlan(queryDesc->plantree, estate); EndPlan(queryDesc->plantree, estate);
/* XXX - clean up some more from ExecutorStart() - er1p */
if (NULL == estate->es_snapshot) {
/* nothing to free */
} else {
if (estate->es_snapshot->xcnt > 0) {
pfree(estate->es_snapshot->xip);
}
pfree(estate->es_snapshot);
}
if (NULL == estate->es_param_exec_vals) {
/* nothing to free */
} else {
pfree(estate->es_param_exec_vals);
estate->es_param_exec_vals = NULL;
}
/* restore saved refcounts. */ /* restore saved refcounts. */
BufferRefCountRestore(estate->es_refcount); BufferRefCountRestore(estate->es_refcount);
} }
void void
@ -580,7 +598,7 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
/* /*
* initialize result relation stuff * initialize result relation stuff
*/ */
if (resultRelation != 0 && operation != CMD_SELECT) if (resultRelation != 0 && operation != CMD_SELECT)
{ {
/* /*

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.43 1999/02/13 23:15:20 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.44 1999/03/20 01:13:22 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -272,6 +272,7 @@ ExecAssignResultTypeFromTL(Plan *node, CommonState *commonstate)
#endif #endif
i++; i++;
} }
if (len > 0) if (len > 0)
{ {
ExecAssignResultType(commonstate, ExecAssignResultType(commonstate,
@ -368,6 +369,53 @@ ExecFreeProjectionInfo(CommonState *commonstate)
commonstate->cs_ProjInfo = NULL; commonstate->cs_ProjInfo = NULL;
} }
/* ----------------
* ExecFreeExprContext
* ----------------
*/
void
ExecFreeExprContext(CommonState *commonstate)
{
ExprContext *econtext;
/* ----------------
* get expression context. if NULL then this node has
* none so we just return.
* ----------------
*/
econtext = commonstate->cs_ExprContext;
if (econtext == NULL)
return;
/* ----------------
* clean up memory used.
* ----------------
*/
pfree(econtext);
commonstate->cs_ExprContext = NULL;
}
/* ----------------
* ExecFreeTypeInfo
* ----------------
*/
void
ExecFreeTypeInfo(CommonState *commonstate)
{
TupleDesc tupDesc;
tupDesc = commonstate->cs_ResultTupleSlot->ttc_tupleDescriptor;
if (tupDesc == NULL)
return;
/* ----------------
* clean up memory used.
* ----------------
*/
FreeTupleDesc(tupDesc);
commonstate->cs_ResultTupleSlot->ttc_tupleDescriptor = NULL;
}
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* the following scan type support functions are for * the following scan type support functions are for
* those nodes which are stubborn and return tuples in * those nodes which are stubborn and return tuples in

View File

@ -110,6 +110,7 @@ ExecAgg(Agg *node)
isNull2 = FALSE; isNull2 = FALSE;
bool qual_result; bool qual_result;
Datum oldVal = (Datum) NULL; /* XXX - so that we can save and free on each iteration - er1p */
/* --------------------- /* ---------------------
* get state info from node * get state info from node
@ -372,8 +373,10 @@ ExecAgg(Agg *node)
*/ */
args[0] = value1[aggno]; args[0] = value1[aggno];
args[1] = newVal; args[1] = newVal;
oldVal = value1[aggno]; /* XXX - save so we can free later - er1p */
value1[aggno] = (Datum) fmgr_c(&aggfns->xfn1, value1[aggno] = (Datum) fmgr_c(&aggfns->xfn1,
(FmgrValues *) args, &isNull1); (FmgrValues *) args, &isNull1);
pfree(oldVal); /* XXX - new, let's free the old datum - er1p */
Assert(!isNull1); Assert(!isNull1);
} }
} }

View File

@ -27,7 +27,7 @@
* SeqScan (emp.all) * SeqScan (emp.all)
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeResult.c,v 1.9 1999/02/13 23:15:26 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/nodeResult.c,v 1.10 1999/03/20 01:13:22 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -263,6 +263,8 @@ ExecEndResult(Result *node)
* is freed at end-transaction time. -cim 6/2/91 * is freed at end-transaction time. -cim 6/2/91
* ---------------- * ----------------
*/ */
ExecFreeExprContext(&resstate->cstate); /* XXX - new for us - er1p */
ExecFreeTypeInfo(&resstate->cstate); /* XXX - new for us - er1p */
ExecFreeProjectionInfo(&resstate->cstate); ExecFreeProjectionInfo(&resstate->cstate);
/* ---------------- /* ----------------
@ -276,6 +278,7 @@ ExecEndResult(Result *node)
* ---------------- * ----------------
*/ */
ExecClearTuple(resstate->cstate.cs_ResultTupleSlot); ExecClearTuple(resstate->cstate.cs_ResultTupleSlot);
pfree(resstate); node->resstate = NULL; /* XXX - new for us - er1p */
} }
void void