aboutsummaryrefslogtreecommitdiff
path: root/src/backend/partitioning/partprune.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/partitioning/partprune.c')
-rw-r--r--src/backend/partitioning/partprune.c50
1 files changed, 37 insertions, 13 deletions
diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c
index 5982af4de10..e71a21c0a74 100644
--- a/src/backend/partitioning/partprune.c
+++ b/src/backend/partitioning/partprune.c
@@ -194,8 +194,10 @@ static PruneStepResult *perform_pruning_base_step(PartitionPruneContext *context
static PruneStepResult *perform_pruning_combine_step(PartitionPruneContext *context,
PartitionPruneStepCombine *cstep,
PruneStepResult **step_results);
-static bool match_boolean_partition_clause(Oid partopfamily, Expr *clause,
- Expr *partkey, Expr **outconst);
+static PartClauseMatchStatus match_boolean_partition_clause(Oid partopfamily,
+ Expr *clause,
+ Expr *partkey,
+ Expr **outconst);
static void partkey_datum_from_expr(PartitionPruneContext *context,
Expr *expr, int stateidx,
Datum *value, bool *isnull);
@@ -1623,6 +1625,7 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context,
bool *clause_is_not_null, PartClauseInfo **pc,
List **clause_steps)
{
+ PartClauseMatchStatus boolmatchstatus;
PartitionScheme part_scheme = context->rel->part_scheme;
Oid partopfamily = part_scheme->partopfamily[partkeyidx],
partcoll = part_scheme->partcollation[partkeyidx];
@@ -1631,7 +1634,10 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context,
/*
* Recognize specially shaped clauses that match a Boolean partition key.
*/
- if (match_boolean_partition_clause(partopfamily, clause, partkey, &expr))
+ boolmatchstatus = match_boolean_partition_clause(partopfamily, clause,
+ partkey, &expr);
+
+ if (boolmatchstatus == PARTCLAUSE_MATCH_CLAUSE)
{
PartClauseInfo *partclause;
@@ -2147,7 +2153,21 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context,
return PARTCLAUSE_MATCH_NULLNESS;
}
- return PARTCLAUSE_UNSUPPORTED;
+ /*
+ * If we get here then the return value depends on the result of the
+ * match_boolean_partition_clause call above. If the call returned
+ * PARTCLAUSE_UNSUPPORTED then we're either not dealing with a bool qual
+ * or the bool qual is not suitable for pruning. Since the qual didn't
+ * match up to any of the other qual types supported here, then trying to
+ * match it against any other partition key is a waste of time, so just
+ * return PARTCLAUSE_UNSUPPORTED. If the qual just couldn't be matched to
+ * this partition key, then it may match another, so return
+ * PARTCLAUSE_NOMATCH. The only other value that
+ * match_boolean_partition_clause can return is PARTCLAUSE_MATCH_CLAUSE,
+ * and since that value was already dealt with above, then we can just
+ * return boolmatchstatus.
+ */
+ return boolmatchstatus;
}
/*
@@ -3395,11 +3415,15 @@ perform_pruning_combine_step(PartitionPruneContext *context,
/*
* match_boolean_partition_clause
*
- * Sets *outconst to a Const containing true or false value and returns true if
- * we're able to match the clause to the partition key as specially-shaped
- * Boolean clause. Returns false otherwise with *outconst set to NULL.
+ * If we're able to match the clause to the partition key as specially-shaped
+ * boolean clause, set *outconst to a Const containing a true or false value
+ * and return PARTCLAUSE_MATCH_CLAUSE. Returns PARTCLAUSE_UNSUPPORTED if the
+ * clause is not a boolean clause or if the boolean clause is unsuitable for
+ * partition pruning. Returns PARTCLAUSE_NOMATCH if it's a bool quals but
+ * just does not match this partition key. *outconst is set to NULL in the
+ * latter two cases.
*/
-static bool
+static PartClauseMatchStatus
match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey,
Expr **outconst)
{
@@ -3408,7 +3432,7 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey,
*outconst = NULL;
if (!IsBooleanOpfamily(partopfamily))
- return false;
+ return PARTCLAUSE_UNSUPPORTED;
if (IsA(clause, BooleanTest))
{
@@ -3417,7 +3441,7 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey,
/* Only IS [NOT] TRUE/FALSE are any good to us */
if (btest->booltesttype == IS_UNKNOWN ||
btest->booltesttype == IS_NOT_UNKNOWN)
- return false;
+ return PARTCLAUSE_UNSUPPORTED;
leftop = btest->arg;
if (IsA(leftop, RelabelType))
@@ -3430,7 +3454,7 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey,
: (Expr *) makeBoolConst(false, false);
if (*outconst)
- return true;
+ return PARTCLAUSE_MATCH_CLAUSE;
}
else
{
@@ -3450,10 +3474,10 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey,
*outconst = (Expr *) makeBoolConst(false, false);
if (*outconst)
- return true;
+ return PARTCLAUSE_MATCH_CLAUSE;
}
- return false;
+ return PARTCLAUSE_NOMATCH;
}
/*