From e32ec05dfe3533eff0932fd2fcbf916cf6912b17 Mon Sep 17 00:00:00 2001
From: Richard Guo <guofenglinux@gmail.com>
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

