diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index f1d71bc54e..bfafb4cf7f 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -3198,6 +3198,8 @@ show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es) appendStringInfo(es->str, "Cache Mode: %s\n", mstate->binary_mode ? "binary" : "logical"); } + ExplainPropertyBool("SingleRow", mstate->singlerow, es); + pfree(keystr.data); if (!es->analyze) diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index b2916ad690..09d7b71cab 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -682,12 +682,45 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, &hash_operators, &binary_mode)) { + bool singlerow; + + if (extra->inner_unique) + { + Relids inner_req_outer = PATH_REQ_OUTER(inner_path); + + singlerow = true; + + if (bms_overlap(inner_req_outer, outer_path->parent->relids)) + { + + Bitmapset *enforced_serials; + ListCell *lc; + + enforced_serials = get_param_path_clause_serials(inner_path); + + foreach (lc, extra->restrictlist) + { + RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc); + + if (!bms_is_member(rinfo->rinfo_serial, enforced_serials)) + { + singlerow = false; + break; + } + } + } + } + else + { + singlerow = false; + } + return (Path *) create_memoize_path(root, innerrel, inner_path, param_exprs, hash_operators, - extra->inner_unique, + singlerow, binary_mode, outer_path->rows); }