v1-delta-2.patch
application/octet-stream
Filename: v1-delta-2.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v1
| File | + | − |
|---|---|---|
| src/backend/partitioning/partprune.c | 32 | 23 |
diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c
index 5c1632f..d8e0043 100644
--- a/src/backend/partitioning/partprune.c
+++ b/src/backend/partitioning/partprune.c
@@ -822,32 +822,13 @@ gen_partprune_steps_internal(GeneratePruningStepsContext *context,
* an arg. To indicate that to the pruning code, we
* must construct a dummy PartitionPruneStepCombine
* whose source_stepids is set to an empty List.
- * However, if we can prove using constraint exclusion
- * that the clause refutes the table's partition
- * constraint (if it's sub-partitioned), we need not
- * bother with that. That is, we effectively ignore
- * this OR arm.
*/
- List *partconstr = rel->partition_qual;
PartitionPruneStep *orstep;
/* Just ignore this argument. */
if (arg_contradictory)
continue;
- if (partconstr)
- {
- partconstr = (List *)
- expression_planner((Expr *) partconstr);
- if (rel->relid != 1)
- ChangeVarNodes((Node *) partconstr, 1,
- rel->relid, 0);
- if (predicate_refuted_by(partconstr,
- list_make1(arg),
- false))
- continue;
- }
-
orstep = gen_prune_step_combine(context, NIL,
PARTPRUNE_COMBINE_UNION);
arg_stepids = lappend_int(arg_stepids, orstep->step_id);
@@ -923,6 +904,7 @@ gen_partprune_steps_internal(GeneratePruningStepsContext *context,
bool clause_is_not_null = false;
PartClauseInfo *pc = NULL;
List *clause_steps = NIL;
+ List *partconstr = rel->partition_qual;
switch (match_clause_to_partition_key(rel, context,
clause, partkey, i,
@@ -933,6 +915,29 @@ gen_partprune_steps_internal(GeneratePruningStepsContext *context,
Assert(pc != NULL);
/*
+ * If this clause can be proved false for this partition,
+ * given its partition constraint, we can ignore it,
+ * that is not try to pass it to the pruning code.
+ * We should do that especially to avoid pruning code
+ * wrongly failing to prune the default partition.
+ */
+ if (partconstr)
+ {
+ partconstr = (List *)
+ expression_planner((Expr *) partconstr);
+ if (rel->relid != 1)
+ ChangeVarNodes((Node *) partconstr, 1,
+ rel->relid, 0);
+ if (predicate_refuted_by(partconstr,
+ list_make1(clause),
+ false))
+ {
+ *contradictory = true;
+ return NIL;
+ }
+ }
+
+ /*
* Since we only allow strict operators, check for any
* contradicting IS NULL.
*/
@@ -2759,15 +2764,19 @@ get_matching_range_bounds(PartitionPruneContext *context,
* instead as the offset of the upper bound of the greatest
* partition that may contain lookup value. If the lookup
* value had exactly matched the bound, but it isn't
- * inclusive, no need add the adjacent partition. If 'off' is
- * -1 indicating that all bounds are greater, then we simply
- * end up adding the first bound's offset, that is, 0.
+ * inclusive, no need add the adjacent partition.
*/
- else if (off < 0 || !is_equal || inclusive)
+ else if (!is_equal || inclusive)
maxoff = off + 1;
else
maxoff = off;
}
+ else
+ /*
+ * 'off' is -1 indicating that all bounds are greater, so just
+ * set the first bound's offset as maxoff.
+ */
+ maxoff = off + 1;
break;
default: