aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/partition.c54
1 files changed, 17 insertions, 37 deletions
diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c
index 96a64ce6b2c..50162632f5c 100644
--- a/src/backend/catalog/partition.c
+++ b/src/backend/catalog/partition.c
@@ -303,21 +303,18 @@ RelationBuildPartitionDesc(Relation rel)
}
else if (key->strategy == PARTITION_STRATEGY_RANGE)
{
- int j,
- k;
+ int k;
PartitionRangeBound **all_bounds,
*prev;
- bool *distinct_indexes;
all_bounds = (PartitionRangeBound **) palloc0(2 * nparts *
sizeof(PartitionRangeBound *));
- distinct_indexes = (bool *) palloc(2 * nparts * sizeof(bool));
/*
* Create a unified list of range bounds across all the
* partitions.
*/
- i = j = 0;
+ i = ndatums = 0;
foreach(cell, boundspecs)
{
PartitionBoundSpec *spec = castNode(PartitionBoundSpec,
@@ -332,12 +329,12 @@ RelationBuildPartitionDesc(Relation rel)
true);
upper = make_one_range_bound(key, i, spec->upperdatums,
false);
- all_bounds[j] = lower;
- all_bounds[j + 1] = upper;
- j += 2;
+ all_bounds[ndatums++] = lower;
+ all_bounds[ndatums++] = upper;
i++;
}
- Assert(j == 2 * nparts);
+
+ Assert(ndatums == nparts * 2);
/* Sort all the bounds in ascending order */
qsort_arg(all_bounds, 2 * nparts,
@@ -345,13 +342,12 @@ RelationBuildPartitionDesc(Relation rel)
qsort_partition_rbound_cmp,
(void *) key);
- /*
- * Count the number of distinct bounds to allocate an array of
- * that size.
- */
- ndatums = 0;
+ /* Save distinct bounds from all_bounds into rbounds. */
+ rbounds = (PartitionRangeBound **)
+ palloc(ndatums * sizeof(PartitionRangeBound *));
+ k = 0;
prev = NULL;
- for (i = 0; i < 2 * nparts; i++)
+ for (i = 0; i < ndatums; i++)
{
PartitionRangeBound *cur = all_bounds[i];
bool is_distinct = false;
@@ -388,34 +384,18 @@ RelationBuildPartitionDesc(Relation rel)
}
/*
- * Count the current bound if it is distinct from the previous
- * one. Also, store if the index i contains a distinct bound
- * that we'd like put in the relcache array.
+ * Only if the bound is distinct save it into a temporary
+ * array i.e. rbounds which is later copied into boundinfo
+ * datums array.
*/
if (is_distinct)
- {
- distinct_indexes[i] = true;
- ndatums++;
- }
- else
- distinct_indexes[i] = false;
+ rbounds[k++] = all_bounds[i];
prev = cur;
}
- /*
- * Finally save them in an array from where they will be copied
- * into the relcache.
- */
- rbounds = (PartitionRangeBound **) palloc(ndatums *
- sizeof(PartitionRangeBound *));
- k = 0;
- for (i = 0; i < 2 * nparts; i++)
- {
- if (distinct_indexes[i])
- rbounds[k++] = all_bounds[i];
- }
- Assert(k == ndatums);
+ /* Update ndatums to hold the count of distinct datums. */
+ ndatums = k;
}
else
elog(ERROR, "unexpected partition strategy: %d",