summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/joinpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path/joinpath.c')
-rw-r--r--src/backend/optimizer/path/joinpath.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 511c7349805..43833ea9c9f 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -318,18 +318,15 @@ add_paths_to_joinrel(PlannerInfo *root,
*/
static inline bool
allow_star_schema_join(PlannerInfo *root,
- Path *outer_path,
- Path *inner_path)
+ Relids outerrelids,
+ Relids inner_paramrels)
{
- Relids innerparams = PATH_REQ_OUTER(inner_path);
- Relids outerrelids = outer_path->parent->relids;
-
/*
* It's a star-schema case if the outer rel provides some but not all of
* the inner rel's parameterization.
*/
- return (bms_overlap(innerparams, outerrelids) &&
- bms_nonempty_difference(innerparams, outerrelids));
+ return (bms_overlap(inner_paramrels, outerrelids) &&
+ bms_nonempty_difference(inner_paramrels, outerrelids));
}
/*
@@ -348,6 +345,12 @@ try_nestloop_path(PlannerInfo *root,
{
Relids required_outer;
JoinCostWorkspace workspace;
+ RelOptInfo *innerrel = inner_path->parent;
+ RelOptInfo *outerrel = outer_path->parent;
+ Relids innerrelids = innerrel->relids;
+ Relids outerrelids = outerrel->relids;
+ Relids inner_paramrels = PATH_REQ_OUTER(inner_path);
+ Relids outer_paramrels = PATH_REQ_OUTER(outer_path);
/*
* Check to see if proposed path is still parameterized, and reject if the
@@ -356,14 +359,12 @@ try_nestloop_path(PlannerInfo *root,
* doesn't like the look of it, which could only happen if the nestloop is
* still parameterized.
*/
- required_outer = calc_nestloop_required_outer(outer_path,
- inner_path);
+ required_outer = calc_nestloop_required_outer(outerrelids, outer_paramrels,
+ innerrelids, inner_paramrels);
if (required_outer &&
((!bms_overlap(required_outer, extra->param_source_rels) &&
- !allow_star_schema_join(root, outer_path, inner_path)) ||
- have_dangerous_phv(root,
- outer_path->parent->relids,
- PATH_REQ_OUTER(inner_path))))
+ !allow_star_schema_join(root, outerrelids, inner_paramrels)) ||
+ have_dangerous_phv(root, outerrelids, inner_paramrels)))
{
/* Waste no memory when we reject a path here */
bms_free(required_outer);