This is an automated email from the ASF dual-hosted git repository.

maxyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit 0d20361a39028856c098cc1d34eb8e32a2bc693b
Author: Chris Hajas <[email protected]>
AuthorDate: Fri Feb 17 10:27:58 2023 -0800

    Remove unused xforms
    
    Remove unused xform CXformInnerJoin2NLJoin and CXformInnerJoin2HashJoin.
    These were deprecated in favor of CXformImplementInnerJoin and had been
    disabled, but were kept around for use in explicitly disabling inner
    hash/nl joins.
    
    To keep the ability to disable inner hash or nl joins, we do add 2
    traceflags, EopttraceDisableInnerNLJ and EopttraceDisableInnerHashJoin.
    
    Additionally, modified a test slightly to have the same intent as we
    don't have a disable xform command to disable only the inner hash join
    xform. I changed this to a LOJ which maintains the same shape and still
    captures the test intent.
    
    Also, removed some enable/disable_xform commands that weren't relevant
    or weren't valid.
---
 src/backend/gpopt/config/CConfigParamMapping.cpp   |   7 +
 .../minidump/BitmapIndexApply-Basic-SelfJoin.mdp   |   2 +-
 .../minidump/BitmapIndexApply-Basic-TwoTables.mdp  |   2 +-
 .../BitmapIndexApply-Complex-Condition.mdp         |   2 +-
 .../BitmapIndexApply-InnerSelect-Basic.mdp         |   2 +-
 .../BitmapIndexApply-InnerSelect-PartTable.mdp     |   2 +-
 .../dxl/minidump/BitmapIndexApply-PartTable.mdp    |   2 +-
 .../dxl/minidump/BitmapIndexNLJWithProject.mdp     |   2 +-
 .../minidump/BitmapIndexNLJWithProjectNoFilt.mdp   |   2 +-
 .../dxl/minidump/BitmapIndexNLOJWithProject.mdp    |   2 +-
 .../minidump/BitmapIndexNLOJWithProjectNonPart.mdp |   2 +-
 .../gporca/data/dxl/minidump/BitmapIndexScan.mdp   |   2 +-
 .../minidump/BtreeIndexNLJWithProjectNoPart.mdp    |   2 +-
 .../dxl/minidump/BtreeIndexNLOJWithProject.mdp     |   2 +-
 .../dxl/minidump/Correlation-With-Casting-1.mdp    |   2 +-
 .../dxl/minidump/Correlation-With-Casting-2.mdp    |   2 +-
 .../data/dxl/minidump/DynamicBitmapIndexScan.mdp   |   2 +-
 .../minidump/Index-Join-With-Subquery-In-Pred.mdp  |   2 +-
 ...dexApply-Heterogeneous-BothSidesPartitioned.mdp |   2 +-
 .../dxl/minidump/IndexApply-Heterogeneous-DTS.mdp  |   2 +-
 .../minidump/IndexApply-Heterogeneous-NoDTS.mdp    |   2 +-
 .../minidump/IndexApply-IndexOnMasterOnlyTable.mdp |   2 +-
 .../dxl/minidump/IndexApply-InnerSelect-Basic.mdp  |   2 +-
 .../IndexApply-InnerSelect-Heterogeneous-DTS.mdp   |   2 +-
 .../minidump/IndexApply-InnerSelect-PartTable.mdp  |   2 +-
 .../dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp   |   2 +-
 ...pply-MultiDistKeys-IncompletePDS-3-DistCols.mdp |   2 +-
 .../data/dxl/minidump/IndexApply-PartTable.mdp     |   2 +-
 .../minidump/IndexApply1-CalibratedCostModel.mdp   |   2 +-
 .../gporca/data/dxl/minidump/IndexApply1.mdp       |   2 +-
 .../gporca/data/dxl/minidump/IndexApply2.mdp       |   2 +-
 .../gporca/data/dxl/minidump/IndexApply3.mdp       |   2 +-
 .../gporca/data/dxl/minidump/IndexApply4.mdp       |   2 +-
 .../data/dxl/minidump/Join-INDF-NoBroadcast.mdp    |   2 +-
 .../minidump/Join-INDF-Nulls-Not-Collocated.mdp    |   2 +-
 .../data/dxl/minidump/LOJ-DynBitmapIndex.mdp       |   2 +-
 .../dxl/minidump/LOJ-DynBitmapIndexWithSelect.mdp  |   2 +-
 .../minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp  |   2 +-
 .../LOJ-IndexApply-CompsiteKey-NoMotion.mdp        |   2 +-
 .../LOJ-IndexApply-DistKey-Multiple-Predicates.mdp |   2 +-
 .../minidump/LOJ-IndexApply-MasterOnly-Table.mdp   |   2 +-
 .../LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp     |   2 +-
 .../dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp   |   2 +-
 .../LOJ-IndexApply-Negative-NonEqual-Predicate.mdp |   2 +-
 .../dxl/minidump/LOJ-IndexApply-NonDistKey.mdp     |   2 +-
 .../LOJ-IndexApply-WithComplexPredicates.mdp       |   2 +-
 .../data/dxl/minidump/NLJ-DistCol-No-Broadcast.mdp |   2 +-
 .../dxl/minidump/NLJ-EqAllCol-No-Broadcast.mdp     |   2 +-
 .../NLJ-EqDistCol-InEqNonDistCol-No-Broadcast.mdp  |   2 +-
 .../NLJ-InEqDistCol-EqNonDistCol-Redistribute.mdp  |   2 +-
 .../dxl/minidump/NestedNLJWithBlockingSpool.mdp    |   2 +-
 .../gporca/data/dxl/minidump/PartTbl-DPE.mdp       |   2 +-
 .../gporca/data/dxl/minidump/PartTbl-HJ5.mdp       |   2 +-
 src/backend/gporca/data/dxl/search/strategy0.xml   |   4 +-
 .../gporca/libgpopt/include/gpopt/xforms/CXform.h  |   4 +-
 .../gpopt/xforms/CXformInnerJoin2HashJoin.h        |  71 ---------
 .../include/gpopt/xforms/CXformInnerJoin2NLJoin.h  |  71 ---------
 .../gporca/libgpopt/include/gpopt/xforms/xforms.h  |   2 -
 src/backend/gporca/libgpopt/src/xforms/CXform.cpp  |   4 -
 .../gporca/libgpopt/src/xforms/CXformFactory.cpp   |   4 +-
 .../src/xforms/CXformImplementInnerJoin.cpp        |   4 +-
 .../src/xforms/CXformInnerJoin2HashJoin.cpp        |  79 ----------
 .../libgpopt/src/xforms/CXformInnerJoin2NLJoin.cpp |  79 ----------
 src/backend/gporca/libgpopt/src/xforms/Makefile    |   2 -
 .../include/naucrates/traceflags/traceflags.h      |   6 +
 .../src/unittest/gpopt/minidump/CICGTest.cpp       |   3 +-
 .../unittest/gpopt/search/CSearchStrategyTest.cpp  |   2 +-
 .../unittest/gpopt/xforms/CXformFactoryTest.cpp    |   4 +-
 src/test/regress/expected/gporca.out               | 162 +++++++-------------
 src/test/regress/expected/gporca_optimizer.out     | 164 +++++++--------------
 src/test/regress/sql/gporca.sql                    |  37 ++---
 71 files changed, 192 insertions(+), 621 deletions(-)

diff --git a/src/backend/gpopt/config/CConfigParamMapping.cpp 
b/src/backend/gpopt/config/CConfigParamMapping.cpp
index f0364f29b5..a6bbf8d8c5 100644
--- a/src/backend/gpopt/config/CConfigParamMapping.cpp
+++ b/src/backend/gpopt/config/CConfigParamMapping.cpp
@@ -301,6 +301,13 @@ CConfigParamMapping::SConfigMappingElem 
CConfigParamMapping::m_elements[] = {
         false,  // m_negate_param
         GPOS_WSZ_LIT(
                 "Enable use the distribution key in DQA")},
