From e32ec05dfe3533eff0932fd2fcbf916cf6912b17 Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Thu, 29 Jun 2023 10:52:59 +0800 Subject: [PATCH v2] Revisions to the checks for parameterized partial paths Parameterized partial paths are not supported, and we have several checks in try_partial_xxx_path functions to enforce this. For a partial nestloop join path, we need to ensure that if the inner path is parameterized, the parameterization is fully satisfied by the proposed outer path. For a partial merge/hashjoin join path, we need to ensure that the inner path is not parameterized. However, the comment in try_partial_hashjoin_path does not describe this correctly. This commit fixes that. In addtion, this commit simplifies the checks peformed in try_partial_hashjoin_path and try_partial_mergejoin_path with the help of macro PATH_REQ_OUTER. In passing, this commit also asserts that the outer path is not parameterized in try_partial_xxx_path functions. --- src/backend/optimizer/path/joinpath.c | 28 ++++++++++----------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index c0ba087b40..f61e6b57b9 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -847,6 +847,7 @@ try_partial_nestloop_path(PlannerInfo *root, * rels are required here. */ Assert(bms_is_empty(joinrel->lateral_relids)); + Assert(bms_is_empty(PATH_REQ_OUTER(outer_path))); if (inner_path->param_info != NULL) { Relids inner_paramrels = inner_path->param_info->ppi_req_outer; @@ -1035,13 +1036,9 @@ try_partial_mergejoin_path(PlannerInfo *root, * See comments in try_partial_hashjoin_path(). */ Assert(bms_is_empty(joinrel->lateral_relids)); - if (inner_path->param_info != NULL) - { - Relids inner_paramrels = inner_path->param_info->ppi_req_outer; - - if (!bms_is_empty(inner_paramrels)) - return; - } + Assert(bms_is_empty(PATH_REQ_OUTER(outer_path))); + if (!bms_is_empty(PATH_REQ_OUTER(inner_path))) + return; /* * If the given paths are already well enough ordered, we can skip doing @@ -1177,19 +1174,14 @@ try_partial_hashjoin_path(PlannerInfo *root, JoinCostWorkspace workspace; /* - * If the inner path is parameterized, the parameterization must be fully - * satisfied by the proposed outer path. Parameterized partial paths are - * not supported. The caller should already have verified that no lateral - * rels are required here. + * If the inner path is parameterized, we can't use a partial hashjoin. + * Parameterized partial paths are not supported. The caller should + * already have verified that no lateral rels are required here. */ Assert(bms_is_empty(joinrel->lateral_relids)); - if (inner_path->param_info != NULL) - { - Relids inner_paramrels = inner_path->param_info->ppi_req_outer; - - if (!bms_is_empty(inner_paramrels)) - return; - } + Assert(bms_is_empty(PATH_REQ_OUTER(outer_path))); + if (!bms_is_empty(PATH_REQ_OUTER(inner_path))) + return; /* * Before creating a path, get a quick lower bound on what it is likely to -- 2.31.0