From f5d29489ab69ad7a6ab6ad18ebc0ea5e498d37b7 Mon Sep 17 00:00:00 2001 From: aviralgarg05 Date: Mon, 25 May 2026 23:26:55 +0530 Subject: [PATCH] orca: keep parallel semi joins from rewriting to dedup --- .../src/xforms/CXformLeftSemiJoin2InnerJoin.cpp | 15 +++++++++++++++ .../CXformLeftSemiJoin2InnerJoinUnderGb.cpp | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoin.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoin.cpp index 434dc8590b4..b6c4ad350b1 100644 --- a/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoin.cpp +++ b/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoin.cpp @@ -24,6 +24,11 @@ #include "gpopt/operators/CPredicateUtils.h" #include "gpopt/operators/CScalarProjectList.h" +namespace gpdb +{ + bool IsParallelModeOK(void); +} + using namespace gpopt; @@ -63,6 +68,16 @@ CXformLeftSemiJoin2InnerJoin::CXformLeftSemiJoin2InnerJoin(CMemoryPool *mp) CXform::EXformPromise CXformLeftSemiJoin2InnerJoin::Exfp(CExpressionHandle &exprhdl) const { + /* + * In parallel mode, prefer direct semi-join implementations. Rewriting a + * semi-join to an inner join plus dedup can produce unstable ORCA plans + * for parallel queries. + */ + if (gpdb::IsParallelModeOK()) + { + return ExfpNone; + } + if (exprhdl.HasOuterRefs() || exprhdl.DeriveHasSubquery(2)) { return ExfpNone; diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoinUnderGb.cpp b/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoinUnderGb.cpp index f5f225572ee..b6755b36b89 100644 --- a/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoinUnderGb.cpp +++ b/src/backend/gporca/libgpopt/src/xforms/CXformLeftSemiJoin2InnerJoinUnderGb.cpp @@ -24,6 +24,11 @@ #include "gpopt/operators/CPredicateUtils.h" #include "gpopt/operators/CScalarProjectList.h" +namespace gpdb +{ + bool IsParallelModeOK(void); +} + using namespace gpopt; //--------------------------------------------------------------------------- @@ -60,6 +65,16 @@ CXformLeftSemiJoin2InnerJoinUnderGb::CXformLeftSemiJoin2InnerJoinUnderGb( CXform::EXformPromise CXformLeftSemiJoin2InnerJoinUnderGb::Exfp(CExpressionHandle &exprhdl) const { + /* + * In parallel mode, prefer direct semi-join implementations. Rewriting a + * semi-join to an inner join plus dedup can produce unstable ORCA plans + * for parallel queries. + */ + if (gpdb::IsParallelModeOK()) + { + return ExfpNone; + } + CColRefSet *pcrsInnerOutput = exprhdl.DeriveOutputColumns(1); CExpression *pexprScalar = exprhdl.PexprScalarExactChild(2); CAutoMemoryPool amp;