summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/relnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/relnode.c')
-rw-r--r--src/backend/optimizer/util/relnode.c59
1 files changed, 57 insertions, 2 deletions
diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c
index e658f27180f..763d39d1429 100644
--- a/src/backend/optimizer/util/relnode.c
+++ b/src/backend/optimizer/util/relnode.c
@@ -107,6 +107,7 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptKind reloptkind)
rel->consider_param_startup = false; /* might get changed later */
rel->consider_parallel = false; /* might get changed later */
rel->reltarget.exprs = NIL;
+ rel->reltarget.sortgrouprefs = NULL;
rel->reltarget.cost.startup = 0;
rel->reltarget.cost.per_tuple = 0;
rel->reltarget.width = 0;
@@ -128,7 +129,6 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptKind reloptkind)
rel->pages = 0;
rel->tuples = 0;
rel->allvisfrac = 0;
- rel->subplan = NULL;
rel->subroot = NULL;
rel->subplan_params = NIL;
rel->serverid = InvalidOid;
@@ -394,6 +394,7 @@ build_join_rel(PlannerInfo *root,
joinrel->consider_param_startup = false;
joinrel->consider_parallel = false;
joinrel->reltarget.exprs = NIL;
+ joinrel->reltarget.sortgrouprefs = NULL;
joinrel->reltarget.cost.startup = 0;
joinrel->reltarget.cost.per_tuple = 0;
joinrel->reltarget.width = 0;
@@ -422,7 +423,6 @@ build_join_rel(PlannerInfo *root,
joinrel->pages = 0;
joinrel->tuples = 0;
joinrel->allvisfrac = 0;
- joinrel->subplan = NULL;
joinrel->subroot = NULL;
joinrel->subplan_params = NIL;
joinrel->serverid = InvalidOid;
@@ -840,6 +840,61 @@ build_empty_join_rel(PlannerInfo *root)
/*
+ * fetch_upper_rel
+ * Build a RelOptInfo describing some post-scan/join query processing,
+ * or return a pre-existing one if somebody already built it.
+ *
+ * An "upper" relation is identified by an UpperRelationKind and a Relids set.
+ * The meaning of the Relids set is not specified here, and very likely will
+ * vary for different relation kinds.
+ *
+ * Most of the fields in an upper-level RelOptInfo are not used and are not
+ * set here (though makeNode should ensure they're zeroes). We basically only
+ * care about fields that are of interest to add_path() and set_cheapest().
+ */
+RelOptInfo *
+fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
+{
+ RelOptInfo *upperrel;
+ ListCell *lc;
+
+ /*
+ * For the moment, our indexing data structure is just a List for each
+ * relation kind. If we ever get so many of one kind that this stops
+ * working well, we can improve it. No code outside this function should
+ * assume anything about how to find a particular upperrel.
+ */
+
+ /* If we already made this upperrel for the query, return it */
+ foreach(lc, root->upper_rels[kind])
+ {
+ upperrel = (RelOptInfo *) lfirst(lc);
+
+ if (bms_equal(upperrel->relids, relids))
+ return upperrel;
+ }
+
+ upperrel = makeNode(RelOptInfo);
+ upperrel->reloptkind = RELOPT_UPPER_REL;
+ upperrel->relids = bms_copy(relids);
+
+ /* cheap startup cost is interesting iff not all tuples to be retrieved */
+ upperrel->consider_startup = (root->tuple_fraction > 0);
+ upperrel->consider_param_startup = false;
+ upperrel->consider_parallel = false; /* might get changed later */
+ upperrel->pathlist = NIL;
+ upperrel->cheapest_startup_path = NULL;
+ upperrel->cheapest_total_path = NULL;
+ upperrel->cheapest_unique_path = NULL;
+ upperrel->cheapest_parameterized_paths = NIL;
+
+ root->upper_rels[kind] = lappend(root->upper_rels[kind], upperrel);
+
+ return upperrel;
+}
+
+
+/*
* find_childrel_appendrelinfo
* Get the AppendRelInfo associated with an appendrel child rel.
*