Skip to content
Snippets Groups Projects
Commit 7d0ab659 authored by Bruce Momjian's avatar Bruce Momjian
Browse files

Fix for aggregate memory leaks from Erik Riedel.

parent 9ede8672
No related branches found
No related tags found
No related merge requests found
...@@ -26,7 +26,7 @@ ...@@ -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) ...@@ -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
......
...@@ -7,7 +7,7 @@ ...@@ -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) ...@@ -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) ...@@ -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
......
...@@ -110,6 +110,7 @@ ExecAgg(Agg *node) ...@@ -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) ...@@ -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);
} }
} }
......
...@@ -27,7 +27,7 @@ ...@@ -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) ...@@ -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) ...@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment