diff options
Diffstat (limited to 'src/backend/optimizer/path/joinpath.c')
-rw-r--r-- | src/backend/optimizer/path/joinpath.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index 2a3f0ab7bfc..cda9d4c1a8f 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -505,6 +505,7 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, Path *outer_path, JoinType jointype, JoinPathExtraData *extra) { + RelOptInfo *top_outerrel; List *param_exprs; List *hash_operators; ListCell *lc; @@ -594,10 +595,21 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, return NULL; } + /* + * When considering a partitionwise join, we have clauses that reference + * the outerrel's top parent not outerrel itself. + */ + if (outerrel->reloptkind == RELOPT_OTHER_MEMBER_REL) + top_outerrel = find_base_rel(root, bms_singleton_member(outerrel->top_parent_relids)); + else if (outerrel->reloptkind == RELOPT_OTHER_JOINREL) + top_outerrel = find_join_rel(root, outerrel->top_parent_relids); + else + top_outerrel = outerrel; + /* Check if we have hash ops for each parameter to the path */ if (paraminfo_get_equal_hashops(root, inner_path->param_info, - outerrel, + top_outerrel, innerrel, ¶m_exprs, &hash_operators, |