Tighten up some code in RelationBuildPartitionDesc.
This probably doesn't save anything meaningful in terms of performance, but making the code simpler is a good idea anyway. Code by Beena Emerson, extracted from a larger patch by Jeevan Ladhe, slightly adjusted by me. Discussion: http://postgr.es/m/CAOgcT0ONgwajdtkoq+AuYkdTPY9cLWWLjxt_k4SXue3eieAr+g@mail.gmail.com
This commit is contained in:
parent
9d6b160d7d
commit
0cb8b7531d
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user