1
0
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:
Tom Lane
2022-12-05 12:36:41 -05:00
parent 74a600a150
commit c959f84c2b
5 changed files with 74 additions and 3 deletions

View File

@@ -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,
&param_exprs,
&hash_operators,

View File

@@ -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;