+       {EopttraceDisableInnerHashJoin, &optimizer_enable_hashjoin,
+        true,  // m_negate_param
+        GPOS_WSZ_LIT("Explore hash join alternatives")},
+       {EopttraceDisableInnerNLJ, &optimizer_enable_nljoin,
+        true,  // m_negate_param
+        GPOS_WSZ_LIT("Enable nested loop join alternatives")},
+
 };
 
 //---------------------------------------------------------------------------
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-SelfJoin.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-SelfJoin.mdp
index ea9f7deeaa..8cab11517d 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-SelfJoin.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-SelfJoin.mdp
@@ -17,7 +17,7 @@ explain SELECT * FROM t i1, t t2 where t2.c2 = i1.c2;
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102025,102027,102029,102121,102144,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102025,103046,103045,102121,102144,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-TwoTables.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-TwoTables.mdp
index ac0fd9017b..919bc5ed3f 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-TwoTables.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Basic-TwoTables.mdp
@@ -26,7 +26,7 @@ explain SELECT * FROM s i1, t t2 where t2.c2 = i1.c2;
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102029,102144,103001,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,103045,102144,103001,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.29842177.1.1" Name="s" Rows="0.000000" 
EmptyRelation="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Complex-Condition.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Complex-Condition.mdp
index bdb175d22d..a76359f476 100644
--- 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Complex-Condition.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-Complex-Condition.mdp
@@ -27,7 +27,7 @@ EXPLAIN SELECT * FROM s i1, t t2 where t2.c2 = i1.c2  and 
t2.c3 > i1.c3 or t2.c1
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102029,102144,103001,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,103045,102144,103001,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:ColumnStatistics Mdid="1.31264029.1.1.13" Name="gp_segment_id" 
Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" 
FreqRemain="0.000000"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-Basic.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-Basic.mdp
index cbe9572ea1..e0ffe3a9ca 100644
--- 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-Basic.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-Basic.mdp
@@ -21,7 +21,7 @@ select * from x, y where x.i > y.j and y.k = 10;
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102029,102120,102144,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,103045,102120,102144,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
index 6196a3ff6d..d3992bdc50 100644
--- 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
@@ -22,7 +22,7 @@ select * from x, y where x.i > y.j and y.k = 10;
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags Value="103027,102027,102029,102120,103014,103015"/>
+      <dxl:TraceFlags Value="103027,103046,103045,102120,103014,103015"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp
index 93373a8155..91328f9f62 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp
@@ -50,7 +50,7 @@ ORDER BY 1 asc ;
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/>
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102027,102029,102115,102116,102117,102119,102144,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,103046,103045,102115,102116,102117,102119,102144,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Relation Mdid="6.16166659.1.0" Name="my_tq_agg_small" 
IsTemporary="false" StorageType="Heap" DistributionPolicy="Hash" 
DistributionColumns="0" Keys="10,11,5" PartitionColumns="2" PartitionTypes="r">
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp
index f5981dfd20..6a269d1901 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp
@@ -54,7 +54,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:ColumnStatistics Mdid="1.32977.1.0.3" Name="part_d" 
Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" 
ColStatsMissing="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp
index 620e0b3485..6bdf106138 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp
@@ -52,7 +52,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.525.1.0" Name="&gt;=" ComparisonType="GEq" 
ReturnsNullOnNullInput="true" IsNDVPreserving="false">
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp
index 39bedc76c8..b13caf579c 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp
@@ -53,7 +53,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProjectNonPart.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProjectNonPart.mdp
index 88cc602bf3..052b0213c3 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProjectNonPart.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProjectNonPart.mdp
@@ -51,7 +51,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102029,102046,102048,102053,102054,102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000,102157,102158"/>
+      <dxl:TraceFlags 
Value="101013,103045,102046,102048,102053,102054,102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000,102157,102158"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexScan.mdp 
b/src/backend/gporca/data/dxl/minidump/BitmapIndexScan.mdp
index 18fb2b4dfa..500af06f9f 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexScan.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexScan.mdp
@@ -14,7 +14,7 @@ see sql/BitmapIndexScan.sql
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102029,102120,102144,103001,103014,103015,103022,103027,103033,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,103045,102120,102144,103001,103014,103015,103022,103027,103033,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:ColumnStatistics Mdid="1.24783.1.1.7" Name="gp_segment_id" 
Width="4.000000" NullFreq="0.000000" NdvRemain="3.000000" FreqRemain="1.000000" 
ColStatsMissing="false"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp 
b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp
index 647fa0aa0f..2f5cc28044 100644
--- a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp
@@ -49,7 +49,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102029,102046,102048,102053,102054,102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,103045,102046,102048,102053,102054,102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp 
b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp
index 2580894b20..9d6498bce4 100644
--- a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp
@@ -54,7 +54,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:ColumnStatistics Mdid="1.33136.1.0.1" Name="f" Width="4.000000" 
NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" 
ColStatsMissing="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-1.mdp 
b/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-1.mdp
index 46a2773066..c020ce6ae0 100644
--- a/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-1.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-1.mdp
@@ -24,7 +24,7 @@ AND u_folio = (SELECT max(u_folio)  FROM q68t792_temp c WHERE 
a.u_vtgnr = c.u_vt
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="103027,101013,102024,102025,102029,102115,102116,102120,102128,102130,103001,103014,103015"/>
+      <dxl:TraceFlags 
Value="103027,101013,102024,102025,103045,102115,102116,102120,102128,102130,103001,103014,103015"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:ColumnStatistics Mdid="1.32935853.1.1.5" Name="cmin" 
Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" 
FreqRemain="0.000000"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-2.mdp 
b/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-2.mdp
index a9a38544a3..a271d73fe1 100644
--- a/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Correlation-With-Casting-2.mdp
@@ -24,7 +24,7 @@ AND u_folio = (SELECT max(u_folio)  FROM q68t792_temp c WHERE 
a.u_vtgnr <> c.u_v
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102024,102025,102029,102115,102116,102120,102128,102130,102144,103001,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102024,102025,103045,102115,102116,102120,102128,102130,102144,103001,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:ColumnStatistics Mdid="1.32935853.1.1.5" Name="cmin" 
Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" 
FreqRemain="0.000000"/>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp 
b/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp
index 499d743f11..5e6bca33c7 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp
@@ -14,7 +14,7 @@ see sql/DynamicBitmapIndexScan.sql
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102029,102120,102144,103001,103014,103015,103022,103027,103033,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,103045,102120,102144,103001,103014,103015,103022,103027,103033,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.17408.1.1" Name="foo" Rows="1.000000" 
EmptyRelation="false"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/Index-Join-With-Subquery-In-Pred.mdp 
b/src/backend/gporca/data/dxl/minidump/Index-Join-With-Subquery-In-Pred.mdp
index 94b58101e0..32c025ada7 100644
--- a/src/backend/gporca/data/dxl/minidump/Index-Join-With-Subquery-In-Pred.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Index-Join-With-Subquery-In-Pred.mdp
@@ -43,7 +43,7 @@ Optimizer: Pivotal Optimizer (GPORCA)
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.523.1.0" Name="&lt;=" ComparisonType="LEq" 
ReturnsNullOnNullInput="true" IsNDVPreserving="false">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-BothSidesPartitioned.mdp
 
b/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-BothSidesPartitioned.mdp
index e807971a76..a37e1afc62 100644
--- 
a/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-BothSidesPartitioned.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-BothSidesPartitioned.mdp
@@ -33,7 +33,7 @@ select * from x, y where (x.i > y.j);
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="103027,101013,102024,102025,102029,102115,102116,102120,102128,102134,102135,102136,103001,103014,103015,103020"/>
+      <dxl:TraceFlags 
Value="103027,101013,102024,102025,103045,102115,102116,102120,102128,102134,102135,102136,103001,103014,103015,103020"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-DTS.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-DTS.mdp
index 4c0ae165ac..e224a74e88 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-DTS.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-DTS.mdp
@@ -50,7 +50,7 @@ WHERE tt.event_ts &gt;= tq.ets AND
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/>
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102024,102025,102029,102144,103027,103033"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102024,102025,103045,102144,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-NoDTS.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-NoDTS.mdp
index 8b81884eba..172e14bc9f 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-NoDTS.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-Heterogeneous-NoDTS.mdp
@@ -50,7 +50,7 @@ ORDER BY 1 asc ;
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/>
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102025,102027,102029,102144,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102025,103046,103045,102144,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-IndexOnMasterOnlyTable.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-IndexOnMasterOnlyTable.mdp
index 1a5e0a25fb..b96e8d3941 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-IndexOnMasterOnlyTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-IndexOnMasterOnlyTable.mdp
@@ -6,7 +6,7 @@
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/> 
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.28.1.0" Name="xid" IsRedistributable="false" 
IsHashable="true" IsMergeJoinable="false" IsComposite="false" 
IsFixedLength="true" Length="4" PassByValue="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Basic.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Basic.mdp
index 31cdfd6055..ec6e7f6b39 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Basic.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Basic.mdp
@@ -26,7 +26,7 @@ explain SELECT * FROM s i1, t t2 where t2.c2 = i1.c2 and 
t2.c1 > 10;
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102029,102115,102116,102128,102144,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,103045,102115,102116,102128,102144,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Heterogeneous-DTS.mdp
 
b/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Heterogeneous-DTS.mdp
index 3d5012ba5a..621d2c3bbb 100644
--- 
a/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Heterogeneous-DTS.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-Heterogeneous-DTS.mdp
@@ -48,7 +48,7 @@ WHERE tt.event_ts >= tq.ets AND
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="103027,101013,102024,102029,102115,102116,102130,102131,103014,103015"/>
+      <dxl:TraceFlags 
Value="103027,101013,102024,103045,102115,102116,102130,102131,103014,103015"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-PartTable.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-PartTable.mdp
index 212ca765a8..4bae5be031 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-PartTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-InnerSelect-PartTable.mdp
@@ -29,7 +29,7 @@ SELECT * FROM s i1, t t2 where t2.c2 = i1.c2 and t2.c1 > 10;
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102029,102115,102116,102128,102144,103014,103015,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,103045,102115,102116,102128,102144,103014,103015,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.32553346.1.1" Name="t" Rows="0.000000" 
EmptyRelation="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp
index 58570ca55d..f3b3719563 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp
@@ -65,7 +65,7 @@ explain select * from t0 left join t1 on t0.a=t1.a left join 
t2 on (t2.a=t0.a an
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Index Mdid="0.195590.1.0" Name="t1_pkey" IsClustered="false" 
IndexType="B-tree" KeyColumns="0" IncludedColumns="0,1,2,3,4,5,6,7,8">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply-MultiDistKeys-IncompletePDS-3-DistCols.mdp
 
b/src/backend/gporca/data/dxl/minidump/IndexApply-MultiDistKeys-IncompletePDS-3-DistCols.mdp
index bdac8c7f2a..aa0c9023dc 100644
--- 
a/src/backend/gporca/data/dxl/minidump/IndexApply-MultiDistKeys-IncompletePDS-3-DistCols.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/IndexApply-MultiDistKeys-IncompletePDS-3-DistCols.mdp
@@ -33,7 +33,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.97.1.0" Name="&lt;" ComparisonType="LT" 
ReturnsNullOnNullInput="true">
diff --git a/src/backend/gporca/data/dxl/minidump/IndexApply-PartTable.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply-PartTable.mdp
index cda4d44286..8441c02c99 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply-PartTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply-PartTable.mdp
@@ -51,7 +51,7 @@ ORDER BY 1 asc ;
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/>
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102027,102029,102115,102116,102117,102119,102144,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,103046,103045,102115,102116,102117,102119,102144,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Relation Mdid="6.16166659.1.0" Name="my_tq_agg_small" 
IsTemporary="false" StorageType="Heap" DistributionPolicy="Hash" 
DistributionColumns="0" Keys="10,11,5" PartitionColumns="2" PartitionTypes="r">
diff --git 
a/src/backend/gporca/data/dxl/minidump/IndexApply1-CalibratedCostModel.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply1-CalibratedCostModel.mdp
index 93ea741246..581329cd6d 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply1-CalibratedCostModel.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply1-CalibratedCostModel.mdp
@@ -11,7 +11,7 @@
           <dxl:CostParam Name="NLJFactor" Value="1.000000" 
LowerBound="0.500000" UpperBound="1.500000"/>
         </dxl:CostParams>
       </dxl:CostModelConfig>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="4" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/IndexApply1.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply1.mdp
index c63c286790..5b84776bd4 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply1.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply1.mdp
@@ -6,7 +6,7 @@
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/> 
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="4" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/IndexApply2.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply2.mdp
index c5bdbca5da..149ecd9c6c 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply2.mdp
@@ -6,7 +6,7 @@
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/> 
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="4" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/IndexApply3.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply3.mdp
index 1f2c33140b..0c3aedb230 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply3.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply3.mdp
@@ -6,7 +6,7 @@
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/> 
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="4" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/IndexApply4.mdp 
b/src/backend/gporca/data/dxl/minidump/IndexApply4.mdp
index c485301f4d..bede215865 100644
--- a/src/backend/gporca/data/dxl/minidump/IndexApply4.mdp
+++ b/src/backend/gporca/data/dxl/minidump/IndexApply4.mdp
@@ -6,7 +6,7 @@
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/> 
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="4" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/Join-INDF-NoBroadcast.mdp 
b/src/backend/gporca/data/dxl/minidump/Join-INDF-NoBroadcast.mdp
index 5580929fd8..c6ca977338 100644
--- a/src/backend/gporca/data/dxl/minidump/Join-INDF-NoBroadcast.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Join-INDF-NoBroadcast.mdp
@@ -21,7 +21,7 @@ select * from foo, bar where foo.a is not distinct from bar.a;
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.32768.1.0" Name="t1" Rows="0.000000" 
EmptyRelation="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/Join-INDF-Nulls-Not-Collocated.mdp 
b/src/backend/gporca/data/dxl/minidump/Join-INDF-Nulls-Not-Collocated.mdp
index b371a59988..91fd16c282 100644
--- a/src/backend/gporca/data/dxl/minidump/Join-INDF-Nulls-Not-Collocated.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Join-INDF-Nulls-Not-Collocated.mdp
@@ -21,7 +21,7 @@ select * from foo, (select NULL a from bar) other where foo.a 
is not distinct fr
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndex.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndex.mdp
index e7ddf4d36f..5212f3a27a 100644
--- a/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndex.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndex.mdp
@@ -50,7 +50,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102029,102046,102048,102053,102054,102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,103045,102046,102048,102053,102054,102074,102120,102146,102152,103001,103014,103022,103027,103029,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.525.1.0" Name="&gt;=" ComparisonType="GEq" 
ReturnsNullOnNullInput="true" IsNDVPreserving="false">
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndexWithSelect.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndexWithSelect.mdp
index e5a51798e4..4485005b68 100644
--- a/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndexWithSelect.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LOJ-DynBitmapIndexWithSelect.mdp
@@ -50,7 +50,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.525.1.0" Name="&gt;=" ComparisonType="GEq" 
ReturnsNullOnNullInput="true" IsNDVPreserving="false">
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp
index db753af4d5..3442c52380 100644
--- a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp
@@ -40,7 +40,7 @@ explain select * from foo left join bar on foo.a = bar.a and 
foo.b = bar.b left
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="103027,101013,102029,102046,102048,102053,102054,102120,103001,103014,103015,103022,104003,104004,104005,105000,102157,102158"/>
+      <dxl:TraceFlags 
Value="103027,101013,103045,102046,102048,102053,102054,102120,103001,103014,103015,103022,104003,104004,104005,105000,102157,102158"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-NoMotion.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-NoMotion.mdp
index fb38b107c8..ff6bdd0ee6 100644
--- 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-NoMotion.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-CompsiteKey-NoMotion.mdp
@@ -43,7 +43,7 @@ explain select * from foo left join bar on foo.a = bar.a and 
foo.b = bar.b left
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10" XformBindThreshold="0"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102043,102046,102048,102053,102054,102074,102120,102144,102157,102158,103001,103014,103022,103026,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102043,102046,102048,102053,102054,102074,102120,102144,102157,102158,103001,103014,103022,103026,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-DistKey-Multiple-Predicates.mdp
 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-DistKey-Multiple-Predicates.mdp
index 1c7e9992f9..54138cc873 100644
--- 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-DistKey-Multiple-Predicates.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-DistKey-Multiple-Predicates.mdp
@@ -44,7 +44,7 @@ explain select * from foo left join bar on bar.a=foo.a and 
bar.a<foo.b left oute
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10" XformBindThreshold="0"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102043,102046,102048,102053,102054,102074,102120,102144,102157,102158,103001,103014,103022,103026,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102043,102046,102048,102053,102054,102074,102120,102144,102157,102158,103001,103014,103022,103026,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.49159.1.0" Name="bar" Rows="0.000000" 
RelPages="0" RelAllVisible="0" EmptyRelation="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MasterOnly-Table.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MasterOnly-Table.mdp
index 62edb96d99..2c85dcdad9 100644
--- a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MasterOnly-Table.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MasterOnly-Table.mdp
@@ -45,7 +45,7 @@ union all
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102120,102144,103001,103004,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102120,102144,103001,103004,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.1034.1.0" Name="_aclitem" IsRedistributable="true" 
IsHashable="false" IsMergeJoinable="false" IsComposite="false" 
IsFixedLength="false" Length="-1" PassByValue="false">
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp
 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp
index e6101562e0..bcf69925b8 100644
--- 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp
@@ -50,7 +50,7 @@ explain select * from foo left join bar on foo.a=bar.a and 
foo.b=bar.b and foo.c
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10" XformBindThreshold="0"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102043,102046,102048,102053,102054,102074,102120,102144,102157,102158,103001,103014,103022,103026,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102043,102046,102048,102053,102054,102074,102120,102144,102157,102158,103001,103014,103022,103026,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.521.1.0" Name="&gt;" ComparisonType="GT" 
ReturnsNullOnNullInput="true" IsNDVPreserving="false">
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp
index 230a3a82b9..26c0fe5947 100644
--- a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp
@@ -26,7 +26,7 @@ set optimizer_enable_hashjoin = off;
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102029,102046,102048,102053,102054,102074,102120,103001,103014,103015,103022,103027,104003,104004,104005,105000,106000,,102157,102158"/>
+      <dxl:TraceFlags 
Value="103045,102046,102048,102053,102054,102074,102120,103001,103014,103015,103022,103027,104003,104004,104005,105000,106000,,102157,102158"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.32774.1.0" Name="zoo" Rows="0.000000" 
EmptyRelation="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-Negative-NonEqual-Predicate.mdp
 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-Negative-NonEqual-Predicate.mdp
index e0e248c104..b4d0618d41 100644
--- 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-Negative-NonEqual-Predicate.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-Negative-NonEqual-Predicate.mdp
@@ -43,7 +43,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102046,102048,102053,102054,102074,102120,102144,102152,103001,103014,103022,103027,103029,103033,103038,104002,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.40962.1.0" Name="foo" Rows="0.000000" 
EmptyRelation="true"/>
diff --git a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-NonDistKey.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-NonDistKey.mdp
index 72c9512860..d831a7fe6e 100644
--- a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-NonDistKey.mdp
+++ b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-NonDistKey.mdp
@@ -31,7 +31,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.24579.1.0" Name="foo" Rows="0.000000" 
EmptyRelation="true"/>
diff --git 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-WithComplexPredicates.mdp 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-WithComplexPredicates.mdp
index 4ec47ebcd7..3cf3240249 100644
--- 
a/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-WithComplexPredicates.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/LOJ-IndexApply-WithComplexPredicates.mdp
@@ -33,7 +33,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="100000" EnforceConstraintsOnDML="false" 
PushGroupByBelowSetopThreshold="10"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102027,102074,102113,102120,102144,103001,103014,103015,103022,103027,103029,103033,104003,104004,104005,105000,106000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103046,102074,102113,102120,102144,103001,103014,103015,103022,103027,103029,103033,104003,104004,104005,105000,106000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/NLJ-DistCol-No-Broadcast.mdp 
b/src/backend/gporca/data/dxl/minidump/NLJ-DistCol-No-Broadcast.mdp
index 6cea113bf5..515b6cbc8d 100644
--- a/src/backend/gporca/data/dxl/minidump/NLJ-DistCol-No-Broadcast.mdp
+++ b/src/backend/gporca/data/dxl/minidump/NLJ-DistCol-No-Broadcast.mdp
@@ -29,7 +29,7 @@ explain select * from a1,b1 where a1.a = b1.a;
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/NLJ-EqAllCol-No-Broadcast.mdp 
b/src/backend/gporca/data/dxl/minidump/NLJ-EqAllCol-No-Broadcast.mdp
index 4726320f9e..b0cd1352c2 100644
--- a/src/backend/gporca/data/dxl/minidump/NLJ-EqAllCol-No-Broadcast.mdp
+++ b/src/backend/gporca/data/dxl/minidump/NLJ-EqAllCol-No-Broadcast.mdp
@@ -30,7 +30,7 @@ explain select * from a1,b1 where a1.a = b1.a and a1.a = b1.b;
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/NLJ-EqDistCol-InEqNonDistCol-No-Broadcast.mdp
 
b/src/backend/gporca/data/dxl/minidump/NLJ-EqDistCol-InEqNonDistCol-No-Broadcast.mdp
index cd1bc0caab..5d337795cd 100644
--- 
a/src/backend/gporca/data/dxl/minidump/NLJ-EqDistCol-InEqNonDistCol-No-Broadcast.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/NLJ-EqDistCol-InEqNonDistCol-No-Broadcast.mdp
@@ -29,7 +29,7 @@ explain select * from a1,b1 where a1.a = b1.a and a1.a != 
b1.b;
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102029,102046,102048,102053,102054,102120,103001,103014,103015,103022,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="103045,102046,102048,102053,102054,102120,103001,103014,103015,103022,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.518.1.0" Name="&lt;&gt;" ComparisonType="NEq" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/NLJ-InEqDistCol-EqNonDistCol-Redistribute.mdp
 
b/src/backend/gporca/data/dxl/minidump/NLJ-InEqDistCol-EqNonDistCol-Redistribute.mdp
index f877c179f6..655d58b571 100644
--- 
a/src/backend/gporca/data/dxl/minidump/NLJ-InEqDistCol-EqNonDistCol-Redistribute.mdp
+++ 
b/src/backend/gporca/data/dxl/minidump/NLJ-InEqDistCol-EqNonDistCol-Redistribute.mdp
@@ -32,7 +32,7 @@ explain select * from a1,b1 where a1.a != b1.a and a1.a = 
b1.b;
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="25" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102029,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,103045,102046,102048,102053,102054,102120,102144,103001,103014,103015,103022,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.518.1.0" Name="&lt;&gt;" ComparisonType="NEq" 
ReturnsNullOnNullInput="true">
diff --git 
a/src/backend/gporca/data/dxl/minidump/NestedNLJWithBlockingSpool.mdp 
b/src/backend/gporca/data/dxl/minidump/NestedNLJWithBlockingSpool.mdp
index 4fee876e4b..22ff2849b6 100644
--- a/src/backend/gporca/data/dxl/minidump/NestedNLJWithBlockingSpool.mdp
+++ b/src/backend/gporca/data/dxl/minidump/NestedNLJWithBlockingSpool.mdp
@@ -51,7 +51,7 @@
         </dxl:CostParams>
       </dxl:CostModelConfig>
       <dxl:Hint JoinArityForAssociativityCommutativity="18" 
ArrayExpansionThreshold="100" JoinOrderDynamicProgThreshold="10" 
BroadcastThreshold="10000000" EnforceConstraintsOnDML="false"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102005,102029,102046,102048,102053,102054,102074,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102005,103045,102046,102048,102053,102054,102074,102120,102144,103001,103014,103015,103022,103027,103033,104003,104004,104005,105000"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:RelationStatistics Mdid="2.98306.1.0" Name="part" Rows="0.000000" 
EmptyRelation="true"/>
diff --git a/src/backend/gporca/data/dxl/minidump/PartTbl-DPE.mdp 
b/src/backend/gporca/data/dxl/minidump/PartTbl-DPE.mdp
index 95b7e8feae..3fd4367cde 100644
--- a/src/backend/gporca/data/dxl/minidump/PartTbl-DPE.mdp
+++ b/src/backend/gporca/data/dxl/minidump/PartTbl-DPE.mdp
@@ -6,7 +6,7 @@
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/>
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="101013,102001,102002,102003,102029,102144,103001,103027,103033"/>
+      <dxl:TraceFlags 
Value="101013,102001,102002,102003,103045,102144,103001,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" 
IsHashable="true" IsMergeJoinable="true" IsComposite="false" 
IsFixedLength="true" Length="1" PassByValue="true">
diff --git a/src/backend/gporca/data/dxl/minidump/PartTbl-HJ5.mdp 
b/src/backend/gporca/data/dxl/minidump/PartTbl-HJ5.mdp
index a77d61434d..a63d9291d5 100644
--- a/src/backend/gporca/data/dxl/minidump/PartTbl-HJ5.mdp
+++ b/src/backend/gporca/data/dxl/minidump/PartTbl-HJ5.mdp
@@ -9,7 +9,7 @@ select * from s,t where s.b=t.a and t.b=35;
       <dxl:StatisticsConfig DampingFactorFilter="0.750000" 
DampingFactorJoin="0.010000" DampingFactorGroupBy="0.750000" 
MaxStatsBuckets="100"/>
       <dxl:CTEConfig CTEInliningCutoff="0"/>
       <dxl:WindowOids RowNumber="7000" Rank="7001"/>
-      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102025,102027,102073,102115,102116,102117,102119,102144,103027,103033"/>
+      <dxl:TraceFlags 
Value="102001,102002,102003,102024,102025,103046,102073,102115,102116,102117,102119,102144,103027,103033"/>
     </dxl:OptimizerConfig>
     <dxl:Metadata SystemIds="0.GPDB">
       <dxl:GPDBScalarOp Mdid="0.525.1.0" Name="&gt;=" ComparisonType="GEq" 
ReturnsNullOnNullInput="true">
diff --git a/src/backend/gporca/data/dxl/search/strategy0.xml 
b/src/backend/gporca/data/dxl/search/strategy0.xml
index 4e06bdd015..cab857cccd 100644
--- a/src/backend/gporca/data/dxl/search/strategy0.xml
+++ b/src/backend/gporca/data/dxl/search/strategy0.xml
@@ -5,10 +5,10 @@
       <dxl:Xform Name="CXformGet2TableScan"/>
       <dxl:Xform Name="CXformSelect2Filter"/>
       <dxl:Xform Name="CXformExpandNAryJoin"/>
-      <dxl:Xform Name="CXformInnerJoin2NLJoin"/>
+      <dxl:Xform Name="CXformImplementInnerJoin"/>
     </dxl:SearchStage>
     <dxl:SearchStage TimeThreshold="5000" CostThreshold="10E6">
-      <dxl:Xform Name="CXformInnerJoin2HashJoin"/>
+      <dxl:Xform Name="CXformImplementInnerJoin"/>
     </dxl:SearchStage>
   </dxl:SearchStrategy>
 </dxl:DXLMessage>
diff --git a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXform.h 
b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXform.h
index 97a6312b20..b4f87e139c 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXform.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXform.h
@@ -90,9 +90,9 @@ public:
                ExfInnerJoin2IndexGetApply____removed,
                ExfInnerJoin2DynamicIndexGetApply____removed,
                ExfInnerApplyWithOuterKey2InnerJoin,
-               ExfInnerJoin2NLJoin,
+               ExfInnerJoin2NLJoin____removed,
                ExfImplementIndexApply,
-               ExfInnerJoin2HashJoin,
+               ExfInnerJoin2HashJoin____removed,
                ExfInnerApply2InnerJoin,
                ExfInnerApply2InnerJoinNoCorrelations,
                ExfImplementInnerCorrelatedApply,
diff --git 
a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformInnerJoin2HashJoin.h 
b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformInnerJoin2HashJoin.h
deleted file mode 100644
index 0812a2fb16..0000000000
--- 
a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformInnerJoin2HashJoin.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//---------------------------------------------------------------------------
-//     Greenplum Database
-//     Copyright (C) 2011 EMC Corp.
-//
-//     @filename:
-//             CXformInnerJoin2HashJoin.h
-//
-//     @doc:
-//             Transform inner join to inner Hash Join
-//---------------------------------------------------------------------------
-#ifndef GPOPT_CXformInnerJoin2HashJoin_H
-#define GPOPT_CXformInnerJoin2HashJoin_H
-
-#include "gpos/base.h"
-
-#include "gpopt/xforms/CXformImplementation.h"
-
-namespace gpopt
-{
-using namespace gpos;
-
-//---------------------------------------------------------------------------
-//     @class:
-//             CXformInnerJoin2HashJoin
-//
-//     @doc:
-//             Transform inner join to inner Hash Join
-//             Deprecated in favor of CXformImplementInnerJoin.
-//
-//---------------------------------------------------------------------------
-class CXformInnerJoin2HashJoin : public CXformImplementation
-{
-private:
-public:
-       CXformInnerJoin2HashJoin(const CXformInnerJoin2HashJoin &) = delete;
-
-       // ctor
-       explicit CXformInnerJoin2HashJoin(CMemoryPool *mp);
-
-       // dtor
-       ~CXformInnerJoin2HashJoin() override = default;
-
-       // ident accessors
-       EXformId
-       Exfid() const override
-       {
-               return ExfInnerJoin2HashJoin;
-       }
-
-       // return a string for xform name
-       const CHAR *
-       SzId() const override
-       {
-               return "CXformInnerJoin2HashJoin";
-       }
-
-       // compute xform promise for a given expression handle
-       EXformPromise Exfp(CExpressionHandle &exprhdl) const override;
-
-       // actual transform
-       void Transform(CXformContext *pxfctxt, CXformResult *pxfres,
-                                  CExpression *pexpr) const override;
-
-};     // class CXformInnerJoin2HashJoin
-
-}  // namespace gpopt
-
-
-#endif // !GPOPT_CXformInnerJoin2HashJoin_H
-
-// EOF
diff --git 
a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformInnerJoin2NLJoin.h 
b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformInnerJoin2NLJoin.h
deleted file mode 100644
index 37469d28cc..0000000000
--- a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformInnerJoin2NLJoin.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//---------------------------------------------------------------------------
-//     Greenplum Database
-//     Copyright (C) 2009 Greenplum, Inc.
-//
-//     @filename:
-//             CXformInnerJoin2NLJoin.h
-//
-//     @doc:
-//             Transform inner join to inner NLJ
-//---------------------------------------------------------------------------
-#ifndef GPOPT_CXformInnerJoin2NLJoin_H
-#define GPOPT_CXformInnerJoin2NLJoin_H
-
-#include "gpos/base.h"
-
-#include "gpopt/xforms/CXformImplementation.h"
-
-namespace gpopt
-{
-using namespace gpos;
-
-//---------------------------------------------------------------------------
-//     @class:
-//             CXformInnerJoin2NLJoin
-//
-//     @doc:
-//             Transform inner join to inner NLJ
-//             Deprecated in favor of CXformImplementInnerJoin.
-//
-//---------------------------------------------------------------------------
-class CXformInnerJoin2NLJoin : public CXformImplementation
-{
-private:
-public:
-       CXformInnerJoin2NLJoin(const CXformInnerJoin2NLJoin &) = delete;
-
-       // ctor
-       explicit CXformInnerJoin2NLJoin(CMemoryPool *mp);
-
-       // dtor
-       ~CXformInnerJoin2NLJoin() override = default;
-
-       // ident accessors
-       EXformId
-       Exfid() const override
-       {
-               return ExfInnerJoin2NLJoin;
-       }
-
-       // return a string for xform name
-       const CHAR *
-       SzId() const override
-       {
-               return "CXformInnerJoin2NLJoin";
-       }
-
-       // compute xform promise for a given expression handle
-       EXformPromise Exfp(CExpressionHandle &exprhdl) const override;
-
-       // actual transform
-       void Transform(CXformContext *pxfctxt, CXformResult *pxfres,
-                                  CExpression *pexpr) const override;
-
-};     // class CXformInnerJoin2NLJoin
-
-}  // namespace gpopt
-
-
-#endif // !GPOPT_CXformInnerJoin2NLJoin_H
-
-// EOF
diff --git a/src/backend/gporca/libgpopt/include/gpopt/xforms/xforms.h 
b/src/backend/gporca/libgpopt/include/gpopt/xforms/xforms.h
index 2f396c1619..d47146f22a 100644
--- a/src/backend/gporca/libgpopt/include/gpopt/xforms/xforms.h
+++ b/src/backend/gporca/libgpopt/include/gpopt/xforms/xforms.h
@@ -78,8 +78,6 @@
 #include "gpopt/xforms/CXformInnerApply2InnerJoin.h"
 #include "gpopt/xforms/CXformInnerApply2InnerJoinNoCorrelations.h"
 #include "gpopt/xforms/CXformInnerApplyWithOuterKey2InnerJoin.h"
-#include "gpopt/xforms/CXformInnerJoin2HashJoin.h"
-#include "gpopt/xforms/CXformInnerJoin2NLJoin.h"
 #include "gpopt/xforms/CXformInnerJoinAntiSemiJoinNotInSwap.h"
 #include "gpopt/xforms/CXformInnerJoinAntiSemiJoinSwap.h"
 #include "gpopt/xforms/CXformInnerJoinSemiJoinSwap.h"
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXform.cpp 
b/src/backend/gporca/libgpopt/src/xforms/CXform.cpp
index 387c6d03df..db1faed0a6 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXform.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXform.cpp
@@ -139,8 +139,6 @@ CBitSet *
 CXform::PbsNLJoinXforms(CMemoryPool *mp)
 {
        CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);
-       (void) pbs->ExchangeSet(
-               GPOPT_DISABLE_XFORM_TF(CXform::ExfInnerJoin2NLJoin));
        (void) pbs->ExchangeSet(
                GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftOuterJoin2NLJoin));
        (void) pbs->ExchangeSet(
@@ -204,8 +202,6 @@ CXform::PbsHashJoinXforms(CMemoryPool *mp)
 {
        CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);
 
-       (void) pbs->ExchangeSet(
-               GPOPT_DISABLE_XFORM_TF(CXform::ExfInnerJoin2HashJoin));
        (void) pbs->ExchangeSet(
                GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftOuterJoin2HashJoin));
        (void) pbs->ExchangeSet(
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformFactory.cpp 
b/src/backend/gporca/libgpopt/src/xforms/CXformFactory.cpp
index 6e832fdc45..50ca908c47 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformFactory.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformFactory.cpp
@@ -165,9 +165,9 @@ CXformFactory::Instantiate()
        Add(GPOS_NEW(m_mp) CXformSubqNAryJoin2Apply(m_mp));
        SkipUnused(2);
        Add(GPOS_NEW(m_mp) CXformInnerApplyWithOuterKey2InnerJoin(m_mp));
-       Add(GPOS_NEW(m_mp) CXformInnerJoin2NLJoin(m_mp));
+       SkipUnused(1);
        Add(GPOS_NEW(m_mp) CXformImplementIndexApply(m_mp));
-       Add(GPOS_NEW(m_mp) CXformInnerJoin2HashJoin(m_mp));
+       SkipUnused(1);
        Add(GPOS_NEW(m_mp) CXformInnerApply2InnerJoin(m_mp));
        Add(GPOS_NEW(m_mp) CXformInnerApply2InnerJoinNoCorrelations(m_mp));
        Add(GPOS_NEW(m_mp) CXformImplementInnerCorrelatedApply(m_mp));
diff --git 
a/src/backend/gporca/libgpopt/src/xforms/CXformImplementInnerJoin.cpp 
b/src/backend/gporca/libgpopt/src/xforms/CXformImplementInnerJoin.cpp
index 4451cf8f48..e62ab85a25 100644
--- a/src/backend/gporca/libgpopt/src/xforms/CXformImplementInnerJoin.cpp
+++ b/src/backend/gporca/libgpopt/src/xforms/CXformImplementInnerJoin.cpp
@@ -80,7 +80,7 @@ CXformImplementInnerJoin::Transform(CXformContext *pxfctxt,
 
        GPOS_ASSERT(pxfres->Size() == 0);
 
-       if (GPOPT_FENABLED_XFORM(ExfInnerJoin2HashJoin))
+       if (!GPOS_FTRACE(EopttraceDisableInnerHashJoin))
        {
                CXformUtils::ImplementHashJoin<CPhysicalInnerHashJoin>(pxfctxt, 
pxfres,
                                                                                
                                           pexpr);
@@ -88,7 +88,7 @@ CXformImplementInnerJoin::Transform(CXformContext *pxfctxt,
 
        if ((GPOS_FTRACE(EopttraceForceComprehensiveJoinImplementation) ||
                 pxfres->Size() == 0) &&
-               GPOPT_FENABLED_XFORM(ExfInnerJoin2NLJoin))
+               !GPOS_FTRACE(EopttraceDisableInnerNLJ))
        {
                CXformUtils::ImplementNLJoin<CPhysicalInnerNLJoin>(pxfctxt, 
pxfres,
                                                                                
                                   pexpr);
diff --git 
a/src/backend/gporca/libgpopt/src/xforms/CXformInnerJoin2HashJoin.cpp 
b/src/backend/gporca/libgpopt/src/xforms/CXformInnerJoin2HashJoin.cpp
deleted file mode 100644
index 41b8ef5516..0000000000
--- a/src/backend/gporca/libgpopt/src/xforms/CXformInnerJoin2HashJoin.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-//---------------------------------------------------------------------------
-//     Greenplum Database
-//     Copyright (C) 2011 EMC Corp.
-//
-//     @filename:
-//             CXformInnerJoin2HashJoin.cpp
-//
-//     @doc:
-//             Implementation of transform
-//---------------------------------------------------------------------------
-
-#include "gpopt/xforms/CXformInnerJoin2HashJoin.h"
-
-#include "gpos/base.h"
-
-#include "gpopt/operators/CLogicalInnerJoin.h"
-#include "gpopt/operators/CPatternLeaf.h"
-#include "gpopt/operators/CPhysicalInnerHashJoin.h"
-#include "gpopt/operators/CPhysicalInnerNLJoin.h"
-#include "gpopt/operators/CPredicateUtils.h"
-#include "gpopt/xforms/CXformUtils.h"
-
-using namespace gpopt;
-
-
-//---------------------------------------------------------------------------
-//     @function:
-//             CXformInnerJoin2HashJoin::CXformInnerJoin2HashJoin
-//
-//     @doc:
-//             ctor
-//
-//---------------------------------------------------------------------------
-CXformInnerJoin2HashJoin::CXformInnerJoin2HashJoin(CMemoryPool *mp)
-       :  // pattern
-         CXformImplementation(GPOS_NEW(mp) CExpression(
-                 mp, GPOS_NEW(mp) CLogicalInnerJoin(mp),
-                 GPOS_NEW(mp)
-                         CExpression(mp, GPOS_NEW(mp) CPatternLeaf(mp)),  // 
left child
-                 GPOS_NEW(mp)
-                         CExpression(mp, GPOS_NEW(mp) CPatternLeaf(mp)),  // 
right child
-                 GPOS_NEW(mp)
-                         CExpression(mp, GPOS_NEW(mp) CPatternTree(mp))  // 
predicate
-                 ))
-{
-}
-
-
-//---------------------------------------------------------------------------
-//     @function:
-//             CXformInnerJoin2HashJoin::Exfp
-//
-//     @doc:
-//             Compute xform promise for a given expression handle;
-//
-//---------------------------------------------------------------------------
-CXform::EXformPromise
-CXformInnerJoin2HashJoin::Exfp(CExpressionHandle &) const
-{
-       return CXform::ExfpNone;
-}
-
-
-//---------------------------------------------------------------------------
-//     @function:
-//             CXformInnerJoin2HashJoin::Transform
-//
-//     @doc:
-//             actual transformation
-//             Deprecated in favor of CXformImplementInnerJoin.
-//
-//---------------------------------------------------------------------------
-void
-CXformInnerJoin2HashJoin::Transform(CXformContext *, CXformResult *,
-                                                                       
CExpression *) const
-{
-}
-
-// EOF
diff --git a/src/backend/gporca/libgpopt/src/xforms/CXformInnerJoin2NLJoin.cpp 
b/src/backend/gporca/libgpopt/src/xforms/CXformInnerJoin2NLJoin.cpp
deleted file mode 100644
index 65f6df7f16..0000000000
--- a/src/backend/gporca/libgpopt/src/xforms/CXformInnerJoin2NLJoin.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-//---------------------------------------------------------------------------
-//     Greenplum Database
-//     Copyright (C) 2009 Greenplum, Inc.
-//
-//     @filename:
-//             CXformInnerJoin2NLJoin.cpp
-//
-//     @doc:
-//             Implementation of transform
-//---------------------------------------------------------------------------
-
-#include "gpopt/xforms/CXformInnerJoin2NLJoin.h"
-
-#include "gpos/base.h"
-
-#include "gpopt/operators/CLogicalInnerJoin.h"
-#include "gpopt/operators/CPatternLeaf.h"
-#include "gpopt/operators/CPhysicalInnerNLJoin.h"
-#include "gpopt/xforms/CXformInnerJoin2HashJoin.h"
-#include "gpopt/xforms/CXformUtils.h"
-
-using namespace gpopt;
-
-
-//---------------------------------------------------------------------------
-//     @function:
-//             CXformInnerJoin2NLJoin::CXformInnerJoin2NLJoin
-//
-//     @doc:
-//             ctor
-//
-//---------------------------------------------------------------------------
-CXformInnerJoin2NLJoin::CXformInnerJoin2NLJoin(CMemoryPool *mp)
-       :  // pattern
-         CXformImplementation(GPOS_NEW(mp) CExpression(
-                 mp, GPOS_NEW(mp) CLogicalInnerJoin(mp),
-                 GPOS_NEW(mp)
-                         CExpression(mp, GPOS_NEW(mp) CPatternLeaf(mp)),  // 
left child
-                 GPOS_NEW(mp)
-                         CExpression(mp, GPOS_NEW(mp) CPatternLeaf(mp)),  // 
right child
-                 GPOS_NEW(mp)
-                         CExpression(mp, GPOS_NEW(mp) CPatternLeaf(mp))  // 
predicate
-                 ))
-{
-}
-
-
-//---------------------------------------------------------------------------
-//     @function:
-//             CXformInnerJoin2NLJoin::Exfp
-//
-//     @doc:
-//             Compute xform promise for a given expression handle;
-//
-//---------------------------------------------------------------------------
-CXform::EXformPromise
-CXformInnerJoin2NLJoin::Exfp(CExpressionHandle &) const
-{
-       return CXform::ExfpNone;
-}
-
-
-//---------------------------------------------------------------------------
-//     @function:
-//             CXformInnerJoin2NLJoin::Transform
-//
-//     @doc:
-//             actual transformation
-//             Deprecated in favor of CXformImplementInnerJoin.
-//
-//---------------------------------------------------------------------------
-void
-CXformInnerJoin2NLJoin::Transform(CXformContext *, CXformResult *,
-                                                                 CExpression 
*) const
-{
-}
-
-
-// EOF
diff --git a/src/backend/gporca/libgpopt/src/xforms/Makefile 
b/src/backend/gporca/libgpopt/src/xforms/Makefile
index f087acf624..ef7f0fdec9 100644
--- a/src/backend/gporca/libgpopt/src/xforms/Makefile
+++ b/src/backend/gporca/libgpopt/src/xforms/Makefile
@@ -69,8 +69,6 @@ OBJS        = CDecorrelator.o \
               CXformInnerApply2InnerJoin.o \
               CXformInnerApply2InnerJoinNoCorrelations.o \
               CXformInnerApplyWithOuterKey2InnerJoin.o \
-              CXformInnerJoin2HashJoin.o \
-              CXformInnerJoin2NLJoin.o \
               CXformImplementInnerJoin.o \
               CXformInsert2DML.o \
               CXformIntersect2Join.o \
diff --git 
a/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h 
b/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
index f8c8ccc57c..0c3f2e1da2 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
@@ -221,6 +221,12 @@ enum EOptTraceFlag
        // Discard HashJoin with RedistributeMotion nodes
        EopttraceDiscardRedistributeHashJoin = 103044,
 
+       // disable hash join alternatives
+       EopttraceDisableInnerHashJoin = 103045,
+
+       // enable nested loop join alternatives
+       EopttraceDisableInnerNLJ = 103046,
+
        ///////////////////////////////////////////////////////
        ///////////////////// statistics flags ////////////////
        //////////////////////////////////////////////////////
diff --git a/src/backend/gporca/server/src/unittest/gpopt/minidump/CICGTest.cpp 
b/src/backend/gporca/server/src/unittest/gpopt/minidump/CICGTest.cpp
index 896eea45b8..1f2b6fa896 100644
--- a/src/backend/gporca/server/src/unittest/gpopt/minidump/CICGTest.cpp
+++ b/src/backend/gporca/server/src/unittest/gpopt/minidump/CICGTest.cpp
@@ -285,8 +285,7 @@ CICGTest::EresUnittest_NegativeIndexApplyTests()
                true);
        CAutoTraceFlag atfTS(EopttraceDisableXformBase + 
CXform::ExfGet2TableScan,
                                                 true);
-       CAutoTraceFlag atfNLJ(
-               EopttraceDisableXformBase + CXform::ExfInnerJoin2NLJoin, true);
+       CAutoTraceFlag atfNLJ(EopttraceDisableInnerNLJ, true);
 
        CAutoMemoryPool amp(CAutoMemoryPool::ElcNone);
        CMemoryPool *mp = amp.Pmp();
diff --git 
a/src/backend/gporca/server/src/unittest/gpopt/search/CSearchStrategyTest.cpp 
b/src/backend/gporca/server/src/unittest/gpopt/search/CSearchStrategyTest.cpp
index 236d47432d..37705328b3 100644
--- 
a/src/backend/gporca/server/src/unittest/gpopt/search/CSearchStrategyTest.cpp
+++ 
b/src/backend/gporca/server/src/unittest/gpopt/search/CSearchStrategyTest.cpp
@@ -225,7 +225,7 @@ CSearchStrategyTest::PdrgpssRandom(CMemoryPool *mp)
        // first xforms set contains essential rules to produce simple equality 
join plan
        (void) pxfsFst->ExchangeSet(CXform::ExfGet2TableScan);
        (void) pxfsFst->ExchangeSet(CXform::ExfSelect2Filter);
-       (void) pxfsFst->ExchangeSet(CXform::ExfInnerJoin2HashJoin);
+       (void) pxfsFst->ExchangeSet(CXform::ExfImplementInnerJoin);
 
        // second xforms set contains all other rules
        pxfsSnd->Union(CXformFactory::Pxff()->PxfsExploration());
diff --git 
a/src/backend/gporca/server/src/unittest/gpopt/xforms/CXformFactoryTest.cpp 
b/src/backend/gporca/server/src/unittest/gpopt/xforms/CXformFactoryTest.cpp
index 1dfab659b2..3e7ff8455c 100644
--- a/src/backend/gporca/server/src/unittest/gpopt/xforms/CXformFactoryTest.cpp
+++ b/src/backend/gporca/server/src/unittest/gpopt/xforms/CXformFactoryTest.cpp
@@ -54,8 +54,8 @@ CXformFactoryTest::EresUnittest_Basic()
        CXform *pxf = CXformFactory::Pxff()->Pxf(CXform::ExfGet2TableScan);
        GPOS_ASSERT(CXform::ExfGet2TableScan == pxf->Exfid());
 
-       pxf = CXformFactory::Pxff()->Pxf(CXform::ExfInnerJoin2NLJoin);
-       GPOS_ASSERT(CXform::ExfInnerJoin2NLJoin == pxf->Exfid());
+       pxf = CXformFactory::Pxff()->Pxf(CXform::ExfImplementInnerJoin);
+       GPOS_ASSERT(CXform::ExfImplementInnerJoin == pxf->Exfid());
 
        pxf = CXformFactory::Pxff()->Pxf(CXform::ExfGbAgg2HashAgg);
        GPOS_ASSERT(CXform::ExfGbAgg2HashAgg == pxf->Exfid());
diff --git a/src/test/regress/expected/gporca.out 
b/src/test/regress/expected/gporca.out
index 682abd463a..94aeee9028 100644
--- a/src/test/regress/expected/gporca.out
+++ b/src/test/regress/expected/gporca.out
@@ -9858,8 +9858,6 @@ BEGIN
     SELECT $1 + 1;
 END;
 $$ LANGUAGE plpgsql volatile;
--- force_explain
-set optimizer_segments = 3;
 explain
 select c.cid cid,
        c.firstname firstname,
@@ -9870,28 +9868,26 @@ where c.cid = s.cid and s.date_sk = d.date_sk and
       ((d.year = 2001 and lower(s.type) = 't1' and plusone(d.moy) = 5) or 
(d.moy = 4 and upper(s.type) = 'T2'));
                                                                                
QUERY PLAN                                                                      
         
 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1  (slice3; segments: 3)  (cost=2215.04..2775.38 rows=110 
width=72)
-   ->  Hash Join  (cost=2215.04..2775.38 rows=37 width=72)
+ Gather Motion 3:1  (slice1; segments: 3)  (cost=738.36..913.37 rows=109 
width=72)
+   ->  Hash Join  (cost=738.36..911.92 rows=36 width=72)
          Hash Cond: (c.cid = s.cid)
-         ->  Seq Scan on cust c  (cost=0.00..434.00 rows=11134 width=68)
-         ->  Hash  (cost=2214.95..2214.95 rows=3 width=8)
-               ->  Redistribute Motion 3:3  (slice2; segments: 3)  
(cost=940.72..2214.95 rows=3 width=8)
+         ->  Seq Scan on cust c  (cost=0.00..145.33 rows=11133 width=68)
+         ->  Hash  (cost=738.33..738.33 rows=2 width=8)
+               ->  Redistribute Motion 3:3  (slice2; segments: 3)  
(cost=314.24..738.33 rows=2 width=8)
                      Hash Key: s.cid
-                     ->  Hash Join  (cost=940.72..2214.80 rows=3 width=8)
+                     ->  Hash Join  (cost=314.24..738.28 rows=2 width=8)
                            Hash Cond: (d.date_sk = s.date_sk)
                            Join Filter: (((d.year = 2001) AND (lower(s.type) = 
't1'::text) AND (plusone(d.moy) = 5)) OR ((d.moy = 4) AND (upper(s.type) = 
'T2'::text)))
-                           ->  Seq Scan on datedim d  (cost=0.00..1268.50 
rows=52 width=12)
+                           ->  Seq Scan on datedim d  (cost=0.00..423.50 
rows=52 width=12)
                                  Filter: ((year = 2001) OR (moy = 4))
-                           ->  Hash  (cost=939.68..939.68 rows=28 width=40)
-                                 ->  Redistribute Motion 3:3  (slice1; 
segments: 3)  (cost=0.00..939.68 rows=28 width=40)
+                           ->  Hash  (cost=313.89..313.89 rows=28 width=40)
+                                 ->  Redistribute Motion 3:3  (slice3; 
segments: 3)  (cost=0.00..313.89 rows=28 width=40)
                                        Hash Key: s.date_sk
-                                       ->  Seq Scan on sales s  
(cost=0.00..938.00 rows=28 width=40)
+                                       ->  Seq Scan on sales s  
(cost=0.00..313.33 rows=28 width=40)
                                              Filter: ((lower(type) = 
't1'::text) OR (upper(type) = 'T2'::text))
- Planning time: 2.896 ms
  Optimizer: Postgres query optimizer
-(19 rows)
+(18 rows)
 
-reset optimizer_segments;
 -- Bitmap indexes
 drop table if exists orca.bm_test;
 NOTICE:  table "bm_test" does not exist, skipping
@@ -10280,32 +10276,6 @@ BEGIN
     SELECT $1 + 1;
 END;
 $$ LANGUAGE plpgsql volatile;
--- start_ignore
-select disable_xform('CXformInnerJoin2DynamicIndexGetApply');
-                  disable_xform
---------------------------------------------------
- CXformInnerJoin2DynamicIndexGetApply is disabled
-(1 row)
-
-select disable_xform('CXformInnerJoin2HashJoin');
-            disable_xform
---------------------------------------
- CXformInnerJoin2HashJoin is disabled
-(1 row)
-
-select disable_xform('CXformInnerJoin2IndexGetApply');
-               disable_xform
--------------------------------------------
- CXformInnerJoin2IndexGetApply is disabled
-(1 row)
-
-select disable_xform('CXformInnerJoin2NLJoin');
-           disable_xform
-------------------------------------
- CXformInnerJoin2NLJoin is disabled
-(1 row)
--- end_ignore
-set optimizer_enable_indexjoin=on;
 -- force_explain
 set optimizer_segments = 3;
 EXPLAIN
@@ -10340,37 +10310,8 @@ ORDER BY 1 asc ;
                                  ->  Hash  (cost=108.67..108.67 rows=7467 
width=108)
                                        ->  Seq Scan on my_tt_agg_opt tt  
(cost=0.00..108.67 rows=7467 width=108)
  Optimizer: Postgres query optimizer
-(19 rows)
-
-reset optimizer_segments;
-reset optimizer_enable_constant_expression_evaluation;
-reset optimizer_enable_indexjoin;
--- start_ignore
-select enable_xform('CXformInnerJoin2DynamicIndexGetApply');
-                  enable_xform
--------------------------------------------------
- CXformInnerJoin2DynamicIndexGetApply is enabled
-(1 row)
-
-select enable_xform('CXformInnerJoin2HashJoin');
-            enable_xform
--------------------------------------
- CXformInnerJoin2HashJoin is enabled
-(1 row)
-
-select enable_xform('CXformInnerJoin2IndexGetApply');
-               enable_xform
-------------------------------------------
- CXformInnerJoin2IndexGetApply is enabled
-(1 row)
-
-select enable_xform('CXformInnerJoin2NLJoin');
-           enable_xform
------------------------------------
- CXformInnerJoin2NLJoin is enabled
-(1 row)
+(21 rows)
 
--- end_ignore
 -- MPP-25661: IndexScan crashing for qual with reference to outer tuple
 drop table if exists idxscan_outer;
 NOTICE:  table "idxscan_outer" does not exist, skipping
@@ -12038,45 +11979,61 @@ ANALYZE foo3;
 set optimizer_join_order=query;
 -- we ignore enable/disable_xform statements as their output will differ if 
the server is compiled without Orca (the xform won't exist)
 -- start_ignore
-select disable_xform('CXformInnerJoin2HashJoin');
+select disable_xform('CXformLeftOuterJoin2HashJoin');
+              disable_xform               
+------------------------------------------
+ CXformLeftOuterJoin2HashJoin is disabled
+(1 row)
+
+select disable_xform('CXformImplementInnerJoin');
             disable_xform             
 --------------------------------------
- CXformInnerJoin2HashJoin is disabled
+ CXformImplementInnerJoin is disabled
 (1 row)
 
 -- end_ignore
-EXPLAIN SELECT 1 FROM foo1, foo2 WHERE foo1.a = foo2.a AND foo2.c = 3 AND 
foo2.b IN (SELECT b FROM foo3);
-                                             QUERY PLAN                        
                     
-----------------------------------------------------------------------------------------------------
- Gather Motion 3:1  (slice1; segments: 3)  (cost=2.07..3.17 rows=3 width=4)
-   ->  Hash Semi Join  (cost=2.07..3.13 rows=1 width=4)
-         Hash Cond: (foo2.b = foo3.b)
-         ->  Redistribute Motion 3:3  (slice2; segments: 3)  (cost=1.02..2.07 
rows=1 width=4)
-               Hash Key: foo2.b
-               ->  Hash Join  (cost=1.02..2.05 rows=1 width=4)
-                     Hash Cond: (foo2.a = foo1.a)
-                     ->  Seq Scan on foo2  (cost=0.00..1.01 rows=1 width=8)
-                           Filter: (c = 3)
-                     ->  Hash  (cost=1.01..1.01 rows=1 width=4)
-                           ->  Seq Scan on foo1  (cost=0.00..1.01 rows=1 
width=4)
-         ->  Hash  (cost=1.03..1.03 rows=1 width=4)
-               ->  Redistribute Motion 3:3  (slice3; segments: 3)  
(cost=0.00..1.03 rows=1 width=4)
-                     Hash Key: foo3.b
-                     ->  Seq Scan on foo3  (cost=0.00..1.01 rows=1 width=4)
+EXPLAIN SELECT 1 FROM foo1 left join foo2 on foo1.a = foo2.a AND foo2.c = 3 
AND foo2.b IN (SELECT b FROM foo3);
+                                                   QUERY PLAN                  
                                 
+----------------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1  (slice1; segments: 3)  (cost=2.07..3.19 rows=3 width=4)
+   ->  Hash Right Join  (cost=2.07..3.15 rows=1 width=4)
+         Hash Cond: (foo2.a = foo1.a)
+         ->  Redistribute Motion 3:3  (slice2; segments: 3)  (cost=1.04..2.11 
rows=1 width=4)
+               Hash Key: foo2.a
+               ->  Hash Semi Join  (cost=1.04..2.09 rows=1 width=4)
+                     Hash Cond: (foo2.b = foo3.b)
+                     ->  Redistribute Motion 3:3  (slice3; segments: 3)  
(cost=0.00..1.03 rows=1 width=8)
+                           Hash Key: foo2.b
+                           ->  Seq Scan on foo2  (cost=0.00..1.01 rows=1 
width=8)
+                                 Filter: (c = 3)
+                     ->  Hash  (cost=1.03..1.03 rows=1 width=4)
+                           ->  Redistribute Motion 3:3  (slice4; segments: 3)  
(cost=0.00..1.03 rows=1 width=4)
+                                 Hash Key: foo3.b
+                                 ->  Seq Scan on foo3  (cost=0.00..1.01 rows=1 
width=4)
+         ->  Hash  (cost=1.01..1.01 rows=1 width=4)
+               ->  Seq Scan on foo1  (cost=0.00..1.01 rows=1 width=4)
  Optimizer: Postgres query optimizer
-(16 rows)
+(18 rows)
 
-SELECT 1 FROM foo1, foo2 WHERE foo1.a = foo2.a AND foo2.c = 3 AND foo2.b IN 
(SELECT b FROM foo3);
+SELECT 1 FROM foo1 left join foo2 on foo1.a = foo2.a AND foo2.c = 3 AND foo2.b 
IN (SELECT b FROM foo3);
  ?column? 
 ----------
-(0 rows)
+        1
+        1
+(2 rows)
 
 reset optimizer_join_order;
 -- start_ignore
-select enable_xform('CXformInnerJoin2HashJoin');
+select enable_xform('CXformLeftOuterJoin2HashJoin');
+              enable_xform               
+-----------------------------------------
+ CXformLeftOuterJoin2HashJoin is enabled
+(1 row)
+
+select enable_xform('CXformImplementInnerJoin');
             enable_xform             
 -------------------------------------
- CXformInnerJoin2HashJoin is enabled
+ CXformImplementInnerJoin is enabled
 (1 row)
 
 -- end_ignore
@@ -13254,11 +13211,7 @@ select disable_xform('CXformJoin2BitmapIndexGetApply');
  CXformJoin2BitmapIndexGetApply is disabled
 (1 row)
 
-select disable_xform('CXformInnerJoin2NLJoin');
-           disable_xform            
-------------------------------------
- CXformInnerJoin2NLJoin is disabled
-(1 row)
+set optimizer_enable_nljoin=off;
 -- end_ignore
 -- Make sure we don't allow a regular (btree) index scan or index join for an 
AO table
 -- We disabled hash join, and bitmap index joins, NLJs, so this should leave 
ORCA no other choices
@@ -13317,12 +13270,7 @@ select enable_xform('CXformJoin2BitmapIndexGetApply');
  CXformJoin2BitmapIndexGetApply is enabled
 (1 row)
 
-select enable_xform('CXformInnerJoin2NLJoin');
-           enable_xform            
------------------------------------
- CXformInnerJoin2NLJoin is enabled
-(1 row)
-
+reset optimizer_enable_nljoin;
 -- end_ignore
 reset optimizer_enable_hashjoin;
 -- Tests converted from MDPs that use tables partitioned on text columns and 
similar types,
diff --git a/src/test/regress/expected/gporca_optimizer.out 
b/src/test/regress/expected/gporca_optimizer.out
index 9f49d24cec..80e4cb5d08 100644
--- a/src/test/regress/expected/gporca_optimizer.out
+++ b/src/test/regress/expected/gporca_optimizer.out
@@ -9887,8 +9887,6 @@ BEGIN
     SELECT $1 + 1;
 END;
 $$ LANGUAGE plpgsql volatile;
--- force_explain
-set optimizer_segments = 3;
 explain
 select c.cid cid,
        c.firstname firstname,
@@ -9919,7 +9917,6 @@ where c.cid = s.cid and s.date_sk = d.date_sk and
  Optimizer: Pivotal Optimizer (GPORCA)
 (18 rows)
 
-reset optimizer_segments;
 -- Bitmap indexes
 drop table if exists orca.bm_test;
 NOTICE:  table "bm_test" does not exist, skipping
@@ -10313,33 +10310,6 @@ BEGIN
     SELECT $1 + 1;
 END;
 $$ LANGUAGE plpgsql volatile;
--- start_ignore
-select disable_xform('CXformInnerJoin2DynamicIndexGetApply');
-                     disable_xform                      
---------------------------------------------------------
- CXformInnerJoin2DynamicIndexGetApply is not recognized
-(1 row)
-
-select disable_xform('CXformInnerJoin2HashJoin');
-            disable_xform
---------------------------------------
- CXformInnerJoin2HashJoin is disabled
-(1 row)
-
-select disable_xform('CXformInnerJoin2IndexGetApply');
-                  disable_xform                  
--------------------------------------------------
- CXformInnerJoin2IndexGetApply is not recognized
-(1 row)
-
-select disable_xform('CXformInnerJoin2NLJoin');
-           disable_xform
-------------------------------------
- CXformInnerJoin2NLJoin is disabled
-(1 row)
-
--- end_ignore
-set optimizer_enable_indexjoin=on;
 -- force_explain
 set optimizer_segments = 3;
 EXPLAIN
@@ -10351,62 +10321,27 @@ WHERE tq.sym = tt.symbol AND
       tt.event_ts <  tq.end_ts
 GROUP BY 1
 ORDER BY 1 asc ;
-INFO:  GPORCA failed to produce a plan, falling back to planner
-DETAIL:  No plan has been computed for required properties
-                                                                    QUERY PLAN 
                                                                    
----------------------------------------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1  (slice1; segments: 3)  (cost=39937.77..39951.93 rows=1000 
width=16)
-   Merge Key: ((((tt.event_ts / 100000) / 5) * 5))
-   ->  Sort  (cost=39937.77..39938.60 rows=333 width=16)
-         Sort Key: ((((tt.event_ts / 100000) / 5) * 5))
-         ->  Finalize HashAggregate  (cost=39917.97..39923.80 rows=333 
width=16)
-               Group Key: ((((tt.event_ts / 100000) / 5) * 5))
-               ->  Redistribute Motion 3:3  (slice2; segments: 3)  
(cost=39875.47..39912.97 rows=1000 width=16)
-                     Hash Key: ((((tt.event_ts / 100000) / 5) * 5))
-                     ->  Partial HashAggregate  (cost=39875.47..39892.97 
rows=1000 width=16)
-                           Group Key: (((tt.event_ts / 100000) / 5) * 5)
-                           ->  Hash Join  (cost=202.00..39819.05 rows=11283 
width=8)
-                                 Hash Cond: ((tq.sym)::bpchar = tt.symbol)
-                                 Join Filter: ((tt.event_ts >= tq.ets) AND 
(tt.event_ts < tq.end_ts) AND (plusone(tq.bid_price) < tt.trade_price))
-                                 ->  Redistribute Motion 3:3  (slice3; 
segments: 3)  (cost=0.00..544.00 rows=13600 width=98)
-                                       Hash Key: tq.sym
-                                       ->  Append  (cost=0.00..272.00 
rows=13600 width=98)
-                                             ->  Seq Scan on 
my_tq_agg_opt_part_1_prt_p1 tq_1  (cost=0.00..102.00 rows=6800 width=98)
-                                             ->  Seq Scan on 
my_tq_agg_opt_part_1_prt_p2 tq_2  (cost=0.00..102.00 rows=6800 width=98)
-                                 ->  Hash  (cost=108.67..108.67 rows=7467 
width=108)
-                                       ->  Seq Scan on my_tt_agg_opt tt  
(cost=0.00..108.67 rows=7467 width=108)
- Optimizer: Postgres query optimizer
-(21 rows)
-
-reset optimizer_segments;
-reset optimizer_enable_constant_expression_evaluation;
-reset optimizer_enable_indexjoin;
--- start_ignore
-select enable_xform('CXformInnerJoin2DynamicIndexGetApply');
-                      enable_xform                      
---------------------------------------------------------
- CXformInnerJoin2DynamicIndexGetApply is not recognized
-(1 row)
-
-select enable_xform('CXformInnerJoin2HashJoin');
-            enable_xform
--------------------------------------
- CXformInnerJoin2HashJoin is enabled
-(1 row)
-
-select enable_xform('CXformInnerJoin2IndexGetApply');
-                  enable_xform                   
--------------------------------------------------
- CXformInnerJoin2IndexGetApply is not recognized
-(1 row)
-
-select enable_xform('CXformInnerJoin2NLJoin');
-           enable_xform
------------------------------------
- CXformInnerJoin2NLJoin is enabled
-(1 row)
+                                                                               
                           QUERY PLAN                                           
                                                               
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Sort  (cost=0.00..862.00 rows=1 width=16)
+   Sort Key: ((((my_tt_agg_opt.event_ts / 100000) / 5) * 5))
+   ->  GroupAggregate  (cost=0.00..862.00 rows=1 width=16)
+         Group Key: ((((my_tt_agg_opt.event_ts / 100000) / 5) * 5))
+         ->  Sort  (cost=0.00..862.00 rows=1 width=8)
+               Sort Key: ((((my_tt_agg_opt.event_ts / 100000) / 5) * 5))
+               ->  Gather Motion 3:1  (slice1; segments: 3)  
(cost=0.00..862.00 rows=1 width=8)
+                     ->  Hash Join  (cost=0.00..862.00 rows=1 width=8)
+                           Hash Cond: ((my_tq_agg_opt_part.sym)::bpchar = 
my_tt_agg_opt.symbol)
+                           Join Filter: 
((plusone(my_tq_agg_opt_part.bid_price) < my_tt_agg_opt.trade_price) AND 
(my_tt_agg_opt.event_ts >= my_tq_agg_opt_part.ets) AND (my_tt_agg_opt.event_ts 
< my_tq_agg_opt_part.end_ts))
+                           ->  Redistribute Motion 3:3  (slice2; segments: 3)  
(cost=0.00..431.00 rows=1 width=32)
+                                 Hash Key: my_tq_agg_opt_part.sym
+                                 ->  Dynamic Seq Scan on my_tq_agg_opt_part  
(cost=0.00..431.00 rows=1 width=32)
+                                       Number of partitions to scan: 2 (out of 
2)
+                           ->  Hash  (cost=431.00..431.00 rows=1 width=24)
+                                 ->  Seq Scan on my_tt_agg_opt  
(cost=0.00..431.00 rows=1 width=24)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(17 rows)
 
--- end_ignore
 -- MPP-25661: IndexScan crashing for qual with reference to outer tuple
 drop table if exists idxscan_outer;
 NOTICE:  table "idxscan_outer" does not exist, skipping
@@ -12178,26 +12113,31 @@ ANALYZE foo3;
 set optimizer_join_order=query;
 -- we ignore enable/disable_xform statements as their output will differ if 
the server is compiled without Orca (the xform won't exist)
 -- start_ignore
-select disable_xform('CXformInnerJoin2HashJoin');
+select disable_xform('CXformLeftOuterJoin2HashJoin');
+              disable_xform               
+------------------------------------------
+ CXformLeftOuterJoin2HashJoin is disabled
+(1 row)
+
+select disable_xform('CXformImplementInnerJoin');
             disable_xform             
 --------------------------------------
- CXformInnerJoin2HashJoin is disabled
+ CXformImplementInnerJoin is disabled
 (1 row)
 
 -- end_ignore
-EXPLAIN SELECT 1 FROM foo1, foo2 WHERE foo1.a = foo2.a AND foo2.c = 3 AND 
foo2.b IN (SELECT b FROM foo3);
+EXPLAIN SELECT 1 FROM foo1 left join foo2 on foo1.a = foo2.a AND foo2.c = 3 
AND foo2.b IN (SELECT b FROM foo3);
                                                      QUERY PLAN                
                                      
 
---------------------------------------------------------------------------------------------------------------------
- Result  (cost=0.00..1324035.28 rows=1 width=4)
-   ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..1324035.28 rows=1 
width=1)
-         ->  Nested Loop  (cost=0.00..1324035.28 rows=1 width=1)
+ Result  (cost=0.00..1721310.84 rows=2 width=4)
+   ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..1721310.84 rows=2 
width=1)
+         ->  Nested Loop Left Join  (cost=0.00..1721310.84 rows=1 width=1)
                Join Filter: (foo1.a = foo2.a)
-               ->  Broadcast Motion 3:3  (slice3; segments: 3)  
(cost=0.00..431.00 rows=2 width=4)
-                     ->  Seq Scan on foo1  (cost=0.00..431.00 rows=1 width=4)
-               ->  Materialize  (cost=0.00..431.00 rows=1 width=4)
-                     ->  Hash Semi Join  (cost=0.00..431.00 rows=1 width=4)
+               ->  Seq Scan on foo1  (cost=0.00..431.00 rows=1 width=4)
+               ->  Materialize  (cost=0.00..818.97 rows=1 width=4)
+                     ->  Hash Semi Join  (cost=0.00..818.97 rows=1 width=4)
                            Hash Cond: (foo2.b = foo3.b)
-                           ->  Bitmap Heap Scan on foo2  (cost=0.00..0.00 
rows=1 width=8)
+                           ->  Bitmap Heap Scan on foo2  (cost=0.00..387.97 
rows=1 width=8)
                                  Recheck Cond: (c = 3)
                                  ->  Bitmap Index Scan on f2c  
(cost=0.00..0.00 rows=0 width=0)
                                        Index Cond: (c = 3)
@@ -12205,19 +12145,27 @@ EXPLAIN SELECT 1 FROM foo1, foo2 WHERE foo1.a = 
foo2.a AND foo2.c = 3 AND foo2.b
                                  ->  Broadcast Motion 3:3  (slice2; segments: 
3)  (cost=0.00..431.00 rows=2 width=4)
                                        ->  Seq Scan on foo3  
(cost=0.00..431.00 rows=1 width=4)
  Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+(16 rows)
 
-SELECT 1 FROM foo1, foo2 WHERE foo1.a = foo2.a AND foo2.c = 3 AND foo2.b IN 
(SELECT b FROM foo3);
+SELECT 1 FROM foo1 left join foo2 on foo1.a = foo2.a AND foo2.c = 3 AND foo2.b 
IN (SELECT b FROM foo3);
  ?column? 
 ----------
-(0 rows)
+        1
+        1
+(2 rows)
 
 reset optimizer_join_order;
 -- start_ignore
-select enable_xform('CXformInnerJoin2HashJoin');
+select enable_xform('CXformLeftOuterJoin2HashJoin');
+              enable_xform               
+-----------------------------------------
+ CXformLeftOuterJoin2HashJoin is enabled
+(1 row)
+
+select enable_xform('CXformImplementInnerJoin');
             enable_xform             
 -------------------------------------
- CXformInnerJoin2HashJoin is enabled
+ CXformImplementInnerJoin is enabled
 (1 row)
 
 -- end_ignore
@@ -13396,12 +13344,7 @@ select disable_xform('CXformJoin2BitmapIndexGetApply');
  CXformJoin2BitmapIndexGetApply is disabled
 (1 row)
 
-select disable_xform('CXformInnerJoin2NLJoin');
-           disable_xform            
-------------------------------------
- CXformInnerJoin2NLJoin is disabled
-(1 row)
-
+set optimizer_enable_nljoin=off;
 -- end_ignore
 -- Make sure we don't allow a regular (btree) index scan or index join for an 
AO table
 -- We disabled hash join, and bitmap index joins, NLJs, so this should leave 
ORCA no other choices
@@ -13461,12 +13404,7 @@ select enable_xform('CXformJoin2BitmapIndexGetApply');
  CXformJoin2BitmapIndexGetApply is enabled
 (1 row)
 
-select enable_xform('CXformInnerJoin2NLJoin');
-           enable_xform            
------------------------------------
- CXformInnerJoin2NLJoin is enabled
-(1 row)
-
+reset optimizer_enable_nljoin;
 -- end_ignore
 reset optimizer_enable_hashjoin;
 -- Tests converted from MDPs that use tables partitioned on text columns and 
similar types,
diff --git a/src/test/regress/sql/gporca.sql b/src/test/regress/sql/gporca.sql
index 2d45be2775..32800ed277 100644
--- a/src/test/regress/sql/gporca.sql
+++ b/src/test/regress/sql/gporca.sql
@@ -1514,8 +1514,6 @@ BEGIN
 END;
 $$ LANGUAGE plpgsql volatile;
 
--- force_explain
-set optimizer_segments = 3;
 explain
 select c.cid cid,
        c.firstname firstname,
@@ -1524,7 +1522,7 @@ select c.cid cid,
 from cust c, sales s, datedim d
 where c.cid = s.cid and s.date_sk = d.date_sk and
       ((d.year = 2001 and lower(s.type) = 't1' and plusone(d.moy) = 5) or 
(d.moy = 4 and upper(s.type) = 'T2'));
-reset optimizer_segments;
+
 -- Bitmap indexes
 drop table if exists orca.bm_test;
 create table orca.bm_test (i int, t text);
@@ -1779,15 +1777,6 @@ BEGIN
 END;
 $$ LANGUAGE plpgsql volatile;
 
--- start_ignore
-select disable_xform('CXformInnerJoin2DynamicIndexGetApply');
-select disable_xform('CXformInnerJoin2HashJoin');
-select disable_xform('CXformInnerJoin2IndexGetApply');
-select disable_xform('CXformInnerJoin2NLJoin');
--- end_ignore
-
-set optimizer_enable_indexjoin=on;
-
 -- force_explain
 set optimizer_segments = 3;
 EXPLAIN
@@ -1799,16 +1788,6 @@ WHERE tq.sym = tt.symbol AND
       tt.event_ts <  tq.end_ts
 GROUP BY 1
 ORDER BY 1 asc ;
-reset optimizer_segments;
-reset optimizer_enable_constant_expression_evaluation;
-reset optimizer_enable_indexjoin;
-
--- start_ignore
-select enable_xform('CXformInnerJoin2DynamicIndexGetApply');
-select enable_xform('CXformInnerJoin2HashJoin');
-select enable_xform('CXformInnerJoin2IndexGetApply');
-select enable_xform('CXformInnerJoin2NLJoin');
--- end_ignore
 
 -- MPP-25661: IndexScan crashing for qual with reference to outer tuple
 drop table if exists idxscan_outer;
@@ -2586,15 +2565,17 @@ ANALYZE foo3;
 set optimizer_join_order=query;
 -- we ignore enable/disable_xform statements as their output will differ if 
the server is compiled without Orca (the xform won't exist)
 -- start_ignore
-select disable_xform('CXformInnerJoin2HashJoin');
+select disable_xform('CXformLeftOuterJoin2HashJoin');
+select disable_xform('CXformImplementInnerJoin');
 -- end_ignore
 
-EXPLAIN SELECT 1 FROM foo1, foo2 WHERE foo1.a = foo2.a AND foo2.c = 3 AND 
foo2.b IN (SELECT b FROM foo3);
-SELECT 1 FROM foo1, foo2 WHERE foo1.a = foo2.a AND foo2.c = 3 AND foo2.b IN 
(SELECT b FROM foo3);
+EXPLAIN SELECT 1 FROM foo1 left join foo2 on foo1.a = foo2.a AND foo2.c = 3 
AND foo2.b IN (SELECT b FROM foo3);
+SELECT 1 FROM foo1 left join foo2 on foo1.a = foo2.a AND foo2.c = 3 AND foo2.b 
IN (SELECT b FROM foo3);
 
 reset optimizer_join_order;
 -- start_ignore
-select enable_xform('CXformInnerJoin2HashJoin');
+select enable_xform('CXformLeftOuterJoin2HashJoin');
+select enable_xform('CXformImplementInnerJoin');
 -- end_ignore
 -- Test that duplicate sensitive redistributes don't have invalid projection 
(eg: element that can't be hashed)
 drop table if exists t55;
@@ -2962,7 +2943,7 @@ explain (costs off) select * from tpart_dim d join 
tpart_ao_btree f on d.a=f.a w
 select disable_xform('CXformSelect2BitmapBoolOp');
 select disable_xform('CXformSelect2DynamicBitmapBoolOp');
 select disable_xform('CXformJoin2BitmapIndexGetApply');
-select disable_xform('CXformInnerJoin2NLJoin');
+set optimizer_enable_nljoin=off;
 -- end_ignore
 
 -- Make sure we don't allow a regular (btree) index scan or index join for an 
AO table
@@ -2978,7 +2959,7 @@ select * from tpart_dim d join tpart_ao_btree f on 
d.a=f.a where d.b=1;
 select enable_xform('CXformSelect2BitmapBoolOp');
 select enable_xform('CXformSelect2DynamicBitmapBoolOp');
 select enable_xform('CXformJoin2BitmapIndexGetApply');
-select enable_xform('CXformInnerJoin2NLJoin');
+reset optimizer_enable_nljoin;
 -- end_ignore
 
 reset optimizer_enable_hashjoin;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to