You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by en...@apache.org on 2024/10/30 06:42:46 UTC

(doris) branch master updated: [feature](Nereids): Optimize Query Plan by Pulling Up Join with Common Child from Union (#42033)

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

englefly pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 1d1c4259da8 [feature](Nereids): Optimize Query Plan by Pulling Up Join with Common Child from Union (#42033)
1d1c4259da8 is described below

commit 1d1c4259da8041302f985fd8df59e81ed718720e
Author: feiniaofeiafei <53...@users.noreply.github.com>
AuthorDate: Wed Oct 30 14:42:38 2024 +0800

    [feature](Nereids): Optimize Query Plan by Pulling Up Join with Common Child from Union (#42033)
    
    This pr adds rewrite rule PullUpJoinFromUnion, supports pull up join
    from union all separately, separates this rule from #28682, deletes the
    original PullUpJoinFromUnionAll rule.
---
 .../doris/nereids/jobs/executor/Rewriter.java      |   20 +-
 .../org/apache/doris/nereids/rules/RuleType.java   |    2 +-
 .../rules/rewrite/PullUpJoinFromUnionAll.java      | 1025 ++++++++++----------
 .../rules/rewrite/PullUpJoinFromUnionTest.java     |  171 ++++
 .../data/nereids_hint_tpcds_p0/shape/query11.out   |    2 +-
 .../data/nereids_hint_tpcds_p0/shape/query14.out   |   62 +-
 .../data/nereids_hint_tpcds_p0/shape/query4.out    |    2 +-
 .../data/nereids_hint_tpcds_p0/shape/query71.out   |   41 +-
 .../data/nereids_hint_tpcds_p0/shape/query74.out   |    2 +-
 .../data/nereids_hint_tpcds_p0/shape/query76.out   |   58 +-
 .../pull_up_join_from_union.out                    |  306 ++++++
 .../shape/query11.out                              |    2 +-
 .../shape/query14.out                              |   62 +-
 .../nereids_tpcds_shape_sf1000_p0/shape/query4.out |    2 +-
 .../shape/query71.out                              |   45 +-
 .../shape/query74.out                              |    2 +-
 .../shape/query76.out                              |   58 +-
 .../noStatsRfPrune/query11.out                     |    2 +-
 .../noStatsRfPrune/query14.out                     |   44 +-
 .../noStatsRfPrune/query4.out                      |    2 +-
 .../noStatsRfPrune/query71.out                     |   41 +-
 .../noStatsRfPrune/query74.out                     |    2 +-
 .../noStatsRfPrune/query76.out                     |   63 +-
 .../no_stats_shape/query11.out                     |    2 +-
 .../no_stats_shape/query14.out                     |   62 +-
 .../no_stats_shape/query4.out                      |    2 +-
 .../no_stats_shape/query71.out                     |   41 +-
 .../no_stats_shape/query74.out                     |    2 +-
 .../no_stats_shape/query76.out                     |   63 +-
 .../rf_prune/query11.out                           |    2 +-
 .../rf_prune/query14.out                           |   44 +-
 .../rf_prune/query4.out                            |    2 +-
 .../rf_prune/query71.out                           |   45 +-
 .../rf_prune/query74.out                           |    2 +-
 .../rf_prune/query76.out                           |   63 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query11.out |    2 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query14.out |   62 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query4.out  |    2 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query71.out |   45 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query74.out |    2 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query76.out |   63 +-
 .../shape/query14.out                              |   62 +-
 .../shape/query71.out                              |   41 +-
 .../shape/query76.out                              |   63 +-
 .../tpcds_sf100/noStatsRfPrune/query11.out         |    2 +-
 .../tpcds_sf100/noStatsRfPrune/query14.out         |   44 +-
 .../tpcds_sf100/noStatsRfPrune/query4.out          |    2 +-
 .../tpcds_sf100/noStatsRfPrune/query71.out         |   41 +-
 .../tpcds_sf100/noStatsRfPrune/query74.out         |    2 +-
 .../tpcds_sf100/noStatsRfPrune/query76.out         |   63 +-
 .../tpcds_sf100/no_stats_shape/query11.out         |    2 +-
 .../tpcds_sf100/no_stats_shape/query14.out         |   62 +-
 .../tpcds_sf100/no_stats_shape/query4.out          |    2 +-
 .../tpcds_sf100/no_stats_shape/query71.out         |   41 +-
 .../tpcds_sf100/no_stats_shape/query74.out         |    2 +-
 .../tpcds_sf100/no_stats_shape/query76.out         |   63 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query11.out |    2 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query14.out |   44 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query4.out  |    2 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query71.out |   45 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query74.out |    2 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query76.out |   63 +-
 .../new_shapes_p0/tpcds_sf100/shape/query11.out    |    2 +-
 .../new_shapes_p0/tpcds_sf100/shape/query14.out    |   62 +-
 .../new_shapes_p0/tpcds_sf100/shape/query4.out     |    2 +-
 .../new_shapes_p0/tpcds_sf100/shape/query71.out    |   45 +-
 .../new_shapes_p0/tpcds_sf100/shape/query74.out    |    2 +-
 .../new_shapes_p0/tpcds_sf100/shape/query76.out    |   63 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query11.out   |    2 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query14.out   |   62 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query4.out    |    2 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query71.out   |   45 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query74.out   |    2 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query76.out   |   63 +-
 .../pull_up_join_from_union.groovy                 |  429 ++++++++
 75 files changed, 2242 insertions(+), 1711 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index 75f2ddc7b70..f4ca9a972a6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -355,26 +355,10 @@ public class Rewriter extends AbstractBatchJobExecutor {
                     bottomUp(new EliminateJoinByFK()),
                     topDown(new EliminateJoinByUnique())
                 ),
-
-                // this rule should be after topic "Column pruning and infer predicate"
-                topic("Join pull up",
-                        topDown(
-                            new EliminateFilter(),
-                            new PushDownFilterThroughProject(),
-                            new MergeProjects()
-                        ),
-                        topDown(
-                            new PullUpJoinFromUnionAll()
-                        ),
-                        custom(RuleType.COLUMN_PRUNING, ColumnPruning::new),
-                        bottomUp(RuleSet.PUSH_DOWN_FILTERS),
-                        custom(RuleType.ELIMINATE_UNNECESSARY_PROJECT, EliminateUnnecessaryProject::new)
-                ),
-
-                // this rule should be invoked after topic "Join pull up"
                 topic("eliminate Aggregate according to fd items",
                         topDown(new EliminateGroupByKey()),
-                        topDown(new PushDownAggThroughJoinOnPkFk())
+                        topDown(new PushDownAggThroughJoinOnPkFk()),
+                        topDown(new PullUpJoinFromUnionAll())
                 ),
 
                 topic("Limit optimization",
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index 49bc07d6a31..08fbc9aafec 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -304,7 +304,7 @@ public enum RuleType {
 
     // split limit
     SPLIT_LIMIT(RuleTypeClass.REWRITE),
-    PULL_UP_JOIN_FROM_UNIONALL(RuleTypeClass.REWRITE),
+    PULL_UP_JOIN_FROM_UNION_ALL(RuleTypeClass.REWRITE),
     // limit push down
     PUSH_LIMIT_THROUGH_JOIN(RuleTypeClass.REWRITE),
     PUSH_LIMIT_THROUGH_PROJECT_JOIN(RuleTypeClass.REWRITE),
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionAll.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionAll.java
index 28d70ad558e..b3df9b92c56 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionAll.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionAll.java
@@ -17,648 +17,599 @@
 
 package org.apache.doris.nereids.rules.rewrite;
 
-import org.apache.doris.catalog.constraint.ForeignKeyConstraint;
-import org.apache.doris.catalog.constraint.PrimaryKeyConstraint;
-import org.apache.doris.catalog.constraint.UniqueConstraint;
-import org.apache.doris.nereids.hint.DistributeHint;
-import org.apache.doris.nereids.jobs.JobContext;
+import org.apache.doris.catalog.constraint.TableIdentifier;
+import org.apache.doris.common.Pair;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.EqualTo;
-import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
-import org.apache.doris.nereids.trees.expressions.literal.Literal;
-import org.apache.doris.nereids.trees.plans.DistributeType;
-import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.algebra.SetOperation.Qualifier;
-import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.logical.LogicalUnion;
-import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter;
-import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
-import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 
 /**
- * Pull up join from union all rule.
+ * Pull up join from union all rules with project:
+ *       Union
+ *       /    \
+ *   project    project
+ *   (optional) (optional)
+ *      |      |
+ *     Join   Join
+ *     / \    / \
+ *    t1 t2   t1 t3   (t1 is common side; t2,t3 is other side)
+ *  =====>
+ *          project
+ *            |
+ *           Join
+ *          /    \
+ *       Union   t1
+ *       /    \
+ *   project    project
+ *   (optional) (optional)
+ *      |      |
+ *      t2    t3
  */
 public class PullUpJoinFromUnionAll extends OneRewriteRuleFactory {
-    private static final Set<Class<? extends LogicalPlan>> SUPPORTED_PLAN_TYPE = ImmutableSet.of(
-            LogicalFilter.class,
-            LogicalJoin.class,
-            LogicalProject.class,
-            LogicalCatalogRelation.class
-    );
-
-    private static class PullUpContext {
-        public static final String unifiedOutputAlias = "PULL_UP_UNIFIED_OUTPUT_ALIAS";
-        public final Map<String, List<LogicalCatalogRelation>> pullUpCandidatesMaps = Maps.newHashMap();
-        public final Map<LogicalCatalogRelation, LogicalJoin> tableToJoinRootMap = Maps.newHashMap();
-        public final Map<LogicalCatalogRelation, LogicalAggregate> tableToAggrRootMap = Maps.newHashMap();
-        public final Map<NamedExpression, SlotReference> origChild0ToNewUnionOutputMap = Maps.newHashMap();
-        public final List<LogicalAggregate> aggrChildList = Lists.newArrayList();
-        public final List<LogicalJoin> joinChildList = Lists.newArrayList();
-        public final List<SlotReference> replaceColumns = Lists.newArrayList();
-        public final Map<LogicalCatalogRelation, Slot> pullUpTableToPkSlotMap = Maps.newHashMap();
-        public int replacedColumnIndex = -1;
-        public LogicalCatalogRelation pullUpTable;
-
-        // the slot will replace the original pk in group by and select list
-        public SlotReference replaceColumn;
-        public boolean needAddReplaceColumn = false;
-
-        public PullUpContext() {}
-
-        public void setReplacedColumn(SlotReference slot) {
-            this.replaceColumn = slot;
-        }
-
-        public void setPullUpTable(LogicalCatalogRelation table) {
-            this.pullUpTable = table;
-        }
-
-        public void setNeedAddReplaceColumn(boolean needAdd) {
-            this.needAddReplaceColumn = needAdd;
-        }
-    }
-
     @Override
     public Rule build() {
         return logicalUnion()
-                        .when(union -> union.getQualifier() != Qualifier.DISTINCT)
-                        .then(union -> {
-                            PullUpContext context = new PullUpContext();
-                            if (!checkUnionPattern(union, context)
-                                    || !checkJoinCondition(context)
-                                    || !checkGroupByKeys(context)) {
-                                return null;
-                            }
-                            // only support single table pull up currently
-                            if (context.pullUpCandidatesMaps.entrySet().size() != 1) {
-                                return null;
-                            }
+                .when(union -> union.getQualifier() != Qualifier.DISTINCT
+                        && union.getConstantExprsList().isEmpty())
+                .then(union -> {
+                    HashMap<Plan, List<Pair<LogicalJoin<?, ?>, Plan>>> commonChildrenMap =
+                            tryToExtractCommonChild(union);
+                    if (commonChildrenMap == null) {
+                        return null;
+                    }
 
-                            List<LogicalCatalogRelation> pullUpTableList = context.pullUpCandidatesMaps
-                                    .entrySet().iterator().next().getValue();
-                            if (pullUpTableList.size() != union.children().size()
-                                    || context.replaceColumns.size() != union.children().size()
-                                    || !checkNoFilterOnPullUpTable(pullUpTableList, context)) {
-                                return null;
-                            }
-                            // make new union node
-                            LogicalUnion newUnionNode = makeNewUnionNode(union, pullUpTableList, context);
-                            // make new join node
-                            LogicalJoin newJoin = makeNewJoin(newUnionNode, pullUpTableList.get(0), context);
-                            // add project on pull up table with origin union output
-                            List<NamedExpression> newProjectOutputs = makeNewProjectOutputs(union, newJoin, context);
+                    // The joinsAndCommonSides size is the same as the number of union children.
+                    List<Pair<LogicalJoin<?, ?>, Plan>> joinsAndCommonSides = null;
+                    for (List<Pair<LogicalJoin<?, ?>, Plan>> childSet : commonChildrenMap.values()) {
+                        if (childSet.size() == union.children().size()) {
+                            joinsAndCommonSides = childSet;
+                            break;
+                        }
+                    }
+                    if (joinsAndCommonSides == null) {
+                        return null;
+                    }
 
-                            return new LogicalProject(newProjectOutputs, newJoin);
-                        }).toRule(RuleType.PULL_UP_JOIN_FROM_UNIONALL);
-    }
+                    List<List<NamedExpression>> otherOutputsList = new ArrayList<>();
+                    List<Pair<Boolean, ExpressionOrIndex>> upperProjectExpressionOrIndex = new ArrayList<>();
+                    // First, check whether the output of the union child meets the requirements.
+                    if (!checkUnionChildrenOutput(union, joinsAndCommonSides, otherOutputsList,
+                            upperProjectExpressionOrIndex)) {
+                        return null;
+                    }
 
-    private boolean checkUnionPattern(LogicalUnion union, PullUpContext context) {
-        int tableListNumber = -1;
-        for (Plan child : union.children()) {
-            if (!(child instanceof LogicalProject
-                    && child.child(0) instanceof LogicalAggregate
-                    && child.child(0).child(0) instanceof LogicalProject
-                    && child.child(0).child(0).child(0) instanceof LogicalJoin)) {
-                return false;
-            }
-            LogicalAggregate aggrRoot = (LogicalAggregate) child.child(0);
-            if (!checkAggrRoot(aggrRoot)) {
-                return false;
-            }
-            context.aggrChildList.add(aggrRoot);
-            LogicalJoin joinRoot = (LogicalJoin) aggrRoot.child().child(0);
-            // check join under union is spj
-            if (!checkJoinRoot(joinRoot)) {
-                return false;
-            }
-            context.joinChildList.add(joinRoot);
+                    List<Map<SlotReference, List<SlotReference>>> commonSlotToOtherSlotMaps = new ArrayList<>();
+                    Set<SlotReference> joinCommonSlots = new LinkedHashSet<>();
+                    if (!checkJoinCondition(joinsAndCommonSides, commonSlotToOtherSlotMaps, joinCommonSlots)) {
+                        return null;
+                    }
 
-            List<LogicalCatalogRelation> tableList = getTableListUnderJoin(joinRoot);
-            // add into table -> joinRoot map
-            for (LogicalCatalogRelation table : tableList) {
-                context.tableToJoinRootMap.put(table, joinRoot);
-                context.tableToAggrRootMap.put(table, aggrRoot);
-            }
-            if (tableListNumber == -1) {
-                tableListNumber = tableList.size();
-            } else {
-                // check all union children have the same number of tables
-                if (tableListNumber != tableList.size()) {
-                    return false;
-                }
-            }
+                    Map<SlotReference, List<Integer>> commonSlotToProjectsIndex = new HashMap<>();
+                    LogicalUnion newUnion = constructNewUnion(joinsAndCommonSides, otherOutputsList,
+                            commonSlotToOtherSlotMaps, joinCommonSlots, commonSlotToProjectsIndex);
+                    LogicalJoin<LogicalUnion, Plan> newJoin = constructNewJoin(newUnion,
+                            commonSlotToProjectsIndex, joinsAndCommonSides);
+                    LogicalProject newProject = constructNewProject(union, newJoin, upperProjectExpressionOrIndex);
+                    return newProject;
+                }).toRule(RuleType.PULL_UP_JOIN_FROM_UNION_ALL);
+    }
 
-            for (LogicalCatalogRelation table : tableList) {
-                // key: qualified table name
-                // value: table list in all union children
-                String qName = makeQualifiedName(table);
-                if (context.pullUpCandidatesMaps.get(qName) == null) {
-                    List<LogicalCatalogRelation> newList = new ArrayList<>();
-                    newList.add(table);
-                    context.pullUpCandidatesMaps.put(qName, newList);
-                } else {
-                    context.pullUpCandidatesMaps.get(qName).add(table);
-                }
-            }
+    private LogicalProject<Plan> constructNewProject(LogicalUnion originUnion, LogicalJoin<LogicalUnion, Plan> newJoin,
+            List<Pair<Boolean, ExpressionOrIndex>> upperProjectExpressionOrIndex) {
+        List<Slot> originOutput = originUnion.getOutput();
+        List<NamedExpression> upperProjects = new ArrayList<>();
+        List<Slot> newUnionOutput = newJoin.left().getOutput();
+        if (originOutput.size() != upperProjectExpressionOrIndex.size()) {
+            return null;
         }
-        int expectedNumber = union.children().size();
-        List<String> toBeRemoved = new ArrayList<>();
-        // check the pull up table candidate exists in all union children
-        for (Map.Entry<String, List<LogicalCatalogRelation>> e : context.pullUpCandidatesMaps.entrySet()) {
-            if (e.getValue().size() != expectedNumber) {
-                toBeRemoved.add(e.getKey());
+        for (int i = 0; i < upperProjectExpressionOrIndex.size(); ++i) {
+            Pair<Boolean, ExpressionOrIndex> pair = upperProjectExpressionOrIndex.get(i);
+            boolean fromCommon = pair.first;
+            if (fromCommon) {
+                upperProjects.add(new Alias(originOutput.get(i).getExprId(), pair.second.exprFromCommonSide,
+                        originOutput.get(i).getName()));
+            } else {
+                upperProjects.add(new Alias(originOutput.get(i).getExprId(),
+                        newUnionOutput.get(pair.second.indexOfNewUnionOutput), originOutput.get(i).getName()));
             }
         }
-        for (String key : toBeRemoved) {
-            context.pullUpCandidatesMaps.remove(key);
-        }
-        return !context.pullUpCandidatesMaps.isEmpty();
+        return new LogicalProject<>(upperProjects, newJoin);
     }
 
-    private boolean checkJoinCondition(PullUpContext context) {
-        List<String> toBeRemoved = new ArrayList<>();
-        for (Map.Entry<String, List<LogicalCatalogRelation>> e : context.pullUpCandidatesMaps.entrySet()) {
-            List<LogicalCatalogRelation> tableList = e.getValue();
-            boolean allFound = true;
-            for (LogicalCatalogRelation table : tableList) {
-                LogicalJoin joinRoot = context.tableToJoinRootMap.get(table);
-                if (joinRoot == null) {
-                    return false;
-                } else if (!checkJoinConditionOnPk(joinRoot, table, context)) {
-                    allFound = false;
-                    break;
-                }
-            }
-            if (!allFound) {
-                toBeRemoved.add(e.getKey());
+    private LogicalJoin<LogicalUnion, Plan> constructNewJoin(LogicalUnion union,
+            Map<SlotReference, List<Integer>> commonSlotToProjectsIndex,
+            List<Pair<LogicalJoin<?, ?>, Plan>> commonChild) {
+        LogicalJoin<?, ?> originalJoin = commonChild.iterator().next().first;
+        Plan newCommon = commonChild.iterator().next().second;
+        List<Expression> newHashExpressions = new ArrayList<>();
+        List<Slot> unionOutputs = union.getOutput();
+        for (Map.Entry<SlotReference, List<Integer>> entry : commonSlotToProjectsIndex.entrySet()) {
+            SlotReference commonSlot = entry.getKey();
+            for (Integer index : entry.getValue()) {
+                newHashExpressions.add(new EqualTo(unionOutputs.get(index), commonSlot));
             }
         }
-        for (String table : toBeRemoved) {
-            context.pullUpCandidatesMaps.remove(table);
-        }
-
-        if (context.pullUpCandidatesMaps.isEmpty()) {
-            return false;
-        }
-        return true;
+        return (LogicalJoin<LogicalUnion, Plan>) originalJoin
+                .withJoinConjuncts(newHashExpressions, ImmutableList.of(), originalJoin.getJoinReorderContext())
+                .withChildren(union, newCommon);
     }
 
-    private boolean checkGroupByKeys(PullUpContext context) {
-        List<String> toBeRemoved = new ArrayList<>();
-        for (Map.Entry<String, List<LogicalCatalogRelation>> e : context.pullUpCandidatesMaps.entrySet()) {
-            List<LogicalCatalogRelation> tableList = e.getValue();
-            boolean allFound = true;
-            for (LogicalCatalogRelation table : tableList) {
-                LogicalAggregate aggrRoot = context.tableToAggrRootMap.get(table);
-                if (aggrRoot == null) {
-                    return false;
-                } else if (!checkAggrKeyOnUkOrPk(aggrRoot, table)) {
-                    allFound = false;
-                    break;
-                }
+    // Output parameter: commonSlotToProjectsIndex, key is the common slot of join condition,
+    // value is the index of the other slot corresponding to this common slot in the union output,
+    // which is used to construct the join condition of the new join.
+    private LogicalUnion constructNewUnion(List<Pair<LogicalJoin<?, ?>, Plan>> joinsAndCommonSides,
+            List<List<NamedExpression>> otherOutputsList,
+            List<Map<SlotReference, List<SlotReference>>> commonSlotToOtherSlotMaps,
+            Set<SlotReference> joinCommonSlots, Map<SlotReference, List<Integer>> commonSlotToProjectsIndex) {
+        List<Plan> newChildren = new ArrayList<>();
+        for (int i = 0; i < joinsAndCommonSides.size(); ++i) {
+            Pair<LogicalJoin<?, ?>, Plan> pair = joinsAndCommonSides.get(i);
+            // find the child that is not the common side
+            Plan otherSide;
+            if (pair.second == pair.first.left()) {
+                otherSide = pair.first.right();
+            } else {
+                otherSide = pair.first.left();
             }
-            if (!allFound) {
-                toBeRemoved.add(e.getKey());
+            List<NamedExpression> projects = otherOutputsList.get(i);
+            // In projects, we also need to add the other slot in join condition
+            // TODO: may eliminate repeated output slots:
+            // e.g.select t2.a from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+            // select t3.a from test_like1 t1 join test_like3 t3 on t1.a=t3.a;
+            // new union child will output t2.a/t3.a twice. one for output, the other for join condition.
+            Map<SlotReference, List<SlotReference>> commonSlotToOtherSlotMap = commonSlotToOtherSlotMaps.get(i);
+            for (SlotReference commonSlot : joinCommonSlots) {
+                List<SlotReference> otherSlots = commonSlotToOtherSlotMap.get(commonSlot);
+                for (SlotReference otherSlot : otherSlots) {
+                    if (i == 0) {
+                        int index = projects.size();
+                        commonSlotToProjectsIndex.computeIfAbsent(commonSlot, k -> new ArrayList<>()).add(index);
+                    }
+                    projects.add(otherSlot);
+                }
             }
-        }
-        for (String table : toBeRemoved) {
-            context.pullUpCandidatesMaps.remove(table);
+            LogicalProject<Plan> logicalProject = new LogicalProject<>(projects, otherSide);
+            newChildren.add(logicalProject);
         }
 
-        if (context.pullUpCandidatesMaps.isEmpty()) {
-            return false;
-        }
-        return true;
+        //2. construct new union
+        LogicalUnion newUnion = new LogicalUnion(Qualifier.ALL, newChildren);
+        List<List<SlotReference>> childrenOutputs = newChildren.stream()
+                .map(p -> p.getOutput().stream()
+                        .map(SlotReference.class::cast)
+                        .collect(ImmutableList.toImmutableList()))
+                .collect(ImmutableList.toImmutableList());
+        newUnion = (LogicalUnion) newUnion.withChildrenAndTheirOutputs(newChildren, childrenOutputs);
+        newUnion = newUnion.withNewOutputs(newUnion.buildNewOutputs());
+        return newUnion;
     }
 
-    private boolean checkNoFilterOnPullUpTable(List<LogicalCatalogRelation> pullUpTableList, PullUpContext context) {
-        for (LogicalCatalogRelation table : pullUpTableList) {
-            LogicalJoin joinRoot = context.tableToJoinRootMap.get(table);
-            if (joinRoot == null) {
-                return false;
+    /** This function is used to check whether the join condition meets the optimization condition
+     * Check the join condition, requiring that the join condition of each join is equal and the number is the same.
+     * Generate commonSlotToOtherSlotMaps. In each map of the list, the keySet must be the same,
+     * and the length of the value list of the same key must be the same.
+     * These are sql that can not do this transform:
+     * SQL1: select t2.a+1,2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select t3.a+1,3 from test_like1 t1 join test_like3 t3 on t1.a=t3.a and t1.b=t3.b;
+     * SQL2: select t2.a+1,2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select t3.a+1,3 from test_like1 t1 join test_like3 t3 on t1.b=t3.a;
+     * SQL3: select t2.a+1,2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select t3.a+1,3 from test_like1 t1 join test_like3 t3 on t1.a=t3.a and t1.a=t3.b;
+     * @param commonSlotToOtherSlotMaps Output parameter that records the join conditions for each join operation.
+     *                                  The key represents the slot on the common side of the join, while the value
+     *                                  corresponds to the slot on the other side.
+     *                                  Example:
+     *                                  For the following SQL:
+     *                                  SELECT t2.a + 1, 2 FROM test_like1 t1
+     *                                  JOIN test_like2 t2 ON t1.a = t2.a AND t1.a = t2.c AND t1.b = t2.b
+     *                                  UNION ALL
+     *                                  SELECT t3.a + 1, 3 FROM test_like1 t1
+     *                                  JOIN test_like3 t3 ON t1.a = t3.a AND t1.a = t3.d AND t1.b = t3.b;
+     *                                  commonSlotToOtherSlotMaps would be:
+     *                                  {{t1.a: t2.a, t2.c; t1.b: t2.b}, {t1.a: t3.a, t3.d; t1.b: t3.b}}
+     *                                  This parameter is used to verify if the join conditions meet
+     *                                  optimization requirements and to help generate new join conditions.
+     * @param joinCommonSlots output parameter, which records join common side slots.
+     * */
+    private boolean checkJoinCondition(List<Pair<LogicalJoin<?, ?>, Plan>> joinsAndCommonSides,
+            List<Map<SlotReference, List<SlotReference>>> commonSlotToOtherSlotMaps,
+            Set<SlotReference> joinCommonSlots) {
+        Map<SlotReference, List<SlotReference>> conditionMapFirst = new HashMap<>();
+        Map<Slot, Slot> commonJoinSlotMap = buildCommonJoinMap(joinsAndCommonSides);
+        for (int i = 0; i < joinsAndCommonSides.size(); ++i) {
+            Pair<LogicalJoin<?, ?>, Plan> pair = joinsAndCommonSides.get(i);
+            LogicalJoin<?, ?> join = pair.first;
+            Plan commonSide = pair.second;
+            Map<SlotReference, List<SlotReference>> conditionMapSubsequent = new HashMap<>();
+            for (Expression condition : join.getHashJoinConjuncts()) {
+                if (!(condition instanceof EqualTo)) {
+                    return false;
+                }
+                EqualTo equalTo = (EqualTo) condition;
+                if (!(equalTo.left() instanceof SlotReference) || !(equalTo.right() instanceof SlotReference)) {
+                    return false;
+                }
+                SlotReference commonSideSlot;
+                SlotReference otherSideSlot;
+                if (commonSide.getOutputSet().contains(equalTo.left())) {
+                    commonSideSlot = (SlotReference) equalTo.left();
+                    otherSideSlot = (SlotReference) equalTo.right();
+                } else {
+                    commonSideSlot = (SlotReference) equalTo.right();
+                    otherSideSlot = (SlotReference) equalTo.left();
+                }
+                if (i == 0) {
+                    conditionMapFirst.computeIfAbsent(commonSideSlot, k -> new ArrayList<>()).add(otherSideSlot);
+                    joinCommonSlots.add(commonSideSlot);
+                } else {
+                    conditionMapSubsequent.computeIfAbsent(
+                            (SlotReference) ExpressionUtils.replace(commonSideSlot, commonJoinSlotMap),
+                            k -> new ArrayList<>()).add(otherSideSlot);
+                }
+            }
+            if (i == 0) {
+                commonSlotToOtherSlotMaps.add(conditionMapFirst);
             } else {
-                List<LogicalFilter> filterList = new ArrayList<>();
-                filterList.addAll((Collection<? extends LogicalFilter>)
-                        joinRoot.collect(LogicalFilter.class::isInstance));
-                for (LogicalFilter filter : filterList) {
-                    if (filter.child().equals(context.pullUpTable)) {
+                // reject SQL1
+                if (conditionMapSubsequent.size() != conditionMapFirst.size()) {
+                    return false;
+                }
+                // reject SQL2
+                if (!conditionMapSubsequent.keySet().equals(conditionMapFirst.keySet())) {
+                    return false;
+                }
+                // reject SQL3
+                for (Map.Entry<SlotReference, List<SlotReference>> entry : conditionMapFirst.entrySet()) {
+                    SlotReference commonSlot = entry.getKey();
+                    if (conditionMapSubsequent.get(commonSlot).size() != entry.getValue().size()) {
                         return false;
                     }
                 }
+                commonSlotToOtherSlotMaps.add(conditionMapSubsequent);
             }
         }
         return true;
     }
 
-    private boolean checkAggrKeyOnUkOrPk(LogicalAggregate aggregate, LogicalCatalogRelation table) {
-        List<Expression> groupByKeys = aggregate.getGroupByExpressions();
-        boolean isAllSlotReference = groupByKeys.stream().allMatch(e -> e instanceof SlotReference);
-        if (!isAllSlotReference) {
-            return false;
-        } else {
-            Set<String> ukInfo = getUkInfoFromConstraint(table);
-            Set<String> pkInfo = getPkInfoFromConstraint(table);
-            if (ukInfo == null || pkInfo == null || ukInfo.size() != 1 || pkInfo.size() != 1) {
-                return false;
+    // Make a map to map the output of all other joins to the output of the first join
+    private Map<Slot, Slot> buildCommonJoinMap(List<Pair<LogicalJoin<?, ?>, Plan>> commonChild) {
+        Map<Slot, Slot> commonJoinSlotMap = new HashMap<>();
+        List<Slot> firstJoinOutput = new ArrayList<>();
+        for (int i = 0; i < commonChild.size(); ++i) {
+            Pair<LogicalJoin<?, ?>, Plan> pair = commonChild.get(i);
+            Plan commonSide = pair.second;
+            if (i == 0) {
+                firstJoinOutput.addAll(commonSide.getOutput());
+                for (Slot slot : commonSide.getOutput()) {
+                    commonJoinSlotMap.put(slot, slot);
+                }
             } else {
-                String ukName = ukInfo.iterator().next();
-                String pkName = pkInfo.iterator().next();
-                for (Object expr : aggregate.getGroupByExpressions()) {
-                    SlotReference slot = (SlotReference) expr;
-                    if (table.getOutputExprIds().contains(slot.getExprId())
-                            && (slot.getName().equals(ukName) || slot.getName().equals(pkName))) {
-                        return true;
-                    }
+                for (int j = 0; j < commonSide.getOutput().size(); ++j) {
+                    commonJoinSlotMap.put(commonSide.getOutput().get(j), firstJoinOutput.get(j));
                 }
-                return false;
             }
         }
+        return commonJoinSlotMap;
     }
 
-    private boolean checkJoinConditionOnPk(LogicalJoin joinRoot, LogicalCatalogRelation table, PullUpContext context) {
-        Set<String> pkInfos = getPkInfoFromConstraint(table);
-        if (pkInfos == null || pkInfos.size() != 1) {
+    private class ExpressionOrIndex {
+        Expression exprFromCommonSide = null;
+        int indexOfNewUnionOutput = -1;
+
+        private ExpressionOrIndex(Expression expr) {
+            exprFromCommonSide = expr;
+        }
+
+        private ExpressionOrIndex(int index) {
+            indexOfNewUnionOutput = index;
+        }
+    }
+
+    /** In the union child output, the number of outputs from the common side must be the same in each child output,
+     * and the outputs from the common side must be isomorphic (both a+1) and have the same index in the union output.
+     * In the union child output, the number of outputs from the non-common side must also be the same,
+     * but they do not need to be isomorphic.
+     * These are sql that can not do this transform:
+     * SQL1: select t2.a+t1.a from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select t3.a+1 from test_like1 t1 join test_like3 t3 on t1.a=t3.a;
+     * SQL2: select t2.a from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select t1.a from test_like1 t1 join test_like3 t3 on t1.a=t3.a;
+     * SQL3: select t1.a+1 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select t1.a+2 from test_like1 t1 join test_like3 t3 on t1.a=t3.a;
+     * SQL4: select t1.a from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+     * select 1 from test_like1 t1 join test_like3 t3 on t1.a=t3.a;
+     * @param otherOutputsList output parameter that stores the outputs of the other side.
+     *                         The length of each element in otherOutputsList must be the same.
+     *                         The i-th element represents the output of the other side in the i-th child of the union.
+     *                         This parameter is used to create child nodes of a new Union
+     *                         in the constructNewUnion function.
+     *
+     * @param upperProjectExpressionOrIndex Output parameter used in the constructNewProject function to create
+     *                                      the top-level project.This parameter records the output column order of
+     *                                      the original union and determines,based on the new join output, the columns
+     *                                      or expressions to output in the upper-level project operator. The size of
+     *                                      upperProjectExpressionOrIndex must match the output size of
+     *                                      the original union。
+     *                                      Each Pair in the List represents an output source:
+     *                                      - Pair.first (Boolean): Indicates whether the output is from
+     *                                      the common side (true) or the other side (false).
+     *                                      - Pair.second (Object): When Pair.first is true, it stores
+     *                                      the common side's output expression.When false, it saves the output index
+     *                                      of the other side. Since the new union output is not yet constructed
+     *                                      at this point, only the index is stored.
+     *                                      The function’s check ensures that outputs at the same position in
+     *                                      union children either come from the common side or from the other side.
+     *                                      When the final join is constructed, the common side uses the first join's
+     *                                      common side, so only the first child’s outputs need to be processed to
+     *                                      fill in upperProjectExpressionOrIndex.
+     */
+    private boolean checkUnionChildrenOutput(LogicalUnion union,
+            List<Pair<LogicalJoin<?, ?>, Plan>> joinsAndCommonSides,
+            List<List<NamedExpression>> otherOutputsList,
+            List<Pair<Boolean, ExpressionOrIndex>> upperProjectExpressionOrIndex) {
+        List<List<SlotReference>> regularChildrenOutputs = union.getRegularChildrenOutputs();
+        int arity = union.arity();
+        if (arity == 0) {
             return false;
         }
-        String pkSlot = pkInfos.iterator().next();
-        List<LogicalJoin> joinList = new ArrayList<>();
-        joinList.addAll((Collection<? extends LogicalJoin>) joinRoot.collect(LogicalJoin.class::isInstance));
-        boolean found = false;
-        for (LogicalJoin join : joinList) {
-            List<Expression> conditions = join.getHashJoinConjuncts();
-            List<LogicalCatalogRelation> basicTableList = new ArrayList<>();
-            basicTableList.addAll((Collection<? extends LogicalCatalogRelation>) join
-                    .collect(LogicalCatalogRelation.class::isInstance));
-            for (Expression equalTo : conditions) {
-                if (equalTo instanceof EqualTo
-                        && ((EqualTo) equalTo).left() instanceof SlotReference
-                        && ((EqualTo) equalTo).right() instanceof SlotReference) {
-                    SlotReference leftSlot = (SlotReference) ((EqualTo) equalTo).left();
-                    SlotReference rightSlot = (SlotReference) ((EqualTo) equalTo).right();
-                    if (table.getOutputExprIds().contains(leftSlot.getExprId())
-                            && pkSlot.equals(leftSlot.getName())) {
-                        // pk-fk join condition, check other side's join key is on fk
-                        LogicalCatalogRelation rightTable = findTableFromSlot(rightSlot, basicTableList);
-                        if (rightTable != null && getFkInfoFromConstraint(rightTable) != null) {
-                            ForeignKeyConstraint fkInfo = getFkInfoFromConstraint(rightTable);
-                            if (fkInfo.getReferencedTable().getId() == table.getTable().getId()) {
-                                for (Map.Entry<String, String> entry : fkInfo.getForeignToReference().entrySet()) {
-                                    if (entry.getValue().equals(pkSlot) && entry.getKey().equals(rightSlot.getName())) {
-                                        found = true;
-                                        context.replaceColumns.add(rightSlot);
-                                        context.pullUpTableToPkSlotMap.put(table, leftSlot);
-                                        break;
-                                    }
+        // fromCommonSide is used to ensure that the outputs at the same position in the union children
+        // must all come from the common side or from the other side
+        boolean[] fromCommonSide = new boolean[regularChildrenOutputs.get(0).size()];
+        // checkSameExpr and commonJoinSlotMap are used to ensure that Expr from the common side have the same structure
+        Expression[] checkSameExpr = new Expression[regularChildrenOutputs.get(0).size()];
+        Map<Slot, Slot> commonJoinSlotMap = buildCommonJoinMap(joinsAndCommonSides);
+        for (int i = 0; i < arity; ++i) {
+            List<SlotReference> regularChildrenOutput = regularChildrenOutputs.get(i);
+            Plan child = union.child(i);
+            List<NamedExpression> otherOutputs = new ArrayList<>();
+            for (int j = 0; j < regularChildrenOutput.size(); ++j) {
+                SlotReference slot = regularChildrenOutput.get(j);
+                if (child instanceof LogicalProject) {
+                    LogicalProject<Plan> project = (LogicalProject<Plan>) child;
+                    int index = project.getOutput().indexOf(slot);
+                    NamedExpression expr = project.getOutputs().get(index);
+                    Slot insideSlot;
+                    Expression insideExpr;
+                    Set<Slot> inputSlots = expr.getInputSlots();
+                    // reject SQL1
+                    if (inputSlots.size() > 1) {
+                        return false;
+                    } else if (inputSlots.size() == 1) {
+                        if (expr instanceof Alias) {
+                            insideSlot = inputSlots.iterator().next();
+                            insideExpr = expr.child(0);
+                        } else if (expr instanceof SlotReference) {
+                            insideSlot = (Slot) expr;
+                            insideExpr = expr;
+                        } else {
+                            return false;
+                        }
+
+                        Plan commonSide = joinsAndCommonSides.get(i).second;
+                        if (i == 0) {
+                            if (commonSide.getOutputSet().contains(insideSlot)) {
+                                fromCommonSide[j] = true;
+                                checkSameExpr[j] = insideExpr;
+                                upperProjectExpressionOrIndex.add(Pair.of(true, new ExpressionOrIndex(insideExpr)));
+                            } else {
+                                fromCommonSide[j] = false;
+                                upperProjectExpressionOrIndex.add(Pair.of(false, new ExpressionOrIndex(
+                                        otherOutputs.size())));
+                                otherOutputs.add(expr);
+                            }
+                        } else {
+                            // reject SQL2
+                            if (commonSide.getOutputSet().contains(insideSlot) != fromCommonSide[j]) {
+                                return false;
+                            }
+                            // reject SQL3
+                            if (commonSide.getOutputSet().contains(insideSlot)) {
+                                Expression sameExpr = ExpressionUtils.replace(insideExpr, commonJoinSlotMap);
+                                if (!sameExpr.equals(checkSameExpr[j])) {
+                                    return false;
                                 }
+                            } else {
+                                otherOutputs.add(expr);
                             }
                         }
-                    } else if (table.getOutputExprIds().contains(rightSlot.getExprId())
-                            && pkSlot.equals(rightSlot.getName())) {
-                        // pk-fk join condition, check other side's join key is on fk
-                        LogicalCatalogRelation leftTable = findTableFromSlot(leftSlot, basicTableList);
-                        if (leftTable != null && getFkInfoFromConstraint(leftTable) != null) {
-                            ForeignKeyConstraint fkInfo = getFkInfoFromConstraint(leftTable);
-                            if (fkInfo.getReferencedTable().getId() == table.getTable().getId()) {
-                                for (Map.Entry<String, String> entry : fkInfo.getForeignToReference().entrySet()) {
-                                    if (entry.getValue().equals(pkSlot) && entry.getKey().equals(leftSlot.getName())) {
-                                        found = true;
-                                        context.replaceColumns.add(leftSlot);
-                                        context.pullUpTableToPkSlotMap.put(table, rightSlot);
-                                        break;
-                                    }
-                                }
+                    } else if (expr.getInputSlots().isEmpty()) {
+                        // Constants must come from other side
+                        if (i == 0) {
+                            fromCommonSide[j] = false;
+                            upperProjectExpressionOrIndex.add(Pair.of(false, new ExpressionOrIndex(
+                                    otherOutputs.size())));
+                        } else {
+                            // reject SQL4
+                            if (fromCommonSide[j]) {
+                                return false;
                             }
                         }
+                        otherOutputs.add(expr);
                     }
-                    if (found) {
-                        break;
+                } else if (child instanceof LogicalJoin) {
+                    Plan commonSide = joinsAndCommonSides.get(i).second;
+                    if (i == 0) {
+                        if (commonSide.getOutputSet().contains(slot)) {
+                            fromCommonSide[j] = true;
+                            checkSameExpr[j] = slot;
+                            upperProjectExpressionOrIndex.add(Pair.of(true, new ExpressionOrIndex(slot)));
+                        } else {
+                            fromCommonSide[j] = false;
+                            upperProjectExpressionOrIndex.add(Pair.of(false,
+                                    new ExpressionOrIndex(otherOutputs.size())));
+                            otherOutputs.add(slot);
+                        }
+                    } else {
+                        // reject SQL2
+                        if (commonSide.getOutputSet().contains(slot) != fromCommonSide[j]) {
+                            return false;
+                        }
+                        // reject SQL3
+                        if (commonSide.getOutputSet().contains(slot)) {
+                            Expression sameExpr = ExpressionUtils.replace(slot, commonJoinSlotMap);
+                            if (!sameExpr.equals(checkSameExpr[j])) {
+                                return false;
+                            }
+                        } else {
+                            otherOutputs.add(slot);
+                        }
                     }
                 }
             }
-            if (found) {
-                break;
-            }
+            otherOutputsList.add(otherOutputs);
         }
-        return found;
+        return true;
     }
 
-    private LogicalCatalogRelation findTableFromSlot(SlotReference targetSlot,
-            List<LogicalCatalogRelation> tableList) {
-        for (LogicalCatalogRelation table : tableList) {
-            if (table.getOutputExprIds().contains(targetSlot.getExprId())) {
-                return table;
+    /**
+     * Attempts to extract common children from a LogicalUnion.
+     *
+     * This method iterates through all children of the union, looking for LogicalJoin operations,
+     * and tries to identify common left or right subtrees. The results are stored in a Map where
+     * keys are potential common subtrees and values are lists of pairs containing the original
+     * join and the corresponding subtree.
+     *
+     * For example, given the following union:
+     *   Union
+     *    ├─ Join(A, B)
+     *    ├─ Join(A, C)
+     *    └─ Join(D, B)
+     *
+     * The returned Map would contain:
+     *   A -> [(Join(A,B), A), (Join(A,C), A)]
+     *   B -> [(Join(A,B), B), (Join(D,B), B)]
+     *
+     * This indicates that both A and B are potential common subtrees that could be extracted.
+     *
+     * @param union The LogicalUnion to analyze
+     * @return A Map containing potential common subtrees, or null if extraction is not possible
+     */
+    private @Nullable HashMap<Plan, List<Pair<LogicalJoin<?, ?>, Plan>>> tryToExtractCommonChild(LogicalUnion union) {
+        HashMap<Plan, List<Pair<LogicalJoin<?, ?>, Plan>>> planCount = new HashMap<>();
+        for (Plan child : union.children()) {
+            LogicalJoin<? extends Plan, ? extends Plan> join = tryToGetJoin(child);
+            if (join == null) {
+                return null;
+            }
+            boolean added = false;
+            for (Plan plan : planCount.keySet()) {
+                LogicalPlanComparator comparator = new LogicalPlanComparator();
+                if (comparator.isLogicalEqual(join.left(), plan)) {
+                    planCount.get(plan).add(Pair.of(join, join.left()));
+                    added = true;
+                    break;
+                } else if (comparator.isLogicalEqual(join.right(), plan)) {
+                    planCount.get(plan).add(Pair.of(join, join.right()));
+                    added = true;
+                    break;
+                }
             }
-        }
-        return null;
-    }
 
-    private ForeignKeyConstraint getFkInfoFromConstraint(LogicalCatalogRelation table) {
-        Set<ForeignKeyConstraint> foreignKeyConstraints = table.getTable().getForeignKeyConstraints();
-        if (foreignKeyConstraints.isEmpty()) {
-            return null;
+            if (!added) {
+                planCount.put(join.left(), Lists.newArrayList(Pair.of(join, join.left())));
+                planCount.put(join.right(), Lists.newArrayList(Pair.of(join, join.right())));
+            }
         }
-        return foreignKeyConstraints.stream().iterator().next();
+        return planCount;
     }
 
-    private Set<String> getPkInfoFromConstraint(LogicalCatalogRelation table) {
-        Set<PrimaryKeyConstraint> primaryKeyConstraints = table.getTable().getPrimaryKeyConstraints();
-        if (primaryKeyConstraints.isEmpty()) {
-            return null;
+    // we only allow project(join) or join()
+    private @Nullable LogicalJoin<?, ?> tryToGetJoin(Plan child) {
+        if (child instanceof LogicalProject) {
+            child = child.child(0);
         }
-        return primaryKeyConstraints.stream().iterator().next().getPrimaryKeyNames();
-    }
-
-    private Set<String> getUkInfoFromConstraint(LogicalCatalogRelation table) {
-        Set<UniqueConstraint> uniqueConstraints = table.getTable().getUniqueConstraints();
-        if (uniqueConstraints.isEmpty()) {
-            return null;
+        if (child instanceof LogicalJoin
+                && ((LogicalJoin<?, ?>) child).getJoinType().isInnerJoin()
+                && ((LogicalJoin<?, ?>) child).getOtherJoinConjuncts().isEmpty()
+                && !((LogicalJoin<?, ?>) child).isMarkJoin()) {
+            return (LogicalJoin<?, ?>) child;
         }
-        return uniqueConstraints.stream().iterator().next().getUniqueColumnNames();
+        return null;
     }
 
-    private boolean checkJoinRoot(LogicalJoin joinRoot) {
-        List<LogicalPlan> joinChildrenPlans = Lists.newArrayList();
-        joinChildrenPlans.addAll((Collection<? extends LogicalPlan>) joinRoot
-                .collect(LogicalPlan.class::isInstance));
-        boolean planTypeMatch = joinChildrenPlans.stream()
-                .allMatch(p -> SUPPORTED_PLAN_TYPE.stream().anyMatch(c -> c.isInstance(p)));
-        if (!planTypeMatch) {
-            return false;
-        }
-
-        List<LogicalJoin> allJoinNodes = Lists.newArrayList();
-        allJoinNodes.addAll((Collection<? extends LogicalJoin>) joinRoot.collect(LogicalJoin.class::isInstance));
-        boolean joinTypeMatch = allJoinNodes.stream().allMatch(e -> e.getJoinType() == JoinType.INNER_JOIN);
-        boolean joinConditionMatch = allJoinNodes.stream()
-                .allMatch(e -> !e.getHashJoinConjuncts().isEmpty() && e.getOtherJoinConjuncts().isEmpty());
-        if (!joinTypeMatch || !joinConditionMatch) {
-            return false;
-        }
-
-        return true;
-    }
+    class LogicalPlanComparator {
+        private HashMap<Expression, Expression> plan1ToPlan2 = new HashMap<>();
 
-    private boolean checkAggrRoot(LogicalAggregate aggrRoot) {
-        for (Object expr : aggrRoot.getGroupByExpressions()) {
-            if (!(expr instanceof NamedExpression)) {
+        public boolean isLogicalEqual(Plan plan1, Plan plan2) {
+            if (plan1.children().size() != plan2.children().size()) {
                 return false;
             }
-        }
-        return true;
-    }
-
-    private List<LogicalCatalogRelation> getTableListUnderJoin(LogicalJoin joinRoot) {
-        List<LogicalCatalogRelation> tableLists = new ArrayList<>();
-        tableLists.addAll((Collection<? extends LogicalCatalogRelation>) joinRoot
-                .collect(LogicalCatalogRelation.class::isInstance));
-        return tableLists;
-    }
-
-    private String makeQualifiedName(LogicalCatalogRelation table) {
-        String dbName = table.getTable().getDatabase().getFullName();
-        String tableName = table.getTable().getName();
-        return dbName + ":" + tableName;
-    }
-
-    private Plan doPullUpJoinFromUnionAll(Plan unionChildPlan, PullUpContext context) {
-        return PullUpRewriter.INSTANCE.rewrite(unionChildPlan, context);
-    }
-
-    private List<Plan> doWrapReplaceColumnForUnionChildren(List<Plan> unionChildren, PullUpContext context) {
-        List<Plan> newUnionChildren = new ArrayList<>();
-        for (int i = 0; i < unionChildren.size(); i++) {
-            // has been checked before
-            LogicalProject oldProject = (LogicalProject) unionChildren.get(i);
-            List<NamedExpression> newNamedExpressionList = new ArrayList<>();
-            for (int j = 0; j < oldProject.getProjects().size(); j++) {
-                Object child = oldProject.getProjects().get(j);
-                if (context.replaceColumns.contains(child)) {
-                    Alias newExpr = new Alias((Expression) child, context.unifiedOutputAlias);
-                    newNamedExpressionList.add(newExpr);
-                    context.replacedColumnIndex = j;
-                } else {
-                    newNamedExpressionList.add((NamedExpression) child);
-                }
-            }
-            LogicalProject newProject = new LogicalProject(newNamedExpressionList, (LogicalPlan) oldProject.child());
-            newUnionChildren.add(newProject);
-        }
-        return newUnionChildren;
-    }
-
-    private List<NamedExpression> makeNewProjectOutputs(LogicalUnion origUnion,
-            LogicalJoin newJoin, PullUpContext context) {
-        List<NamedExpression> newProjectOutputs = new ArrayList<>();
-        List<Slot> origUnionSlots = origUnion.getOutput();
-        List<NamedExpression> origUnionChildOutput = ((LogicalProject) origUnion.child(0)).getOutputs();
-        for (int i = 0; i < origUnionChildOutput.size(); i++) {
-            NamedExpression unionOutputExpr = origUnionChildOutput.get(i);
-            if (unionOutputExpr instanceof Alias) {
-                if (!(unionOutputExpr.child(0) instanceof Literal)) {
-                    unionOutputExpr = (Slot) unionOutputExpr.child(0);
-                }
-            }
-            boolean found = false;
-            Slot matchedJoinSlot = null;
-            for (Slot joinOutput : newJoin.getOutput()) {
-                Slot slot = joinOutput;
-                if (context.origChild0ToNewUnionOutputMap.get(slot) != null) {
-                    slot = context.origChild0ToNewUnionOutputMap.get(slot);
-                }
-                if (slot.equals(unionOutputExpr) || slot.getExprId() == unionOutputExpr.getExprId()) {
-                    matchedJoinSlot = joinOutput;
-                    found = true;
-                    break;
+            for (int i = 0; i < plan1.children().size(); i++) {
+                if (!isLogicalEqual(plan1.child(i), plan2.child(i))) {
+                    return false;
                 }
             }
-            if (found) {
-                ExprId exprId = origUnionSlots.get(i).getExprId();
-                Alias aliasExpr = new Alias(exprId, matchedJoinSlot, matchedJoinSlot.toSql());
-                newProjectOutputs.add(aliasExpr);
+            if (isNotSupported(plan1) || isNotSupported(plan2)) {
+                return false;
             }
+            return comparePlan(plan1, plan2);
         }
-        return newProjectOutputs;
-    }
-
-    private LogicalJoin makeNewJoin(LogicalUnion newUnionNode,
-            LogicalCatalogRelation pullUpTable, PullUpContext context) {
-        List<Expression> newHashJoinConjuncts = new ArrayList<>();
-        Slot unionSideExpr = newUnionNode.getOutput().get(context.replacedColumnIndex);
 
-        Slot pullUpSidePkSlot = context.pullUpTableToPkSlotMap.get(pullUpTable);
-        if (pullUpSidePkSlot == null) {
-            return null;
+        boolean isNotSupported(Plan plan) {
+            return !(plan instanceof LogicalFilter)
+                    && !(plan instanceof LogicalCatalogRelation)
+                    && !(plan instanceof LogicalProject);
         }
-        EqualTo pullUpJoinCondition = new EqualTo(unionSideExpr, pullUpSidePkSlot);
-        newHashJoinConjuncts.add(pullUpJoinCondition);
-
-        // new a join with the newUnion and the pulled up table
-        return new LogicalJoin<>(
-                JoinType.INNER_JOIN,
-                newHashJoinConjuncts,
-                ExpressionUtils.EMPTY_CONDITION,
-                new DistributeHint(DistributeType.NONE),
-                Optional.empty(),
-                newUnionNode,
-                pullUpTable, null);
-    }
-
-    private LogicalUnion makeNewUnionNode(LogicalUnion origUnion,
-            List<LogicalCatalogRelation> pullUpTableList, PullUpContext context) {
-        List<Plan> newUnionChildren = new ArrayList<>();
-        for (int i = 0; i < origUnion.children().size(); i++) {
-            Plan unionChild = origUnion.child(i);
-            context.setPullUpTable(pullUpTableList.get(i));
-            context.setReplacedColumn(context.replaceColumns.get(i));
-            Plan newChild = doPullUpJoinFromUnionAll(unionChild, context);
-            newUnionChildren.add(newChild);
-        }
-
-        // wrap the replaced column with a shared alias which is exposed to outside
-        List<Plan> formalizedNewUnionChildren = doWrapReplaceColumnForUnionChildren(newUnionChildren, context);
-        List<List<SlotReference>> childrenOutputs = formalizedNewUnionChildren.stream()
-                .map(j -> j.getOutput().stream()
-                        .map(SlotReference.class::cast)
-                        .collect(ImmutableList.toImmutableList()))
-                .collect(ImmutableList.toImmutableList());
-
-        LogicalUnion newUnionNode = new LogicalUnion(Qualifier.ALL, formalizedNewUnionChildren);
-        newUnionNode = (LogicalUnion) newUnionNode.withChildrenAndTheirOutputs(
-                formalizedNewUnionChildren, childrenOutputs);
-        List<NamedExpression> newOutputs = newUnionNode.buildNewOutputs();
-        newUnionNode = newUnionNode.withNewOutputs(newOutputs);
-
-        // set up origin child 0 output to new union output mapping
-        List<SlotReference> origChild0Output = childrenOutputs.get(0);
-        for (int i = 0; i < origChild0Output.size(); i++) {
-            SlotReference slot = origChild0Output.get(i);
-            NamedExpression newExpr = newOutputs.get(i);
-            context.origChild0ToNewUnionOutputMap.put(newExpr, slot);
-        }
-
-        return newUnionNode;
-    }
-
-    private static class PullUpRewriter extends DefaultPlanRewriter<PullUpContext> implements CustomRewriter {
-        public static final PullUpRewriter INSTANCE = new PullUpRewriter();
 
-        @Override
-        public Plan rewriteRoot(Plan plan, JobContext context) {
-            return null;
-        }
-
-        public Plan rewrite(Plan plan, PullUpContext context) {
-            return plan.accept(this, context);
-        }
-
-        @Override
-        public Plan visitLogicalAggregate(LogicalAggregate<? extends Plan> agg, PullUpContext context) {
-            Plan input = agg.child().accept(this, context);
-
-            LogicalCatalogRelation pullTable = context.pullUpTable;
-            SlotReference replaceColumn = context.replaceColumn;
-
-            // eliminate group by keys
-            List<Expression> groupByExprList = new ArrayList<>();
-            for (Expression expr : agg.getGroupByExpressions()) {
-                // expr has been checked before
-                if (!pullTable.getOutputExprIds().contains(((NamedExpression) expr).getExprId())) {
-                    groupByExprList.add(expr);
+        boolean comparePlan(Plan plan1, Plan plan2) {
+            boolean isEqual = true;
+            if (plan1 instanceof LogicalCatalogRelation && plan2 instanceof LogicalCatalogRelation) {
+                isEqual = new TableIdentifier(((LogicalCatalogRelation) plan1).getTable())
+                        .equals(new TableIdentifier(((LogicalCatalogRelation) plan2).getTable()));
+            } else if (plan1 instanceof LogicalProject && plan2 instanceof LogicalProject) {
+                if (plan1.getOutput().size() != plan2.getOutput().size()) {
+                    isEqual = false;
                 }
-            }
-            // add replaced group by key
-            groupByExprList.add(replaceColumn);
-
-            // eliminate outputs keys
-            List<NamedExpression> outputExprList = new ArrayList<>();
-            for (NamedExpression expr : agg.getOutputExpressions()) {
-                if (!pullTable.getOutputExprIds().contains(expr.getExprId())) {
-                    outputExprList.add(expr);
+                for (int i = 0; isEqual && i < plan2.getOutput().size(); i++) {
+                    NamedExpression expr = ((LogicalProject<?>) plan1).getProjects().get(i);
+                    NamedExpression replacedExpr = (NamedExpression)
+                            expr.rewriteUp(e -> plan1ToPlan2.getOrDefault(e, e));
+                    if (!replacedExpr.equals(((LogicalProject<?>) plan2).getProjects().get(i))) {
+                        isEqual = false;
+                    }
                 }
-            }
-            // add replaced group by key
-            outputExprList.add(replaceColumn);
 
-            return new LogicalAggregate<>(groupByExprList, outputExprList, input);
-        }
-
-        public Plan visitLogicalJoin(LogicalJoin<? extends Plan, ? extends Plan> join, PullUpContext context) {
-            Plan leftChild = join.child(0).accept(this, context);
-            Plan rightChild = join.child(1).accept(this, context);
-            LogicalCatalogRelation pullUpTable = context.pullUpTable;
-
-            // no filter on pull up table, which has been checked before
-            if (leftChild instanceof LogicalCatalogRelation
-                    && leftChild.equals(pullUpTable)) {
-                context.setNeedAddReplaceColumn(true);
-                return rightChild;
-            } else if (rightChild instanceof LogicalCatalogRelation
-                    && rightChild.equals(pullUpTable)) {
-                context.setNeedAddReplaceColumn(true);
-                return leftChild;
-            } else if (leftChild instanceof LogicalProject
-                    && leftChild.child(0) instanceof LogicalCatalogRelation
-                    && leftChild.child(0).equals(pullUpTable)) {
-                context.setNeedAddReplaceColumn(true);
-                return rightChild;
-            } else if (rightChild instanceof LogicalProject
-                    && rightChild.child(0) instanceof LogicalCatalogRelation
-                    && rightChild.child(0).equals(pullUpTable)) {
-                context.setNeedAddReplaceColumn(true);
-                return leftChild;
+            } else if (plan1 instanceof LogicalFilter && plan2 instanceof LogicalFilter) {
+                Set<Expression> replacedConjuncts = new HashSet<>();
+                for (Expression expr : ((LogicalFilter<?>) plan1).getConjuncts()) {
+                    replacedConjuncts.add(expr.rewriteUp(e -> plan1ToPlan2.getOrDefault(e, e)));
+                }
+                isEqual = replacedConjuncts.equals(((LogicalFilter<?>) plan2).getConjuncts());
             } else {
-                return new LogicalJoin(JoinType.INNER_JOIN,
-                        join.getHashJoinConjuncts(),
-                        join.getOtherJoinConjuncts(),
-                        new DistributeHint(DistributeType.NONE),
-                        Optional.empty(),
-                        leftChild, rightChild, null);
+                isEqual = false;
             }
-        }
-
-        @Override
-        public Plan visitLogicalProject(LogicalProject<? extends Plan> project, PullUpContext context) {
-            Plan input = project.child().accept(this, context);
-            List<NamedExpression> outputs = input.getOutput().stream()
-                    .map(e -> (NamedExpression) e).collect(Collectors.toList());
-            for (NamedExpression expr : project.getProjects()) {
-                // handle alias
-                if (expr instanceof Alias && expr.child(0) instanceof Literal) {
-                    outputs.add(expr);
-                }
+            if (!isEqual) {
+                return false;
             }
-            return new LogicalProject<>(outputs, input);
-        }
-
-        @Override
-        public Plan visitLogicalFilter(LogicalFilter<? extends Plan> filter, PullUpContext context) {
-            Plan input = filter.child().accept(this, context);
-            return new LogicalFilter<>(filter.getConjuncts(), input);
+            for (int i = 0; i < plan1.getOutput().size(); i++) {
+                plan1ToPlan2.put(plan1.getOutput().get(i), plan2.getOutput().get(i));
+            }
+            return true;
         }
     }
 }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionTest.java
new file mode 100644
index 00000000000..3c533216b1a
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PullUpJoinFromUnionTest.java
@@ -0,0 +1,171 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.rules.rewrite;
+
+import org.apache.doris.nereids.util.MemoPatternMatchSupported;
+import org.apache.doris.nereids.util.PlanChecker;
+import org.apache.doris.utframe.TestWithFeService;
+
+import org.junit.jupiter.api.Test;
+
+class PullUpJoinFromUnionTest extends TestWithFeService implements MemoPatternMatchSupported {
+    @Override
+    protected void runBeforeAll() throws Exception {
+        createDatabase("test");
+        connectContext.setDatabase("default_cluster:test");
+        createTables(
+                "CREATE TABLE IF NOT EXISTS t1 (\n"
+                        + "    id int not null,\n"
+                        + "    name char\n"
+                        + ")\n"
+                        + "DUPLICATE KEY(id)\n"
+                        + "DISTRIBUTED BY HASH(id) BUCKETS 10\n"
+                        + "PROPERTIES (\"replication_num\" = \"1\")\n",
+                "CREATE TABLE IF NOT EXISTS t2 (\n"
+                        + "    id int not null,\n"
+                        + "    name char\n"
+                        + ")\n"
+                        + "DUPLICATE KEY(id)\n"
+                        + "DISTRIBUTED BY HASH(id) BUCKETS 10\n"
+                        + "PROPERTIES (\"replication_num\" = \"1\")\n",
+                "CREATE TABLE IF NOT EXISTS t3 (\n"
+                        + "    id int,\n"
+                        + "    name char\n"
+                        + ")\n"
+                        + "DUPLICATE KEY(id)\n"
+                        + "DISTRIBUTED BY HASH(id) BUCKETS 10\n"
+                        + "PROPERTIES (\"replication_num\" = \"1\")\n"
+        );
+        connectContext.getSessionVariable().setDisableNereidsRules("PRUNE_EMPTY_PARTITION");
+    }
+
+    @Test
+    void testSimple() {
+        String sql = "select * from t1 join t2 on t1.id = t2.id "
+                + "union all "
+                + "select * from t1 join t3 on t1.id = t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+
+    @Test
+    void testProject() {
+        String sql = "select t2.id from t1 join t2 on t1.id = t2.id "
+                + "union all "
+                + "select t3.id from t1 join t3 on t1.id = t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+
+        sql = "select t2.id, t1.name from t1 join t2 on t1.id = t2.id "
+                + "union all "
+                + "select t3.id, t1.name from t1 join t3 on t1.id = t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+
+    @Test
+    void testConstant() {
+        String sql = "select t2.id, t1.name, 1 as id1 from t1 join t2 on t1.id = t2.id "
+                + "union all "
+                + "select t3.id, t1.name, 2 as id2 from t1 join t3 on t1.id = t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+
+    @Test
+    void testComplexProject() {
+        String sql = "select t2.id + 1, t1.name + 1, 1 as id1 from t1 join t2 on t1.id = t2.id "
+                + "union all "
+                + "select t3.id + 1, t1.name + 1, 2 as id2 from t1 join t3 on t1.id = t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalUnion(), any()));
+    }
+
+    @Test
+    void testMissJoinSlot() {
+        String sql = "select t1.name + 1, 1 as id1 from t1 join t2 on t1.id = t2.id "
+                + "union all "
+                + "select t1.name + 1, 2 as id2 from t1 join t3 on t1.id = t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalUnion(), any()));
+    }
+
+    @Test
+    void testFilter() {
+        String sql = "select * from t1 join t2 on t1.id = t2.id where t1.name = '' "
+                + "union all "
+                + "select * from t1 join t3 on t1.id = t3.id where t1.name = '' ;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+
+        sql = "select t2.id from t1 join t2 on t1.id = t2.id where t1.name = '' "
+                + "union all "
+                + "select t3.id from t1 join t3 on t1.id = t3.id where t1.name = '' ;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+
+    @Test
+    void testMultipleJoinConditions() {
+        String sql = "select * from t1 join t2 on t1.id = t2.id and t1.name = t2.name "
+                + "union all "
+                + "select * from t1 join t3 on t1.id = t3.id and t1.name = t3.name;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+
+    @Test
+    void testNonEqualityJoinConditions() {
+        String sql = "select * from t1 join t2 on t1.id < t2.id "
+                + "union all "
+                + "select * from t1 join t3 on t1.id < t3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .nonMatch(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+
+    @Test
+    void testSubqueries() {
+        String sql = "select * from t1 join (select * from t2 where t2.id > 10) s2 on t1.id = s2.id "
+                + "union all "
+                + "select * from t1 join (select * from t3 where t3.id > 10) s3 on t1.id = s3.id;";
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matches(logicalJoin(logicalProject(logicalUnion()), any()));
+    }
+}
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query11.out b/regression-test/data/nereids_hint_tpcds_p0/shape/query11.out
index 16316c630a5..d8cf8455c33 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query11.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query14.out b/regression-test/data/nereids_hint_tpcds_p0/shape/query14.out
index 61fba77c876..0d4af14e34d 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query14.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,16 +87,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[ss_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[ss_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF12 i_item_sk->[ss_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF11 ss_item_sk->[ss_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF12
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -120,16 +110,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[cs_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[cs_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF15 i_item_sk->[cs_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF14 ss_item_sk->[cs_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF17
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF15
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -143,16 +133,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF20 i_item_sk->[ss_item_sk,ws_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF19 ss_item_sk->[ws_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF18 i_item_sk->[ss_item_sk,ws_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF17 ss_item_sk->[ws_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF20
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF18
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query4.out b/regression-test/data/nereids_hint_tpcds_p0/shape/query4.out
index 57c89d80df9..ee0be517b75 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query4.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query71.out b/regression-test/data/nereids_hint_tpcds_p0/shape/query71.out
index 0df4b3fff81..fc0e6dc12ce 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query71.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query71.out
@@ -9,34 +9,25 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
+--------------------------------PhysicalOlapScan[date_dim]
 ------------------------PhysicalProject
 --------------------------filter((item.i_manager_id = 1))
 ----------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query74.out b/regression-test/data/nereids_hint_tpcds_p0/shape/query74.out
index 8b171914ebd..30e95b3fd06 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query74.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query76.out b/regression-test/data/nereids_hint_tpcds_p0/shape/query76.out
index b612ba67e96..473b9fded85 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query76.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query76.out
@@ -7,40 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[ss_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ss_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalProject
-------------------hashJoin[INNER_JOIN shuffle] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[ws_sold_date_sk]
---------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ------------------------PhysicalProject
---------------------------PhysicalOlapScan[item] apply RFs: RF2
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ss_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ------------------------PhysicalProject
---------------------------filter(ws_promo_sk IS NULL)
-----------------------------PhysicalOlapScan[web_sales] apply RFs: RF3
---------------------PhysicalProject
-----------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_promo_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales] apply RFs: RF3
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[cs_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(cs_bill_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF2 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
---------------------------PhysicalProject
-----------------------------filter(cs_bill_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF4 RF5
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/nereids_rules_p0/pull_up_join_from_union/pull_up_join_from_union.out b/regression-test/data/nereids_rules_p0/pull_up_join_from_union/pull_up_join_from_union.out
new file mode 100644
index 00000000000..10820e9ee48
--- /dev/null
+++ b/regression-test/data/nereids_rules_p0/pull_up_join_from_union/pull_up_join_from_union.out
@@ -0,0 +1,306 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !basic_join_union --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+----PhysicalOlapScan[table_a]
+
+-- !three_way_union --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+------PhysicalOlapScan[table_d]
+----PhysicalOlapScan[table_a]
+
+-- !union_with_projections --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+----PhysicalOlapScan[table_a]
+
+-- !union_with_constants --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+----PhysicalOlapScan[table_a]
+
+-- !union_with_loss_slots --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+----PhysicalOlapScan[table_a]
+
+-- !different_join_conditions --
+PhysicalResultSink
+--PhysicalUnion
+----hashJoin[INNER_JOIN] hashCondition=((a.id = b.id)) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_b]
+----hashJoin[INNER_JOIN] hashCondition=((a.name = c.name)) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_c]
+
+-- !multi_column_join --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id) and (name = name)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+----PhysicalOlapScan[table_a]
+
+-- !left_joins --
+PhysicalResultSink
+--PhysicalUnion
+----hashJoin[LEFT_OUTER_JOIN] hashCondition=((a.id = b.id)) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_b]
+----hashJoin[LEFT_OUTER_JOIN] hashCondition=((a.id = c.id)) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_c]
+
+-- !subquery_join --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------hashAgg[LOCAL]
+--------PhysicalOlapScan[table_b]
+------hashAgg[LOCAL]
+--------PhysicalOlapScan[table_c]
+----PhysicalOlapScan[table_a]
+
+-- !complex_join_condition1 --
+PhysicalResultSink
+--PhysicalUnion
+----hashJoin[INNER_JOIN] hashCondition=((expr_cast(id as BIGINT) = expr_(cast(id as BIGINT) - 1))) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_b]
+----hashJoin[INNER_JOIN] hashCondition=((expr_cast(id as BIGINT) = expr_(cast(id as BIGINT) - 1))) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_c]
+
+-- !complex_join_condition2 --
+PhysicalResultSink
+--PhysicalUnion
+----hashJoin[INNER_JOIN] hashCondition=((expr_cast(id as BIGINT) = expr_(cast(id as BIGINT) - 1))) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_b]
+----hashJoin[INNER_JOIN] hashCondition=((expr_cast(id as DOUBLE) = expr_(cast(id as DOUBLE) - 1.0))) otherCondition=()
+------PhysicalOlapScan[table_a]
+------PhysicalOlapScan[table_c]
+
+-- !union_filter1 --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------filter((b.id = 1))
+--------PhysicalOlapScan[table_b]
+------filter((c.id = 1))
+--------PhysicalOlapScan[table_c]
+----filter((a.id = 1))
+------PhysicalOlapScan[table_a]
+
+-- !union_filter2 --
+PhysicalResultSink
+--hashJoin[INNER_JOIN] hashCondition=((id = id)) otherCondition=()
+----PhysicalUnion
+------PhysicalOlapScan[table_b]
+------PhysicalOlapScan[table_c]
+----filter((cast(value as DOUBLE) = 1.0))
+------PhysicalOlapScan[table_a]
+
+-- !basic_join_union_res --
+1	Alice	Value_B1
+1	Alice	Value_C1
+2	Bob	Value_B2
+3	Charlie	Value_C3
+
+-- !three_way_union_res --
+1	Alice	Value_B1
+1	Alice	Value_C1
+1	Alice	Value_D1
+2	Bob	Value_B2
+2	Bob	Value_D2
+3	Charlie	Value_C3
+3	Charlie	Value_D3
+
+-- !union_with_projections_res --
+1	Alice	VALUE_B1
+1	Alice	value_c1
+2	Bob	VALUE_B2
+3	Charlie	value_c3
+
+-- !union_with_constants_res --
+1	Alice	Value_B1	B
+1	Alice	Value_C1	C
+2	Bob	Value_B2	B
+3	Charlie	Value_C3	C
+
+-- !union_with_loss_slots_res --
+1
+1
+2
+3
+
+-- !different_join_conditions_res --
+1	Alice	Value_B1
+1	Alice	Value_C1
+2	Bob	Value_B2
+3	Charlie	Value_C3
+
+-- !multi_column_join_res --
+1	Alice	Value_B1
+1	Alice	Value_C1
+2	Bob	Value_B2
+3	Charlie	Value_C3
+
+-- !left_joins_res --
+1	Alice	Value_B1
+1	Alice	Value_C1
+2	Bob	\N
+2	Bob	Value_B2
+3	Charlie	\N
+3	Charlie	Value_C3
+5	Eva	\N
+5	Eva	\N
+
+-- !subquery_join_res --
+1	Alice	Value_B1
+1	Alice	Value_C1
+2	Bob	Value_B2
+3	Charlie	Value_C3
+
+-- !complex_join_condition1_res --
+1	Alice	Value_B2
+2	Bob	Value_C3
+3	Charlie	Value_B4
+3	Charlie	Value_C4
+5	Eva	Value_B6
+
+-- !complex_join_condition2_res --
+1	Alice	Value_B2
+2	Bob	Value_C3
+3	Charlie	Value_B4
+3	Charlie	Value_C4
+5	Eva	Value_B6
+
+-- !union_filter1_res --
+1	Alice	Value_B1	B
+1	Alice	Value_C1	C
+
+-- !union_filter2_res --
+
+-- !expr --
+1	4
+34	25
+34	35
+34	35
+34	35
+79	25
+101	5
+
+-- !const --
+1	2
+34	2
+34	3
+34	3
+34	3
+79	2
+101	2
+
+-- !multi_condition --
+\N	2
+\N	2
+\N	2
+1	2
+2	3
+11	2
+
+-- !multi_condition2 --
+1	2
+2	3
+11	2
+
+-- !multi_differenct_count_condition --
+
+-- !no_common_side_project --
+1	4
+34	25
+34	35
+34	35
+34	35
+79	25
+101	5
+
+-- !common_slot_differnt --
+34	5
+34	25
+34	101
+
+-- !other_expr_differnt --
+1	4
+34	25
+34	103
+34	123
+34	199
+79	25
+101	5
+
+-- !2_same_tables --
+0	0
+0	1
+33	1
+33	33
+78	1
+78	78
+100	1
+100	100
+
+-- !simple_column --
+0	0
+0	0
+33	33
+33	33
+78	78
+78	78
+100	100
+100	100
+
+-- !func_column --
+1	2
+34	2
+34	3
+34	3
+34	3
+79	2
+101	2
+
+-- !other_join_slot_differnt --
+34
+34
+34
+
+-- !join_common_slot_has_expr --
+
+-- !can_not_transform --
+0	2
+2	0
+3	100
+23	33
+23	78
+33	23
+78	23
+100	3
+
+-- !other_side_condition_slot_has_expr_do_transform --
+13
+
diff --git a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query11.out b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query11.out
index 5593df91949..35504b7f44d 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query11.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query14.out b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query14.out
index 813924b9b99..61f29b11211 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query14.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,16 +87,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[ss_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[ss_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF12 i_item_sk->[ss_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF11 ss_item_sk->[ss_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF12
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -120,16 +110,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[cs_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[cs_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF15 i_item_sk->[cs_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF14 ss_item_sk->[cs_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF17
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF15
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -143,16 +133,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF20 i_item_sk->[ss_item_sk,ws_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF19 ss_item_sk->[ws_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF18 i_item_sk->[ss_item_sk,ws_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF17 ss_item_sk->[ws_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF20
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF18
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query4.out b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query4.out
index d99f0294700..709da33d851 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query4.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query71.out b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query71.out
index 068d0b83b15..0d26e1f81cc 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query71.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query71.out
@@ -9,37 +9,28 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((item.i_manager_id = 1))
+--------------------------------PhysicalOlapScan[item]
 ------------------------PhysicalProject
---------------------------filter((item.i_manager_id = 1))
-----------------------------PhysicalOlapScan[item]
+--------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
+----------------------------PhysicalOlapScan[date_dim]
 --------------------PhysicalProject
 ----------------------filter(t_meal_time IN ('breakfast', 'dinner'))
 ------------------------PhysicalOlapScan[time_dim]
diff --git a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query74.out b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query74.out
index 8b171914ebd..30e95b3fd06 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query74.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query76.out b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query76.out
index b612ba67e96..473b9fded85 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query76.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query76.out
@@ -7,40 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[ss_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ss_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalProject
-------------------hashJoin[INNER_JOIN shuffle] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[ws_sold_date_sk]
---------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ------------------------PhysicalProject
---------------------------PhysicalOlapScan[item] apply RFs: RF2
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ss_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ------------------------PhysicalProject
---------------------------filter(ws_promo_sk IS NULL)
-----------------------------PhysicalOlapScan[web_sales] apply RFs: RF3
---------------------PhysicalProject
-----------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_promo_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales] apply RFs: RF3
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[cs_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(cs_bill_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF2 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
---------------------------PhysicalProject
-----------------------------filter(cs_bill_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF4 RF5
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query11.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query11.out
index a30f38dbe4c..8cab83d94f6 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query11.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query14.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query14.out
index d08a6aedb09..d817c6f0053 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query14.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,12 +87,12 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF14 d_date_sk->[ss_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
 --------------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12
 ----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
@@ -120,12 +110,12 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF17 d_date_sk->[cs_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
 --------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF17
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15
 ----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
@@ -143,12 +133,12 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF20 d_date_sk->[ws_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
 --------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF20
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18
 ----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query4.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query4.out
index 19e9098ee45..a083e5a72ef 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query4.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query71.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query71.out
index 4af8cfcf0e3..7ae1c5b71dd 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query71.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query71.out
@@ -9,34 +9,25 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+--------------------------------PhysicalOlapScan[date_dim]
 ------------------------PhysicalProject
 --------------------------filter((item.i_manager_id = 1))
 ----------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query74.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query74.out
index d8a82ca998a..6915274e1a1 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query74.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query76.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query76.out
index 1bbcdaee749..2f21640b079 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query76.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query11.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query11.out
index eaf1cde7b0a..e963fc6a8ca 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query11.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query14.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query14.out
index 04bf133065b..e73d45b0732 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query14.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,13 +87,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF14 d_date_sk->[ss_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF13 i_item_sk->[ss_item_sk,ss_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF12 ss_item_sk->[ss_item_sk]
+------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF11 i_item_sk->[ss_item_sk,ss_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF10 ss_item_sk->[ss_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF13
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF11
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
@@ -120,13 +110,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF17 d_date_sk->[cs_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF16 i_item_sk->[cs_item_sk,ss_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF15 ss_item_sk->[cs_item_sk]
+------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[cs_item_sk,ss_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[cs_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF16
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
@@ -143,13 +133,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF20 d_date_sk->[ws_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF19 i_item_sk->[ss_item_sk,ws_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF18 ss_item_sk->[ws_item_sk]
+------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[ss_item_sk,ws_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[ws_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF19
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF17
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query4.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query4.out
index 546119842b5..9a590246f64 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query4.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query71.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query71.out
index 4af8cfcf0e3..7ae1c5b71dd 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query71.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query71.out
@@ -9,34 +9,25 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+--------------------------------PhysicalOlapScan[date_dim]
 ------------------------PhysicalProject
 --------------------------filter((item.i_manager_id = 1))
 ----------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query74.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query74.out
index 64a56e4e850..c32a9187e34 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query74.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query76.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query76.out
index 768d8a9e8dc..8f739a1d12b 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query76.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[ss_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[ws_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales] apply RFs: RF1 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[cs_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF2 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[ws_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[ws_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales] apply RFs: RF2 RF3
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF4 RF5
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query11.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query11.out
index b699aa67e93..e7ae73f8e00 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query11.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query14.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query14.out
index 9d7cfc860ad..48ac240d961 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query14.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -100,9 +90,9 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
 ----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
@@ -123,9 +113,9 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
 ----------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
@@ -146,9 +136,9 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
 ----------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query4.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query4.out
index 43138dc7c62..980ceef87ce 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query4.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query71.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query71.out
index b78dcd1d31e..3010f0b574e 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query71.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query71.out
@@ -9,37 +9,28 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((item.i_manager_id = 1))
+--------------------------------PhysicalOlapScan[item]
 ------------------------PhysicalProject
---------------------------filter((item.i_manager_id = 1))
-----------------------------PhysicalOlapScan[item]
+--------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+----------------------------PhysicalOlapScan[date_dim]
 --------------------PhysicalProject
 ----------------------filter(t_meal_time IN ('breakfast', 'dinner'))
 ------------------------PhysicalOlapScan[time_dim]
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query74.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query74.out
index f300a896a4d..c3687dadd21 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query74.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query76.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query76.out
index 0e72c30a539..668c3625c56 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query76.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ss_sold_date_sk->[d_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 ss_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF1
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF0
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalOlapScan[date_dim] apply RFs: RF3
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ws_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF3
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF2
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 cs_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF5
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 cs_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF4
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF0
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 cs_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF2
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales]
 
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query11.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query11.out
index bcfe7ba3d74..8abb7de87e9 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query11.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query14.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query14.out
index 8a1467be7a4..5aad6142d95 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query14.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,16 +87,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[ss_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[ss_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF12 i_item_sk->[ss_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF11 ss_item_sk->[ss_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF12
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -120,16 +110,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[cs_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[cs_item_sk]
+--------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF15 i_item_sk->[cs_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF14 ss_item_sk->[cs_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF17
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF15
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -143,16 +133,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF20 i_item_sk->[ss_item_sk,ws_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF19 ss_item_sk->[ws_item_sk]
+--------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF18 i_item_sk->[ss_item_sk,ws_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF17 ss_item_sk->[ws_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF20
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF18
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query4.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query4.out
index d99f0294700..709da33d851 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query4.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query71.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query71.out
index b78dcd1d31e..3010f0b574e 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query71.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query71.out
@@ -9,37 +9,28 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((item.i_manager_id = 1))
+--------------------------------PhysicalOlapScan[item]
 ------------------------PhysicalProject
---------------------------filter((item.i_manager_id = 1))
-----------------------------PhysicalOlapScan[item]
+--------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+----------------------------PhysicalOlapScan[date_dim]
 --------------------PhysicalProject
 ----------------------filter(t_meal_time IN ('breakfast', 'dinner'))
 ------------------------PhysicalOlapScan[time_dim]
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query74.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query74.out
index 0f159a647c0..421b74396da 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query74.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query76.out b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query76.out
index 0e72c30a539..668c3625c56 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query76.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ss_sold_date_sk->[d_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 ss_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF1
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF0
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalOlapScan[date_dim] apply RFs: RF3
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ws_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF3
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF2
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 cs_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF5
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 cs_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF4
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF0
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 cs_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF2
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales]
 
diff --git a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query14.out b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query14.out
index 299549d2b2c..9d5c47615cb 100644
--- a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query14.out
+++ b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,13 +87,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF14 d_date_sk->[ss_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF13 i_item_sk->[ss_item_sk,ss_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF12 ss_item_sk->[ss_item_sk]
+------------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF11 i_item_sk->[ss_item_sk,ss_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF10 ss_item_sk->[ss_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF13
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF11
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
@@ -120,13 +110,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF17 d_date_sk->[cs_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF16 i_item_sk->[cs_item_sk,ss_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF15 ss_item_sk->[cs_item_sk]
+------------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[cs_item_sk,ss_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[cs_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF16
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
@@ -143,13 +133,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF20 d_date_sk->[ws_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF19 i_item_sk->[ss_item_sk,ws_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF18 ss_item_sk->[ws_item_sk]
+------------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[ss_item_sk,ws_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN shuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[ws_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF19
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF17
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
diff --git a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query71.out b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query71.out
index b2717237b73..b76b7d6566e 100644
--- a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query71.out
+++ b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query71.out
@@ -9,34 +9,25 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2000))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2000))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2000))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2000))
+--------------------------------PhysicalOlapScan[date_dim]
 ------------------------PhysicalProject
 --------------------------filter((item.i_manager_id = 1))
 ----------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query76.out b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query76.out
index d929aca4ca8..47d1baebaf8 100644
--- a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query76.out
+++ b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[ss_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ss_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ss_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[ws_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ws_ship_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales] apply RFs: RF1 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[cs_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(cs_ship_mode_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF2 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[ws_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[ws_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ws_ship_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales] apply RFs: RF2 RF3
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
---------------------------PhysicalProject
-----------------------------filter(cs_ship_mode_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF4 RF5
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query11.out b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query11.out
index a30f38dbe4c..8cab83d94f6 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query11.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query14.out b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query14.out
index 1c17f5a78a9..10192bf86cb 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query14.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,12 +87,12 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF14 d_date_sk->[ss_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
 --------------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12
 ----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
@@ -120,13 +110,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF17 d_date_sk->[cs_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=()
 --------------------------------------------PhysicalProject
 ----------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF17
+--------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15
 ------------------------------------------------PhysicalProject
 --------------------------------------------------PhysicalOlapScan[item]
 --------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
@@ -144,13 +134,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF20 d_date_sk->[ws_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=()
 --------------------------------------------PhysicalProject
 ----------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF20
+--------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18
 ------------------------------------------------PhysicalProject
 --------------------------------------------------PhysicalOlapScan[item]
 --------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query4.out b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query4.out
index 19e9098ee45..a083e5a72ef 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query4.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query71.out b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query71.out
index 4af8cfcf0e3..7ae1c5b71dd 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query71.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query71.out
@@ -9,34 +9,25 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+--------------------------------PhysicalOlapScan[date_dim]
 ------------------------PhysicalProject
 --------------------------filter((item.i_manager_id = 1))
 ----------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query74.out b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query74.out
index d8a82ca998a..6915274e1a1 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query74.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query76.out b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query76.out
index 1bbcdaee749..2f21640b079 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query76.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=()
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query11.out b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query11.out
index eaf1cde7b0a..e963fc6a8ca 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query11.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query14.out b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query14.out
index e4f277daf67..966f8701126 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query14.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,13 +87,13 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF14 d_date_sk->[ss_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF13 i_item_sk->[ss_item_sk,ss_item_sk]
---------------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF12 ss_item_sk->[ss_item_sk]
+------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF11 i_item_sk->[ss_item_sk,ss_item_sk]
+--------------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF10 ss_item_sk->[ss_item_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
-----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF13
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
+----------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF11
 --------------------------------------------PhysicalProject
 ----------------------------------------------PhysicalOlapScan[item]
 ----------------------------------------PhysicalProject
@@ -120,15 +110,15 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF17 d_date_sk->[cs_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[cs_item_sk,i_item_sk]
+------------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF14 ss_item_sk->[cs_item_sk,i_item_sk]
 --------------------------------------------PhysicalProject
-----------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF15 i_item_sk->[cs_item_sk]
+----------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF13 i_item_sk->[cs_item_sk]
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
+--------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[item] apply RFs: RF16
+--------------------------------------------------PhysicalOlapScan[item] apply RFs: RF14
 --------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 ----------------------------------------PhysicalProject
 ------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
@@ -144,15 +134,15 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF20 d_date_sk->[ws_sold_date_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF19 ss_item_sk->[i_item_sk,ws_item_sk]
+------------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF17 ss_item_sk->[i_item_sk,ws_item_sk]
 --------------------------------------------PhysicalProject
-----------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF18 i_item_sk->[ws_item_sk]
+----------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF16 i_item_sk->[ws_item_sk]
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
+--------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[item] apply RFs: RF19
+--------------------------------------------------PhysicalOlapScan[item] apply RFs: RF17
 --------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 ----------------------------------------PhysicalProject
 ------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query4.out b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query4.out
index 546119842b5..9a590246f64 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query4.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query71.out b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query71.out
index 4af8cfcf0e3..7ae1c5b71dd 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query71.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query71.out
@@ -9,34 +9,25 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+--------------------------------PhysicalOlapScan[date_dim]
 ------------------------PhysicalProject
 --------------------------filter((item.i_manager_id = 1))
 ----------------------------PhysicalOlapScan[item]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query74.out b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query74.out
index 64a56e4e850..c32a9187e34 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query74.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN broadcast] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query76.out b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query76.out
index 768d8a9e8dc..8f739a1d12b 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query76.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[ss_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 i_item_sk->[ws_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales] apply RFs: RF1 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[cs_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF2 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[ws_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[ws_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales] apply RFs: RF2 RF3
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF4 RF5
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query11.out b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query11.out
index b699aa67e93..e7ae73f8e00 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query11.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query14.out b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query14.out
index 361e56fa135..2a29746e37e 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query14.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -100,9 +90,9 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=()
 ----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=()
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
@@ -124,9 +114,9 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=()
 --------------------------------------------PhysicalProject
-----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15
+--------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13
 ------------------------------------------------PhysicalProject
 --------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 ----------------------------------------------------PhysicalOlapScan[date_dim]
@@ -148,9 +138,9 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 ----------------------------------------PhysicalProject
 ------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=()
 --------------------------------------------PhysicalProject
-----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18
+--------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16
 ------------------------------------------------PhysicalProject
 --------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 ----------------------------------------------------PhysicalOlapScan[date_dim]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query4.out b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query4.out
index 43138dc7c62..980ceef87ce 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query4.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query71.out b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query71.out
index b78dcd1d31e..3010f0b574e 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query71.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query71.out
@@ -9,37 +9,28 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((item.i_manager_id = 1))
+--------------------------------PhysicalOlapScan[item]
 ------------------------PhysicalProject
---------------------------filter((item.i_manager_id = 1))
-----------------------------PhysicalOlapScan[item]
+--------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+----------------------------PhysicalOlapScan[date_dim]
 --------------------PhysicalProject
 ----------------------filter(t_meal_time IN ('breakfast', 'dinner'))
 ------------------------PhysicalOlapScan[time_dim]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query74.out b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query74.out
index f300a896a4d..c3687dadd21 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query74.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=()
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=()
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query76.out b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query76.out
index 0e72c30a539..668c3625c56 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query76.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ss_sold_date_sk->[d_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 ss_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF1
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF0
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalOlapScan[date_dim] apply RFs: RF3
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ws_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF3
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF2
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 cs_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF5
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 cs_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF4
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF0
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 cs_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF2
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales]
 
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query11.out b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query11.out
index bcfe7ba3d74..8abb7de87e9 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query11.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query14.out b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query14.out
index d54d10fc560..196a98b5a2f 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query14.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2002) and (date_dim.d_year >= 2000))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,16 +87,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[ss_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[ss_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF12 i_item_sk->[ss_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF11 ss_item_sk->[ss_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF12
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -120,18 +110,18 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF17 ss_item_sk->[cs_item_sk,i_item_sk]
+--------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF15 ss_item_sk->[cs_item_sk,i_item_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF16 i_item_sk->[cs_item_sk]
+------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[cs_item_sk]
 --------------------------------------------PhysicalProject
-----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
+--------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
 ------------------------------------------------PhysicalProject
 --------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 ----------------------------------------------------PhysicalOlapScan[date_dim]
 --------------------------------------------PhysicalProject
-----------------------------------------------PhysicalOlapScan[item] apply RFs: RF17
+----------------------------------------------PhysicalOlapScan[item] apply RFs: RF15
 ----------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 ----------------------------PhysicalProject
 ------------------------------PhysicalAssertNumRows
@@ -144,18 +134,18 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF20 ss_item_sk->[i_item_sk,ws_item_sk]
+--------------------------------------hashJoin[LEFT_SEMI_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF18 ss_item_sk->[i_item_sk,ws_item_sk]
 ----------------------------------------PhysicalProject
-------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF19 i_item_sk->[ws_item_sk]
+------------------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[ws_item_sk]
 --------------------------------------------PhysicalProject
-----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+----------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ------------------------------------------------PhysicalProject
---------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
+--------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
 ------------------------------------------------PhysicalProject
 --------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2002))
 ----------------------------------------------------PhysicalOlapScan[date_dim]
 --------------------------------------------PhysicalProject
-----------------------------------------------PhysicalOlapScan[item] apply RFs: RF20
+----------------------------------------------PhysicalOlapScan[item] apply RFs: RF18
 ----------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 )
 ----------------------------PhysicalProject
 ------------------------------PhysicalAssertNumRows
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query4.out b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query4.out
index d99f0294700..709da33d851 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query4.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query71.out b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query71.out
index b78dcd1d31e..3010f0b574e 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query71.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query71.out
@@ -9,37 +9,28 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((item.i_manager_id = 1))
+--------------------------------PhysicalOlapScan[item]
 ------------------------PhysicalProject
---------------------------filter((item.i_manager_id = 1))
-----------------------------PhysicalOlapScan[item]
+--------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 1998))
+----------------------------PhysicalOlapScan[date_dim]
 --------------------PhysicalProject
 ----------------------filter(t_meal_time IN ('breakfast', 'dinner'))
 ------------------------PhysicalOlapScan[time_dim]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query74.out b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query74.out
index 0f159a647c0..421b74396da 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query74.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query76.out b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query76.out
index 0e72c30a539..668c3625c56 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query76.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ss_sold_date_sk->[d_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 ss_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF1
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF0
---------------------------PhysicalProject
-----------------------------filter(ss_hdemo_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalOlapScan[date_dim] apply RFs: RF3
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 ws_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF3
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF2
---------------------------PhysicalProject
-----------------------------filter(ws_bill_addr_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 cs_sold_date_sk->[d_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim] apply RFs: RF5
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 cs_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF4
---------------------------PhysicalProject
-----------------------------filter(cs_warehouse_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 ss_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF0
+----------------------------PhysicalProject
+------------------------------filter(ss_hdemo_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_bill_addr_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 cs_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF2
+----------------------------PhysicalProject
+------------------------------filter(cs_warehouse_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales]
 
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query11.out b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query11.out
index 5593df91949..35504b7f44d 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query11.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query11.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query14.out b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query14.out
index 813924b9b99..61f29b11211 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query14.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query14.out
@@ -55,31 +55,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------PhysicalDistribute[DistributionSpecGather]
 ----------hashAgg[LOCAL]
 ------------PhysicalProject
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[ss_sold_date_sk]
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF9 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+----------------PhysicalProject
+------------------PhysicalUnion
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
 ------------------------PhysicalOlapScan[store_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF10
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF11 d_date_sk->[ws_sold_date_sk]
+------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF9
+--------------------PhysicalDistribute[DistributionSpecExecutionAny]
 ----------------------PhysicalProject
-------------------------PhysicalOlapScan[web_sales] apply RFs: RF11
-----------------------PhysicalProject
-------------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
---------------------------PhysicalOlapScan[date_dim]
+------------------------PhysicalOlapScan[web_sales] apply RFs: RF9
+----------------PhysicalProject
+------------------filter((date_dim.d_year <= 2001) and (date_dim.d_year >= 1999))
+--------------------PhysicalOlapScan[date_dim]
 ----PhysicalResultSink
 ------PhysicalTopN[MERGE_SORT]
 --------PhysicalDistribute[DistributionSpecGather]
@@ -97,16 +87,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF14 i_item_sk->[ss_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF13 ss_item_sk->[ss_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF12 i_item_sk->[ss_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF11 ss_item_sk->[ss_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF12 d_date_sk->[ss_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF10 d_date_sk->[ss_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF12 RF13 RF14
+------------------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF10 RF11 RF12
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF14
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF12
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -120,16 +110,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF17 i_item_sk->[cs_item_sk,ss_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF16 ss_item_sk->[cs_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF15 i_item_sk->[cs_item_sk,ss_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF14 ss_item_sk->[cs_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF15 d_date_sk->[cs_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF13 d_date_sk->[cs_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF15 RF16 RF17
+------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF13 RF14 RF15
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF17
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF15
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
@@ -143,16 +133,16 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------------------------PhysicalDistribute[DistributionSpecHash]
 ----------------------------------hashAgg[LOCAL]
 ------------------------------------PhysicalProject
---------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF20 i_item_sk->[ss_item_sk,ws_item_sk]
-----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF19 ss_item_sk->[ws_item_sk]
+--------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF18 i_item_sk->[ss_item_sk,ws_item_sk]
+----------------------------------------hashJoin[LEFT_SEMI_JOIN broadcast] hashCondition=((web_sales.ws_item_sk = cross_items.ss_item_sk)) otherCondition=() build RFs:RF17 ss_item_sk->[ws_item_sk]
 ------------------------------------------PhysicalProject
---------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF18 d_date_sk->[ws_sold_date_sk]
+--------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF16 d_date_sk->[ws_sold_date_sk]
 ----------------------------------------------PhysicalProject
-------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF18 RF19 RF20
+------------------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF16 RF17 RF18
 ----------------------------------------------PhysicalProject
 ------------------------------------------------filter((date_dim.d_moy = 11) and (date_dim.d_year = 2001))
 --------------------------------------------------PhysicalOlapScan[date_dim]
-------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF20
+------------------------------------------PhysicalCteConsumer ( cteId=CTEId#0 ) apply RFs: RF18
 ----------------------------------------PhysicalProject
 ------------------------------------------PhysicalOlapScan[item]
 ----------------------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query4.out b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query4.out
index d99f0294700..709da33d851 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query4.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query4.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF3 c_customer_sk->[cs_bill_customer_sk,ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query71.out b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query71.out
index 068d0b83b15..0d26e1f81cc 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query71.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query71.out
@@ -9,37 +9,28 @@ PhysicalResultSink
 ------------PhysicalDistribute[DistributionSpecHash]
 --------------hashAgg[LOCAL]
 ----------------PhysicalProject
-------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF4 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.time_sk = time_dim.t_time_sk)) otherCondition=() build RFs:RF2 t_time_sk->[cs_sold_time_sk,ss_sold_time_sk,ws_sold_time_sk]
 --------------------PhysicalProject
-----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF3 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
-------------------------PhysicalUnion
---------------------------PhysicalDistribute[DistributionSpecHash]
-----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = web_sales.ws_sold_date_sk)) otherCondition=() build RFs:RF0 d_date_sk->[ws_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((tmp.sold_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[cs_item_sk,ss_item_sk,ws_item_sk]
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = catalog_sales.cs_sold_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[cs_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF1 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
---------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalUnion
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[web_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2
+--------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1 RF2
 ----------------------------PhysicalProject
-------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((date_dim.d_date_sk = store_sales.ss_sold_date_sk)) otherCondition=() build RFs:RF2 d_date_sk->[ss_sold_date_sk]
---------------------------------PhysicalProject
-----------------------------------PhysicalOlapScan[store_sales] apply RFs: RF2 RF3 RF4
---------------------------------PhysicalProject
-----------------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
-------------------------------------PhysicalOlapScan[date_dim]
+------------------------------filter((item.i_manager_id = 1))
+--------------------------------PhysicalOlapScan[item]
 ------------------------PhysicalProject
---------------------------filter((item.i_manager_id = 1))
-----------------------------PhysicalOlapScan[item]
+--------------------------filter((date_dim.d_moy = 12) and (date_dim.d_year = 2002))
+----------------------------PhysicalOlapScan[date_dim]
 --------------------PhysicalProject
 ----------------------filter(t_meal_time IN ('breakfast', 'dinner'))
 ------------------------PhysicalOlapScan[time_dim]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query74.out b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query74.out
index 8b171914ebd..30e95b3fd06 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query74.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query74.out
@@ -3,7 +3,7 @@
 PhysicalCteAnchor ( cteId=CTEId#0 )
 --PhysicalCteProducer ( cteId=CTEId#0 )
 ----PhysicalProject
-------hashJoin[INNER_JOIN shuffle] hashCondition=((PULL_UP_UNIFIED_OUTPUT_ALIAS = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
+------hashJoin[INNER_JOIN shuffle] hashCondition=((ss_customer_sk = customer.c_customer_sk)) otherCondition=() build RFs:RF2 c_customer_sk->[ss_customer_sk,ws_bill_customer_sk]
 --------PhysicalProject
 ----------PhysicalUnion
 ------------PhysicalProject
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query76.out b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query76.out
index c81d5d95feb..473b9fded85 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query76.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query76.out
@@ -7,41 +7,34 @@ PhysicalResultSink
 --------hashAgg[GLOBAL]
 ----------PhysicalDistribute[DistributionSpecHash]
 ------------hashAgg[LOCAL]
---------------PhysicalUnion
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[cs_sold_date_sk,ss_sold_date_sk,ws_sold_date_sk]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF1 d_date_sk->[ss_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
---------------------------PhysicalProject
-----------------------------filter(ss_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF1
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((store_sales.ss_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF0 i_item_sk->[ss_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(ss_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[store_sales] apply RFs: RF0 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF1 ws_item_sk->[i_item_sk]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item] apply RFs: RF1
+----------------------------PhysicalProject
+------------------------------filter(ws_promo_sk IS NULL)
+--------------------------------PhysicalOlapScan[web_sales] apply RFs: RF3
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 i_item_sk->[cs_item_sk]
+----------------------------PhysicalProject
+------------------------------filter(cs_bill_customer_sk IS NULL)
+--------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF2 RF3
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[item]
 ------------------PhysicalProject
---------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((web_sales.ws_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF3 d_date_sk->[ws_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((web_sales.ws_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF2 ws_item_sk->[i_item_sk]
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item] apply RFs: RF2
---------------------------PhysicalProject
-----------------------------filter(ws_promo_sk IS NULL)
-------------------------------PhysicalOlapScan[web_sales] apply RFs: RF3
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
-----------------PhysicalDistribute[DistributionSpecExecutionAny]
-------------------PhysicalProject
---------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_sold_date_sk = date_dim.d_date_sk)) otherCondition=() build RFs:RF5 d_date_sk->[cs_sold_date_sk]
-----------------------PhysicalProject
-------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_item_sk = item.i_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
---------------------------PhysicalProject
-----------------------------filter(cs_bill_customer_sk IS NULL)
-------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF4 RF5
---------------------------PhysicalProject
-----------------------------PhysicalOlapScan[item]
-----------------------PhysicalProject
-------------------------PhysicalOlapScan[date_dim]
+--------------------PhysicalOlapScan[date_dim]
 
diff --git a/regression-test/suites/nereids_rules_p0/pull_up_join_from_union/pull_up_join_from_union.groovy b/regression-test/suites/nereids_rules_p0/pull_up_join_from_union/pull_up_join_from_union.groovy
new file mode 100644
index 00000000000..3eee499b2d8
--- /dev/null
+++ b/regression-test/suites/nereids_rules_p0/pull_up_join_from_union/pull_up_join_from_union.groovy
@@ -0,0 +1,429 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("join_pull_up_union") {
+    sql "set runtime_filter_mode=OFF"
+    sql """ SET inline_cte_referenced_threshold=0 """
+    sql "SET ignore_shape_nodes='PhysicalDistribute,PhysicalProject'"
+    sql "SET disable_join_reorder=true"
+
+    sql """
+        -- Create tables
+    DROP TABLE IF EXISTS table_a;
+    CREATE TABLE table_a (
+        id INT,
+        name VARCHAR(50),
+        value VARCHAR(50)
+    )ENGINE = OLAP
+    DISTRIBUTED BY HASH(id) BUCKETS 4
+    PROPERTIES (
+      "replication_allocation" = "tag.location.default: 1"
+    );
+    DROP TABLE IF EXISTS table_b;
+    CREATE TABLE table_b (
+        id INT,
+        name VARCHAR(50),
+        value VARCHAR(50)
+    )ENGINE = OLAP
+    DISTRIBUTED BY HASH(id) BUCKETS 4
+    PROPERTIES (
+      "replication_allocation" = "tag.location.default: 1"
+    );
+    DROP TABLE IF EXISTS table_c;
+    CREATE TABLE table_c (
+        id INT,
+        name VARCHAR(50),
+        value VARCHAR(50),
+        value1 VARCHAR(50),
+        value2 VARCHAR(50)
+    )ENGINE = OLAP
+    DISTRIBUTED BY HASH(id) BUCKETS 4
+    PROPERTIES (
+      "replication_allocation" = "tag.location.default: 1"
+    );
+    DROP TABLE IF EXISTS table_d;
+    CREATE TABLE table_d (
+        id INT,
+        name VARCHAR(50),
+        value VARCHAR(50)
+    )ENGINE = OLAP
+    DISTRIBUTED BY HASH(id) BUCKETS 4
+    PROPERTIES (
+      "replication_allocation" = "tag.location.default: 1"
+    );
+    """
+    sql """INSERT INTO table_a (id, name, value) VALUES
+    (1, 'Alice', 'Value_A1'),
+    (2, 'Bob', 'Value_A2'),
+    (3, 'Charlie', 'Value_A3'),
+    (5, 'Eva', 'Value_A5');"""
+
+    sql """INSERT INTO table_b (id, name, value) VALUES
+    (1, 'Alice', 'Value_B1'),
+    (2, 'Bob', 'Value_B2'),
+    (4, 'Daniel', 'Value_B4'),
+    (6, 'Fiona', 'Value_B6');"""
+
+    sql """INSERT INTO table_c (id, name, value, value1, value2) VALUES
+    (1, 'Alice', 'Value_C1', 'Extra_C1_1', 'Extra_C1_2'),
+    (3, 'Charlie', 'Value_C3', 'Extra_C3_1', 'Extra_C3_2'),
+    (4, 'Daniel', 'Value_C4', 'Extra_C4_1', 'Extra_C4_2'),
+    (7, 'Grace', 'Value_C7', 'Extra_C7_1', 'Extra_C7_2');"""
+
+    sql """INSERT INTO table_d (id, name, value) VALUES
+    (1, 'Alice', 'Value_D1'),
+    (2, 'Bob', 'Value_D2'),
+    (3, 'Charlie', 'Value_D3'),
+    (8, 'Henry', 'Value_D8');"""
+
+
+    // Simple case with two tables joined in a union
+    qt_basic_join_union """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Three-way union with common join
+    qt_three_way_union """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.id = c.id
+    UNION ALL
+    SELECT a.id, a.name, d.value FROM table_a a JOIN table_d d ON a.id = d.id) t
+    """
+
+    // Union with projections above joins
+    qt_union_with_projections """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, UPPER(b.value) AS upper_value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, LOWER(c.value) AS lower_value FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with constant expressions
+    qt_union_with_constants """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with loss slots
+    qt_union_with_loss_slots """
+    explain shape plan
+    SELECT t.id FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with different join conditions
+    qt_different_join_conditions """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.name = c.name) t
+    """
+
+    // Union with multi-column join conditions
+    qt_multi_column_join """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id AND a.name = b.name
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.id = c.id AND a.name = c.name) t
+    """
+
+    // Union with other joins
+    qt_left_joins """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a LEFT JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a LEFT JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with subqueries in join
+    qt_subquery_join """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN (SELECT id, MAX(value) AS value FROM table_b GROUP BY id) b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN (SELECT id, MAX(value) AS value FROM table_c GROUP BY id) c ON a.id = c.id) t
+    """
+
+    // Union with complex expressions in join condition
+    qt_complex_join_condition1 """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON CAST(a.id AS INT) + 1 = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON CAST(a.id AS INT) + 1 = c.id) t
+    """
+
+    // Union with complex expressions in join condition
+    qt_complex_join_condition2 """
+    explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON CAST(a.id AS INT) + 1 = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON CAST(a.id AS DOUBLE) + 1 = c.id) t
+    """
+
+    qt_union_filter1 """
+        explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id where a.id = 1
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id where a.id = 1) t
+    """
+
+    qt_union_filter2 """
+        explain shape plan
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id where a.value = 1
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id where a.value = 1) t
+    """
+
+
+    // Simple case with two tables joined in a union
+    order_qt_basic_join_union_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Three-way union with common join
+    order_qt_three_way_union_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.id = c.id
+    UNION ALL
+    SELECT a.id, a.name, d.value FROM table_a a JOIN table_d d ON a.id = d.id) t
+    """
+
+    // Union with projections above joins
+    order_qt_union_with_projections_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, UPPER(b.value) AS upper_value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, LOWER(c.value) AS lower_value FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with constant expressions
+    order_qt_union_with_constants_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with loss slots
+    order_qt_union_with_loss_slots_res """
+    SELECT t.id FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with different join conditions
+    order_qt_different_join_conditions_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.name = c.name) t
+    """
+
+    // Union with multi-column join conditions
+    order_qt_multi_column_join_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON a.id = b.id AND a.name = b.name
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON a.id = c.id AND a.name = c.name) t
+    """
+
+    // Union with other joins
+    order_qt_left_joins_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a LEFT JOIN table_b b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a LEFT JOIN table_c c ON a.id = c.id) t
+    """
+
+    // Union with subqueries in join
+    order_qt_subquery_join_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN (SELECT id, MAX(value) AS value FROM table_b GROUP BY id) b ON a.id = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN (SELECT id, MAX(value) AS value FROM table_c GROUP BY id) c ON a.id = c.id) t
+    """
+
+    // Union with complex expressions in join condition
+    order_qt_complex_join_condition1_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON CAST(a.id AS INT) + 1 = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON CAST(a.id AS INT) + 1 = c.id) t
+    """
+
+    // Union with complex expressions in join condition
+    order_qt_complex_join_condition2_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value FROM table_a a JOIN table_b b ON CAST(a.id AS INT) + 1 = b.id
+    UNION ALL
+    SELECT a.id, a.name, c.value FROM table_a a JOIN table_c c ON CAST(a.id AS DOUBLE) + 1 = c.id) t
+    """
+
+    order_qt_union_filter1_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id where a.id = 1
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id where a.id = 1) t
+    """
+
+    order_qt_union_filter2_res """
+    SELECT * FROM
+    (SELECT a.id, a.name, b.value, 'B' AS source FROM table_a a JOIN table_b b ON a.id = b.id where a.value = 1
+    UNION ALL
+    SELECT a.id, a.name, c.value, 'C' AS source FROM table_a a JOIN table_c c ON a.id = c.id where a.value = 1) t
+    """
+
+    sql """drop table if exists test_like1"""
+    sql """CREATE TABLE `test_like1` (
+    `a` INT NULL,
+    `b` VARCHAR(10) NULL,
+    `c` INT NULL,
+    `d` INT NULL
+    ) ENGINE=OLAP
+    DUPLICATE KEY(`a`, `b`)
+    DISTRIBUTED BY RANDOM BUCKETS AUTO
+    PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1"
+    );"""
+    sql """drop table if exists test_like2"""
+    sql """CREATE TABLE `test_like2` (
+    `a` INT NULL,
+    `b` VARCHAR(10) NULL,
+    `c` INT NULL,
+    `d` INT NULL
+    ) ENGINE=OLAP
+    DUPLICATE KEY(`a`, `b`)
+    DISTRIBUTED BY RANDOM BUCKETS AUTO
+    PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1"
+    );"""
+    sql """drop table if exists test_like3"""
+    sql """CREATE TABLE `test_like3` (
+    `a` INT NULL,
+    `b` VARCHAR(10) NULL,
+    `c` INT NULL,
+    `d` INT NULL
+    ) ENGINE=OLAP
+    DUPLICATE KEY(`a`, `b`)
+    DISTRIBUTED BY RANDOM BUCKETS AUTO
+    PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1"
+    );"""
+    sql "drop table if exists test_like4"
+    sql """create table test_like4 (a bigint, b varchar(10), c int, d int) ENGINE=OLAP
+    DUPLICATE KEY(`a`, `b`)
+    DISTRIBUTED BY RANDOM BUCKETS AUTO
+    PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1"
+    );"""
+    sql "insert into test_like1 values(100,'d2',3,5),(0,'d2',3,5),(null,null,9,3),(33,'d2',2,5),(null,'d2',3,55),(78,null,9,3),(12,null,9,3);"
+    sql "insert into test_like2 values(10,'d2',2,2),(0,'d2',2,2),(100,'d2',3,null),(null,null,9,3),(78,'d2',23,5),(33,'d2',23,5);"
+    sql "insert into test_like3 values(1,'d2',2,2),(33,'d2',99,5),(33,'d2',23,6),(33,'d2',3,5);"
+    sql "insert into test_like4 values(11,'d2',3,5),(1,'d2',3,5),(79,null,9,3),(33,'d2',2,5),(null,'d2',3,55),(78,null,9,3),(12,null,9,3);"
+
+    qt_expr """select c1,c2 from 
+    (select t2.a+1 c1,t2.c+2 c2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+    select t3.a+1,t1.a+2 from test_like1 t1 join test_like3 t3 on t1.a=t3.a) t order by 1,2"""
+    qt_const """select c1,c2 from
+    (select t2.a+1 c1,2 c2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+    select t3.a+1,3 from test_like1 t1 join test_like3 t3 on t1.a=t3.a) t order by 1,2"""
+
+    qt_multi_condition """select c1,c2 from (
+    select t2.a+1 c1,2 c2 from test_like1 t1 join test_like2 t2 on t1.c=t2.d AND t1.c=t2.d union ALL
+    select t3.a+1,3 from test_like1 t1 join test_like3 t3 on t1.c=t3.d AND t1.c=t3.d) t order by 1,2"""
+
+    qt_multi_condition2 """select c1,c2 from (
+    select t2.a+1 c1 ,2 c2 from test_like1 t1 join test_like2 t2 on t1.c=t2.d AND t1.c=t2.c union ALL
+    select t3.a+1,3 from test_like1 t1 join test_like3 t3 on t1.c=t3.d AND t1.c=t3.c) t order by 1,2"""
+
+    qt_multi_differenct_count_condition """select c1,c2 from (
+    select t2.a+1 c1,2 c2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a AND t1.a=t2.c union ALL
+    select t3.a+1 c3,3 c4 from test_like1 t1 join test_like3 t3 on t1.a=t3.c) t order by 1,2"""
+    qt_no_common_side_project """select c1,c2 from (
+    select t2.a+1 c1,t2.c+2 c2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+    select t3.a+1,t3.a+2 from test_like1 t1 join test_like3 t3 on t1.a=t3.a) t order by 1,2"""
+
+    qt_common_slot_differnt """select c1,c2 from (
+    select t2.a+1 c1,t2.c+2 c2 from test_like1 t1 join test_like2 t2 on t1.a+1=t2.a union ALL
+    select t3.a+1,t3.c+2 from test_like1 t1 join test_like3 t3 on t1.a=t3.a) t order by 1,2"""
+
+    qt_other_expr_differnt """select c1,c2 from (
+    select t2.a+1 c1,t2.c+2 c2 from test_like1 t1 join test_like2 t2 on t1.a=t2.a union ALL
+    select t3.a+1,t3.c+100 from test_like1 t1 join test_like3 t3 on t1.a=t3.a) t order by 1,2"""
+
+    qt_2_same_tables """select c1,c2 from (
+    select t1.a c1,1 c2 from test_like1 t1 inner join test_like2 t2 on t1.a=t2.a
+    union ALL
+    select t1.a,t2.a from test_like1 t1  inner join test_like2 t2 on t1.a=t2.a) t order by 1,2"""
+
+    qt_simple_column """select c1,c2 from (
+    select t1.a c1,t2.a c2 from test_like1 t1 inner join test_like2 t2 on t1.a=t2.a
+    union ALL
+    select t1.a,t2.a from test_like1 t1  inner join test_like2 t2 on t1.a=t2.a) t order by 1,2"""
+
+    qt_func_column """select c1,c2 from (
+    select t1.a+1 c1,length(t2.b) c2 from test_like1 t1 inner join test_like2 t2 on t1.a=t2.a
+    union ALL
+    select t1.a+1,length(t2.b)+1 from test_like1 t1  inner join test_like3 t2 on t1.a=t2.a) t order by 1,2"""
+
+    qt_other_join_slot_differnt """select c1 from (
+    select t1.a+1 c1 from test_like1 t1 inner join test_like2 t2 on t1.a=t2.c
+    union ALL
+    select t1.a+1 from test_like1 t1  inner join test_like3 t2 on t1.a=t2.a) t order by 1"""
+
+    qt_join_common_slot_has_expr """select c1 from (
+    select t1.a+1 c1 from test_like1 t1 inner join test_like2 t2 on t1.a+1=t2.a
+    union ALL
+    select t1.a+1 from test_like1 t1  inner join test_like2 t2 on t1.a+1=t2.a) t order by 1"""
+
+    qt_can_not_transform """select c1,c2 from (
+    select t2.c c1,t1.a c2 from test_like1 t1 inner join test_like2 t2 on t1.a=t2.a
+    union ALL
+    select t1.a,t2.c from test_like1 t1  inner join test_like2 t2 on t1.a=t2.a) t order by 1,2"""
+
+    qt_other_side_condition_slot_has_expr_do_transform """
+    select c1 from (
+    select t1.a+1 c1 from test_like4 t1 inner join test_like2 t2 on t1.a=t2.a+2
+    union ALL
+    select t1.a+1 from test_like4 t1  inner join test_like3 t2 on t1.a=t2.a+1) t order by 1"""
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org