Commit b50cbbd6 authored by Tom Lane's avatar Tom Lane

Fix up memory leakage created by recent changes.

parent 62d45261
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.36 2002/06/13 19:52:02 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.37 2002/06/15 22:25:40 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -59,7 +59,7 @@ typedef enum ...@@ -59,7 +59,7 @@ typedef enum
/* /*
* We build one of these structs for each attribute (column) that is to be * We build one of these structs for each attribute (column) that is to be
* analyzed. The struct and subsidiary data are in TransactionCommandContext, * analyzed. The struct and subsidiary data are in anl_context,
* so they live until the end of the ANALYZE operation. * so they live until the end of the ANALYZE operation.
*/ */
typedef struct typedef struct
...@@ -109,6 +109,8 @@ typedef struct ...@@ -109,6 +109,8 @@ typedef struct
static int elevel = -1; static int elevel = -1;
static MemoryContext anl_context = NULL;
/* context information for compare_scalars() */ /* context information for compare_scalars() */
static FmgrInfo *datumCmpFn; static FmgrInfo *datumCmpFn;
static SortFunctionKind datumCmpFnKind; static SortFunctionKind datumCmpFnKind;
...@@ -155,6 +157,13 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) ...@@ -155,6 +157,13 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
else else
elevel = DEBUG1; elevel = DEBUG1;
/*
* Use the current context for storing analysis info. vacuum.c ensures
* that this context will be cleared when I return, thus releasing the
* memory allocated here.
*/
anl_context = CurrentMemoryContext;
/* /*
* Check for user-requested abort. Note we want this to be inside a * Check for user-requested abort. Note we want this to be inside a
* transaction, so xact.c doesn't issue useless WARNING. * transaction, so xact.c doesn't issue useless WARNING.
...@@ -306,14 +315,14 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) ...@@ -306,14 +315,14 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
* Compute the statistics. Temporary results during the calculations * Compute the statistics. Temporary results during the calculations
* for each column are stored in a child context. The calc routines * for each column are stored in a child context. The calc routines
* are responsible to make sure that whatever they store into the * are responsible to make sure that whatever they store into the
* VacAttrStats structure is allocated in TransactionCommandContext. * VacAttrStats structure is allocated in anl_context.
*/ */
if (numrows > 0) if (numrows > 0)
{ {
MemoryContext col_context, MemoryContext col_context,
old_context; old_context;
col_context = AllocSetContextCreate(CurrentMemoryContext, col_context = AllocSetContextCreate(anl_context,
"Analyze Column", "Analyze Column",
ALLOCSET_DEFAULT_MINSIZE, ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE, ALLOCSET_DEFAULT_INITSIZE,
...@@ -1094,8 +1103,8 @@ compute_minimal_stats(VacAttrStats *stats, ...@@ -1094,8 +1103,8 @@ compute_minimal_stats(VacAttrStats *stats,
Datum *mcv_values; Datum *mcv_values;
float4 *mcv_freqs; float4 *mcv_freqs;
/* Must copy the target values into TransactionCommandContext */ /* Must copy the target values into anl_context */
old_context = MemoryContextSwitchTo(TransactionCommandContext); old_context = MemoryContextSwitchTo(anl_context);
mcv_values = (Datum *) palloc(num_mcv * sizeof(Datum)); mcv_values = (Datum *) palloc(num_mcv * sizeof(Datum));
mcv_freqs = (float4 *) palloc(num_mcv * sizeof(float4)); mcv_freqs = (float4 *) palloc(num_mcv * sizeof(float4));
for (i = 0; i < num_mcv; i++) for (i = 0; i < num_mcv; i++)
...@@ -1415,8 +1424,8 @@ compute_scalar_stats(VacAttrStats *stats, ...@@ -1415,8 +1424,8 @@ compute_scalar_stats(VacAttrStats *stats,
Datum *mcv_values; Datum *mcv_values;
float4 *mcv_freqs; float4 *mcv_freqs;
/* Must copy the target values into TransactionCommandContext */ /* Must copy the target values into anl_context */
old_context = MemoryContextSwitchTo(TransactionCommandContext); old_context = MemoryContextSwitchTo(anl_context);
mcv_values = (Datum *) palloc(num_mcv * sizeof(Datum)); mcv_values = (Datum *) palloc(num_mcv * sizeof(Datum));
mcv_freqs = (float4 *) palloc(num_mcv * sizeof(float4)); mcv_freqs = (float4 *) palloc(num_mcv * sizeof(float4));
for (i = 0; i < num_mcv; i++) for (i = 0; i < num_mcv; i++)
...@@ -1501,8 +1510,8 @@ compute_scalar_stats(VacAttrStats *stats, ...@@ -1501,8 +1510,8 @@ compute_scalar_stats(VacAttrStats *stats,
nvals = values_cnt; nvals = values_cnt;
Assert(nvals >= num_hist); Assert(nvals >= num_hist);
/* Must copy the target values into TransactionCommandContext */ /* Must copy the target values into anl_context */
old_context = MemoryContextSwitchTo(TransactionCommandContext); old_context = MemoryContextSwitchTo(anl_context);
hist_values = (Datum *) palloc(num_hist * sizeof(Datum)); hist_values = (Datum *) palloc(num_hist * sizeof(Datum));
for (i = 0; i < num_hist; i++) for (i = 0; i < num_hist; i++)
{ {
...@@ -1530,8 +1539,8 @@ compute_scalar_stats(VacAttrStats *stats, ...@@ -1530,8 +1539,8 @@ compute_scalar_stats(VacAttrStats *stats,
double corr_xsum, double corr_xsum,
corr_x2sum; corr_x2sum;
/* Must copy the target values into TransactionCommandContext */ /* Must copy the target values into anl_context */
old_context = MemoryContextSwitchTo(TransactionCommandContext); old_context = MemoryContextSwitchTo(anl_context);
corrs = (float4 *) palloc(sizeof(float4)); corrs = (float4 *) palloc(sizeof(float4));
MemoryContextSwitchTo(old_context); MemoryContextSwitchTo(old_context);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment