v44_drowley_review.patch
application/octet-stream
Filename: v44_drowley_review.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v44
| File | + | − |
|---|---|---|
| src/backend/catalog/partition.c | 24 | 32 |
| src/backend/optimizer/util/partprune.c | 5 | 5 |
diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c
index 363b12836b..79cda9cecd 100644
--- a/src/backend/catalog/partition.c
+++ b/src/backend/catalog/partition.c
@@ -1673,9 +1673,9 @@ get_matching_partitions(PartitionPruneContext *context,
/*
* Allocate space for individual pruning steps to store its result. Each
* slot will hold a PruneStepResult after performing a given pruning step.
- * Later steps may use the result of one or more earlier steps. Result of
- * of applying all pruning steps is the value contained in the slot of the
- * last pruning step.
+ * Later steps may use the result of one or more earlier steps. The
+ * result of applying all pruning steps is the value contained in the slot
+ * of the last pruning step.
*/
step_results = (PruneStepResult **)
palloc0(num_steps * sizeof(PruneStepResult *));
@@ -1705,10 +1705,9 @@ get_matching_partitions(PartitionPruneContext *context,
}
/*
- * At this point we know that offsets of all the datums whose
- * corresponding partitions need to be in the result, including special
- * null-accepting and default partitions. Collect the actual partition
- * indexes now.
+ * At this point we know the offsets of all the datums whose corresponding
+ * partitions need to be in the result, including special null-accepting
+ * and default partitions. Collect the actual partition indexes now.
*/
i = -1;
result = NULL;
@@ -1819,7 +1818,9 @@ perform_pruning_base_step(PartitionPruneContext *context,
if (cmpfn != context->partsupfunc[keyno].fn_oid)
fmgr_info(cmpfn, &partsupfunc[keyno]);
else
- partsupfunc[keyno] = context->partsupfunc[keyno];
+ fmgr_info_copy(&partsupfunc[keyno],
+ &context->partsupfunc[keyno],
+ CurrentMemoryContext);
values[keyno] = datum;
nvalues++;
@@ -1985,11 +1986,11 @@ perform_pruning_combine_step(PartitionPruneContext *context,
source = step_results[source_step_id];
Assert(source != NULL);
- /* First add possible datum offsets. */
+ /* First add all possible datum offsets. */
result->datum_offsets =
bms_add_range(NULL, 0,
boundinfo->ndatums - 1);
- /* Then remove from it those present in the source. */
+ /* Then remove the members present in source. */
result->datum_offsets =
bms_del_members(result->datum_offsets,
source->datum_offsets);
@@ -2037,7 +2038,7 @@ partkey_datum_from_expr(PartitionPruneContext *context,
* Determine offset of the hash bound matching the specified value,
* considering that all the non-null values come from clauses containing
* a compatible hash eqaulity operator and any keys that are null come
- * from a IS NULL clause
+ * from an IS NULL clause
*
* In most cases, the result would contain just one bound's offset, although
* the set may be empty if the corresponding hash partition has not been
@@ -2149,17 +2150,10 @@ get_matching_list_bounds(PartitionPruneContext *context,
* the former doesn't exist.
*/
if (partition_bound_accepts_nulls(boundinfo))
- {
result->scan_null = true;
- return result;
- }
else if (partition_bound_has_default(boundinfo))
- {
result->scan_default = true;
- return result;
- }
- else
- return result;
+ return result;
}
/*
@@ -2335,7 +2329,7 @@ get_matching_range_bounds(PartitionPruneContext *context,
result = (PruneStepResult *) palloc0(sizeof(PruneStepResult));
/*
- * If there are no datums to compare keys with, or if we got a IS NULL
+ * If there are no datums to compare keys with, or if we got an IS NULL
* clause just return the default partition, if it exists.
*/
if (boundinfo->ndatums == 0 || !bms_is_empty(nullkeys))
@@ -2506,8 +2500,13 @@ get_matching_range_bounds(PartitionPruneContext *context,
if (partition_bound_has_default(boundinfo))
{
for (i = minoff; i <= maxoff; i++)
+ {
if (partindices[i] < 0)
+ {
result->scan_default = true;
+ break;
+ }
+ }
}
Assert(minoff >= 0 && maxoff >= 0);
@@ -2517,24 +2516,17 @@ get_matching_range_bounds(PartitionPruneContext *context,
else if (off >= 0) /* !is_equal */
{
/*
- * Look-up value falls in the range between some bounds in
- * boundinfo. off would be the offset of the greatest
+ * The look-up value falls in the range between some bounds in
+ * boundinfo. 'off' would be the offset of the greatest
* bound that is <= look-up value, so add off + 1 to the
* result instead as the offset of the upper bound of the
* only partition that may contain the look-up value.
*/
if (partindices[off + 1] >= 0)
- {
result->datum_offsets = bms_make_singleton(off + 1);
- return result;
- }
else if (partition_bound_has_default(boundinfo))
- {
result->scan_default = true;
- return result;
- }
- else
- return result;
+ return result;
}
/*
* off < 0, meaning the look-up value is smaller that all bounds,
@@ -2683,8 +2675,8 @@ get_matching_range_bounds(PartitionPruneContext *context,
maxoff = inclusive ? off + 1: off;
}
/*
- * Look-up value falls in the range between some bounds in
- * boundinfo. off would be the offset of the greatest
+ * The look-up value falls in the range between some bounds in
+ * boundinfo. 'off' would be the offset of the greatest
* bound that is <= look-up value, so add off + 1 to the
* result instead as the offset of the upper bound of the
* greatest partition that may contain look-up value. If
diff --git a/src/backend/optimizer/util/partprune.c b/src/backend/optimizer/util/partprune.c
index 48fdeacac3..2dd4a3ecf3 100644
--- a/src/backend/optimizer/util/partprune.c
+++ b/src/backend/optimizer/util/partprune.c
@@ -254,7 +254,7 @@ generate_partition_pruning_steps(RelOptInfo *rel, List *clauses,
* If when going through clauses, we find any that are marked as pseudoconstant
* and contains a constant false value, we stop generating any further steps
* and simply return NIL (that is, no pruning steps) after setting *constfalse
- * to true. Caller should consider all partitions as pruned in that case.
+ * to true. The caller should consider all partitions as pruned in that case.
* We may do the same if we find that mutually contradictory clauses are
* present, but were not turned into a pseudoconstant at higher levels.
*
@@ -593,7 +593,7 @@ generate_partition_pruning_steps_internal(RelOptInfo *rel,
unionStep = (PartitionPruneStep *)
generate_pruning_step_combine(context, step_ids,
COMBINE_UNION);
- /* Then slap on a DIFFERENCE combine step. */
+ /* Now add a step to invert the results. */
diffStep = (PartitionPruneStep *)
generate_pruning_step_combine(context,
list_make1_int(unionStep->step_id),
@@ -603,7 +603,7 @@ generate_partition_pruning_steps_internal(RelOptInfo *rel,
}
/*
- * generate_opsteps set to false means no OpExprs were directly presemt in
+ * generate_opsteps set to false means no OpExprs were directly present in
* the input list.
*/
if (!generate_opsteps)
@@ -802,8 +802,8 @@ generate_pruning_steps_from_opexprs(PartitionScheme part_scheme,
}
/*
- * If we've decided that clauses for subsequent partition keys would't
- * be useful for pruning, don't look.
+ * If we've decided that clauses for subsequent partition keys
+ * wouldn't be useful for pruning, don't look.
*/
if (!consider_next_key)
break;