0002-refactor_get_rel_partition.patch
application/octet-stream
Filename: 0002-refactor_get_rel_partition.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch 0002
| File | + | − |
|---|---|---|
| src/backend/optimizer/path/allpaths.c | 40 | 31 |
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 6e5efe9..2bb3641 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -846,50 +846,28 @@ set_foreign_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
rel->fdwroutine->GetForeignPaths(root, rel, rte->relid);
}
-/*
- * get_rel_partitions
- * Return the list of partitions of rel that pass the query clauses
- *
- * Returned list contains the AppendInfos of the chosen partitions.
- */
-static List *
-get_rel_partitions(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
+static void
+get_matching_clause(RelOptInfo *rel, List *clauses, List **matchedclauses,
+ NullTestType *keynullness)
{
- Relation parent = heap_open(rte->relid, NoLock);
- PartitionDesc partdesc = RelationGetPartitionDesc(parent);
- List *indexes;
- List *result = NIL;
- ListCell *lc1,
- *lc2;
+ ListCell *lc;
int keyPos;
- List *matchedclauses[PARTITION_MAX_KEYS];
- NullTestType keynullness[PARTITION_MAX_KEYS];
- Datum minkeys[PARTITION_MAX_KEYS],
- maxkeys[PARTITION_MAX_KEYS];
- bool need_next_min,
- need_next_max,
- minkey_set[PARTITION_MAX_KEYS],
- maxkey_set[PARTITION_MAX_KEYS],
- min_incl,
- max_incl;
- int n_minkeys = 0,
- n_maxkeys = 0,
- i;
+ int i;
/*
* Match individual OpExprs in the query's restriction with individual
* partition key columns. There is one list per key.
*/
- memset(keynullness, -1, sizeof(keynullness));
- memset(matchedclauses, 0, sizeof(matchedclauses));
+ memset(keynullness, -1, PARTITION_MAX_KEYS * sizeof(NullTestType));
+ memset(matchedclauses, 0, PARTITION_MAX_KEYS * sizeof(List*));
keyPos = 0;
for (i = 0; i < rel->part_scheme->partnatts; i++)
{
Node *partkey = linitial(rel->partexprs[i]);
- foreach(lc2, rel->baserestrictinfo)
+ foreach(lc, clauses)
{
- RestrictInfo *rinfo = lfirst(lc2);
+ RestrictInfo *rinfo = lfirst(lc);
Expr *clause = rinfo->clause;
if (is_opclause(clause))
@@ -948,6 +926,37 @@ get_rel_partitions(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
/* Onto finding clauses matching the next partition key. */
keyPos++;
}
+}
+
+/*
+ * get_rel_partitions
+ * Return the list of partitions of rel that pass the query clauses
+ *
+ * Returned list contains the AppendInfos of the chosen partitions.
+ */
+static List *
+get_rel_partitions(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
+{
+ Relation parent = heap_open(rte->relid, NoLock);
+ List *indexes;
+ List *result = NIL;
+ ListCell *lc1;
+ List *matchedclauses[PARTITION_MAX_KEYS];
+ NullTestType keynullness[PARTITION_MAX_KEYS];
+ Datum minkeys[PARTITION_MAX_KEYS],
+ maxkeys[PARTITION_MAX_KEYS];
+ bool need_next_min,
+ need_next_max,
+ minkey_set[PARTITION_MAX_KEYS],
+ maxkey_set[PARTITION_MAX_KEYS],
+ min_incl,
+ max_incl;
+ int n_minkeys = 0,
+ n_maxkeys = 0,
+ i;
+
+ get_matching_clause(rel, rel->baserestrictinfo, matchedclauses,
+ keynullness);
/*
* Determine the min keys and the max keys using btree semantics-based