aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/statistics/dependencies.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c
index 44dd5b2762e..bdc7e250456 100644
--- a/src/backend/statistics/dependencies.c
+++ b/src/backend/statistics/dependencies.c
@@ -30,6 +30,8 @@
#include "utils/fmgroids.h"
#include "utils/fmgrprotos.h"
#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/selfuncs.h"
#include "utils/syscache.h"
#include "utils/typcache.h"
@@ -326,13 +328,6 @@ dependency_degree(int numrows, HeapTuple *rows, int k, AttrNumber *dependency,
group_size++;
}
- if (items)
- pfree(items);
-
- pfree(mss);
- pfree(attnums);
- pfree(attnums_dep);
-
/* Compute the 'degree of validity' as (supporting/total). */
return (n_supporting_rows * 1.0 / numrows);
}
@@ -364,6 +359,7 @@ statext_dependencies_build(int numrows, HeapTuple *rows, Bitmapset *attrs,
/* result */
MVDependencies *dependencies = NULL;
+ MemoryContext cxt;
/*
* Transform the bms into an array, to make accessing i-th member easier.
@@ -372,6 +368,11 @@ statext_dependencies_build(int numrows, HeapTuple *rows, Bitmapset *attrs,
Assert(numattrs >= 2);
+ /* tracks memory allocated by dependency_degree calls */
+ cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "dependency_degree cxt",
+ ALLOCSET_DEFAULT_SIZES);
+
/*
* We'll try build functional dependencies starting from the smallest ones
* covering just 2 columns, to the largest ones, covering all columns
@@ -390,10 +391,17 @@ statext_dependencies_build(int numrows, HeapTuple *rows, Bitmapset *attrs,
{
double degree;
MVDependency *d;
+ MemoryContext oldcxt;
+
+ /* release memory used by dependency degree calculation */
+ oldcxt = MemoryContextSwitchTo(cxt);
/* compute how valid the dependency seems */
degree = dependency_degree(numrows, rows, k, dependency, stats, attrs);
+ MemoryContextSwitchTo(oldcxt);
+ MemoryContextReset(cxt);
+
/*
* if the dependency seems entirely invalid, don't store it
*/
@@ -435,6 +443,8 @@ statext_dependencies_build(int numrows, HeapTuple *rows, Bitmapset *attrs,
DependencyGenerator_free(DependencyGenerator);
}
+ MemoryContextDelete(cxt);
+
return dependencies;
}