aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-06-15 22:25:40 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-06-15 22:25:40 +0000
commitb50cbbd66b8835682982d553b348d017a850f76a (patch)
treed681711b29207088c5781185b0481e38fba12992 /src
parent62d45261144f973ca6139cb85ebfca735103852e (diff)
downloadpostgresql-b50cbbd66b8835682982d553b348d017a850f76a.tar.gz
postgresql-b50cbbd66b8835682982d553b348d017a850f76a.zip
Fix up memory leakage created by recent changes.
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/analyze.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index b3bfce94122..4f4eb760b5f 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -8,7 +8,7 @@
*
*
* 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
/*
* 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.
*/
typedef struct
@@ -109,6 +109,8 @@ typedef struct
static int elevel = -1;
+static MemoryContext anl_context = NULL;
+
/* context information for compare_scalars() */
static FmgrInfo *datumCmpFn;
static SortFunctionKind datumCmpFnKind;
@@ -156,6 +158,13 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
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
* transaction, so xact.c doesn't issue useless WARNING.
*/
@@ -306,14 +315,14 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
* Compute the statistics. Temporary results during the calculations
* for each column are stored in a child context. The calc routines
* 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)
{
MemoryContext col_context,
old_context;
- col_context = AllocSetContextCreate(CurrentMemoryContext,
+ col_context = AllocSetContextCreate(anl_context,
"Analyze Column",
ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE,
@@ -1094,8 +1103,8 @@ compute_minimal_stats(VacAttrStats *stats,
Datum *mcv_values;
float4 *mcv_freqs;
- /* Must copy the target values into TransactionCommandContext */
- old_context = MemoryContextSwitchTo(TransactionCommandContext);
+ /* Must copy the target values into anl_context */
+ old_context = MemoryContextSwitchTo(anl_context);
mcv_values = (Datum *) palloc(num_mcv * sizeof(Datum));
mcv_freqs = (float4 *) palloc(num_mcv * sizeof(float4));
for (i = 0; i < num_mcv; i++)
@@ -1415,8 +1424,8 @@ compute_scalar_stats(VacAttrStats *stats,
Datum *mcv_values;
float4 *mcv_freqs;
- /* Must copy the target values into TransactionCommandContext */
- old_context = MemoryContextSwitchTo(TransactionCommandContext);
+ /* Must copy the target values into anl_context */
+ old_context = MemoryContextSwitchTo(anl_context);
mcv_values = (Datum *) palloc(num_mcv * sizeof(Datum));
mcv_freqs = (float4 *) palloc(num_mcv * sizeof(float4));
for (i = 0; i < num_mcv; i++)
@@ -1501,8 +1510,8 @@ compute_scalar_stats(VacAttrStats *stats,
nvals = values_cnt;
Assert(nvals >= num_hist);
- /* Must copy the target values into TransactionCommandContext */
- old_context = MemoryContextSwitchTo(TransactionCommandContext);
+ /* Must copy the target values into anl_context */
+ old_context = MemoryContextSwitchTo(anl_context);
hist_values = (Datum *) palloc(num_hist * sizeof(Datum));
for (i = 0; i < num_hist; i++)
{
@@ -1530,8 +1539,8 @@ compute_scalar_stats(VacAttrStats *stats,
double corr_xsum,
corr_x2sum;
- /* Must copy the target values into TransactionCommandContext */
- old_context = MemoryContextSwitchTo(TransactionCommandContext);
+ /* Must copy the target values into anl_context */
+ old_context = MemoryContextSwitchTo(anl_context);
corrs = (float4 *) palloc(sizeof(float4));
MemoryContextSwitchTo(old_context);