mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Fix Memoize to work with partitionwise joining.
A couple of places weren't up to speed for this. By sheer good luck, we didn't fail but just selected a non-memoized join plan, at least in the test case we have. Nonetheless, it's a bug, and I'm not quite sure that it couldn't have worse consequences in other examples. So back-patch to v14 where Memoize came in. Richard Guo Discussion: https://postgr.es/m/CAMbWs48GkNom272sfp0-WeD6_0HSR19BJ4H1c9ZKSfbVnJsvRg@mail.gmail.com
This commit is contained in:
@@ -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,
|
||||
|
@@ -4193,6 +4193,7 @@ do { \
|
||||
|
||||
FLAT_COPY_PATH(mpath, path, MemoizePath);
|
||||
REPARAMETERIZE_CHILD_PATH(mpath->subpath);
|
||||
ADJUST_CHILD_ATTRS(mpath->param_exprs);
|
||||
new_path = (Path *) mpath;
|
||||
}
|
||||
break;
|
||||
|
Reference in New Issue
Block a user