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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new fa35e543506 [fix](nereids)LogicalPlanDeepCopier will lost some info 
when coping logical relation (#34933)
fa35e543506 is described below

commit fa35e543506f259a8f8402d1dbddf22dd67e9e9b
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Wed May 15 22:40:32 2024 +0800

    [fix](nereids)LogicalPlanDeepCopier will lost some info when coping logical 
relation (#34933)
---
 .../nereids/analyzer/UnboundOneRowRelation.java    |   5 +
 .../doris/nereids/analyzer/UnboundRelation.java    |   5 +
 .../doris/nereids/analyzer/UnboundTVFRelation.java |   5 +
 .../trees/copier/LogicalPlanDeepCopier.java        | 112 +++++++++------------
 .../trees/plans/logical/LogicalCTEConsumer.java    |   5 +
 .../logical/LogicalDeferMaterializeOlapScan.java   |   6 ++
 .../trees/plans/logical/LogicalEmptyRelation.java  |   5 +
 .../nereids/trees/plans/logical/LogicalEsScan.java |   8 +-
 .../trees/plans/logical/LogicalFileScan.java       |  10 +-
 .../trees/plans/logical/LogicalJdbcScan.java       |   7 +-
 .../trees/plans/logical/LogicalOdbcScan.java       |   7 +-
 .../trees/plans/logical/LogicalOlapScan.java       |  10 ++
 .../trees/plans/logical/LogicalOneRowRelation.java |   5 +
 .../trees/plans/logical/LogicalRelation.java       |   2 +
 .../trees/plans/logical/LogicalSchemaScan.java     |   5 +
 .../trees/plans/logical/LogicalTVFRelation.java    |   5 +
 .../trees/plans/logical/LogicalTestScan.java       |   5 +
 .../doris/nereids/jobs/RewriteTopDownJobTest.java  |   6 ++
 18 files changed, 146 insertions(+), 67 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundOneRowRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundOneRowRelation.java
index 160b7210f7a..9bc368c8ad6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundOneRowRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundOneRowRelation.java
@@ -86,6 +86,11 @@ public class UnboundOneRowRelation extends LogicalRelation 
implements Unbound, O
         return new UnboundOneRowRelation(relationId, projects, 
groupExpression, logicalProperties);
     }
 
+    @Override
+    public UnboundOneRowRelation withRelationId(RelationId relationId) {
+        throw new UnboundException("should not call UnboundOneRowRelation's 
withRelationId method");
+    }
+
     @Override
     public List<Slot> computeOutput() {
         throw new UnboundException("output");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
index 34217b249fc..2dc81e01440 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
@@ -143,6 +143,11 @@ public class UnboundRelation extends LogicalRelation 
implements Unbound, BlockFu
                 isTempPart, tabletIds, hints, tableSample, indexName, null, 
indexInSqlString);
     }
 
+    @Override
+    public UnboundRelation withRelationId(RelationId relationId) {
+        throw new UnboundException("should not call UnboundRelation's 
withRelationId method");
+    }
+
     @Override
     public List<Slot> computeOutput() {
         throw new UnboundException("output");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTVFRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTVFRelation.java
index 13b8336933a..e876825af65 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTVFRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTVFRelation.java
@@ -101,6 +101,11 @@ public class UnboundTVFRelation extends LogicalRelation 
implements TVFRelation,
         return new UnboundTVFRelation(relationId, functionName, properties, 
groupExpression, logicalProperties);
     }
 
+    @Override
+    public UnboundTVFRelation withRelationId(RelationId relationId) {
+        throw new UnboundException("should not call UnboundTVFRelation's 
withRelationId method");
+    }
+
     @Override
     public String toString() {
         return Utils.toSqlString("UnboundTVFRelation",
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
index 197de0089a3..9f87d6a60a6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java
@@ -55,11 +55,10 @@ import 
org.apache.doris.nereids.trees.plans.logical.LogicalOneRowRelation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPartitionTopN;
 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.LogicalRelation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat;
-import org.apache.doris.nereids.trees.plans.logical.LogicalSchemaScan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalSink;
 import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
-import org.apache.doris.nereids.trees.plans.logical.LogicalTVFRelation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalTopN;
 import org.apache.doris.nereids.trees.plans.logical.LogicalUnion;
 import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
@@ -85,20 +84,44 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         return (LogicalPlan) plan.accept(this, context);
     }
 
+    @Override
+    public Plan visitLogicalRelation(LogicalRelation logicalRelation, 
DeepCopierContext context) {
+        if 
(context.getRelationReplaceMap().containsKey(logicalRelation.getRelationId())) {
+            return 
context.getRelationReplaceMap().get(logicalRelation.getRelationId());
+        }
+        LogicalRelation newRelation =
+                
logicalRelation.withRelationId(StatementScopeIdGenerator.newRelationId());
+        updateReplaceMapWithOutput(logicalRelation, newRelation, 
context.exprIdReplaceMap);
+        context.putRelation(logicalRelation.getRelationId(), newRelation);
+        return newRelation;
+    }
+
     @Override
     public Plan visitLogicalEmptyRelation(LogicalEmptyRelation emptyRelation, 
DeepCopierContext context) {
+        if 
(context.getRelationReplaceMap().containsKey(emptyRelation.getRelationId())) {
+            return 
context.getRelationReplaceMap().get(emptyRelation.getRelationId());
+        }
         List<NamedExpression> newProjects = 
emptyRelation.getProjects().stream()
                 .map(p -> (NamedExpression) 
ExpressionDeepCopier.INSTANCE.deepCopy(p, context))
                 .collect(ImmutableList.toImmutableList());
-        return new 
LogicalEmptyRelation(StatementScopeIdGenerator.newRelationId(), newProjects);
+        LogicalEmptyRelation newEmptyRelation =
+                new 
LogicalEmptyRelation(StatementScopeIdGenerator.newRelationId(), newProjects);
+        context.putRelation(emptyRelation.getRelationId(), newEmptyRelation);
+        return newEmptyRelation;
     }
 
     @Override
     public Plan visitLogicalOneRowRelation(LogicalOneRowRelation 
oneRowRelation, DeepCopierContext context) {
+        if 
(context.getRelationReplaceMap().containsKey(oneRowRelation.getRelationId())) {
+            return 
context.getRelationReplaceMap().get(oneRowRelation.getRelationId());
+        }
         List<NamedExpression> newProjects = 
oneRowRelation.getProjects().stream()
                 .map(p -> (NamedExpression) 
ExpressionDeepCopier.INSTANCE.deepCopy(p, context))
                 .collect(ImmutableList.toImmutableList());
-        return new 
LogicalOneRowRelation(StatementScopeIdGenerator.newRelationId(), newProjects);
+        LogicalOneRowRelation newOneRowRelation =
+                new 
LogicalOneRowRelation(StatementScopeIdGenerator.newRelationId(), newProjects);
+        context.putRelation(oneRowRelation.getRelationId(), newOneRowRelation);
+        return newOneRowRelation;
     }
 
     @Override
@@ -154,28 +177,6 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         return new LogicalFilter<>(conjuncts, child);
     }
 
-    @Override
-    public Plan visitLogicalOlapScan(LogicalOlapScan olapScan, 
DeepCopierContext context) {
-        if 
(context.getRelationReplaceMap().containsKey(olapScan.getRelationId())) {
-            return 
context.getRelationReplaceMap().get(olapScan.getRelationId());
-        }
-        LogicalOlapScan newOlapScan;
-        if (olapScan.getManuallySpecifiedPartitions().isEmpty()) {
-            newOlapScan = new 
LogicalOlapScan(StatementScopeIdGenerator.newRelationId(),
-                    olapScan.getTable(), olapScan.getQualifier(), 
olapScan.getSelectedTabletIds(),
-                    olapScan.getHints(), olapScan.getTableSample());
-        } else {
-            newOlapScan = new 
LogicalOlapScan(StatementScopeIdGenerator.newRelationId(),
-                    olapScan.getTable(), olapScan.getQualifier(),
-                    olapScan.getManuallySpecifiedPartitions(), 
olapScan.getSelectedTabletIds(),
-                    olapScan.getHints(), olapScan.getTableSample());
-        }
-        newOlapScan.getOutput();
-        context.putRelation(olapScan.getRelationId(), newOlapScan);
-        updateReplaceMapWithOutput(olapScan, newOlapScan, 
context.exprIdReplaceMap);
-        return newOlapScan;
-    }
-
     @Override
     public Plan 
visitLogicalDeferMaterializeOlapScan(LogicalDeferMaterializeOlapScan 
deferMaterializeOlapScan,
             DeepCopierContext context) {
@@ -186,19 +187,9 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
                 .collect(ImmutableSet.toImmutableSet());
         SlotReference newRowId = (SlotReference) ExpressionDeepCopier.INSTANCE
                 .deepCopy(deferMaterializeOlapScan.getColumnIdSlot(), context);
-        return new LogicalDeferMaterializeOlapScan(newScan, newSlotIds, 
newRowId);
-    }
-
-    @Override
-    public Plan visitLogicalSchemaScan(LogicalSchemaScan schemaScan, 
DeepCopierContext context) {
-        if 
(context.getRelationReplaceMap().containsKey(schemaScan.getRelationId())) {
-            return 
context.getRelationReplaceMap().get(schemaScan.getRelationId());
-        }
-        LogicalSchemaScan newSchemaScan = new 
LogicalSchemaScan(StatementScopeIdGenerator.newRelationId(),
-                schemaScan.getTable(), schemaScan.getQualifier());
-        updateReplaceMapWithOutput(schemaScan, newSchemaScan, 
context.exprIdReplaceMap);
-        context.putRelation(schemaScan.getRelationId(), newSchemaScan);
-        return newSchemaScan;
+        LogicalDeferMaterializeOlapScan newMaterializeOlapScan =
+                new LogicalDeferMaterializeOlapScan(newScan, newSlotIds, 
newRowId);
+        return newMaterializeOlapScan;
     }
 
     @Override
@@ -206,26 +197,14 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         if 
(context.getRelationReplaceMap().containsKey(fileScan.getRelationId())) {
             return 
context.getRelationReplaceMap().get(fileScan.getRelationId());
         }
-        LogicalFileScan newFileScan = new 
LogicalFileScan(StatementScopeIdGenerator.newRelationId(),
-                fileScan.getTable(), fileScan.getQualifier(), 
fileScan.getTableSample());
-        updateReplaceMapWithOutput(fileScan, newFileScan, 
context.exprIdReplaceMap);
-        context.putRelation(fileScan.getRelationId(), newFileScan);
         Set<Expression> conjuncts = fileScan.getConjuncts().stream()
                 .map(p -> ExpressionDeepCopier.INSTANCE.deepCopy(p, context))
                 .collect(ImmutableSet.toImmutableSet());
-        return newFileScan.withConjuncts(conjuncts);
-    }
-
-    @Override
-    public Plan visitLogicalTVFRelation(LogicalTVFRelation tvfRelation, 
DeepCopierContext context) {
-        if 
(context.getRelationReplaceMap().containsKey(tvfRelation.getRelationId())) {
-            return 
context.getRelationReplaceMap().get(tvfRelation.getRelationId());
-        }
-        LogicalTVFRelation newTVFRelation = new 
LogicalTVFRelation(StatementScopeIdGenerator.newRelationId(),
-                tvfRelation.getFunction());
-        updateReplaceMapWithOutput(tvfRelation, newTVFRelation, 
context.exprIdReplaceMap);
-        context.putRelation(tvfRelation.getRelationId(), newTVFRelation);
-        return newTVFRelation;
+        LogicalFileScan newFileScan = fileScan.withConjuncts(conjuncts)
+                .withRelationId(StatementScopeIdGenerator.newRelationId());
+        updateReplaceMapWithOutput(fileScan, newFileScan, 
context.exprIdReplaceMap);
+        context.putRelation(fileScan.getRelationId(), newFileScan);
+        return newFileScan;
     }
 
     @Override
@@ -233,8 +212,11 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         if 
(context.getRelationReplaceMap().containsKey(jdbcScan.getRelationId())) {
             return 
context.getRelationReplaceMap().get(jdbcScan.getRelationId());
         }
-        LogicalJdbcScan newJdbcScan = new 
LogicalJdbcScan(StatementScopeIdGenerator.newRelationId(),
-                jdbcScan.getTable(), jdbcScan.getQualifier());
+        Set<Expression> conjuncts = jdbcScan.getConjuncts().stream()
+                .map(p -> ExpressionDeepCopier.INSTANCE.deepCopy(p, context))
+                .collect(ImmutableSet.toImmutableSet());
+        LogicalJdbcScan newJdbcScan = jdbcScan.withConjuncts(conjuncts)
+                .withRelationId(StatementScopeIdGenerator.newRelationId());
         updateReplaceMapWithOutput(jdbcScan, newJdbcScan, 
context.exprIdReplaceMap);
         context.putRelation(jdbcScan.getRelationId(), newJdbcScan);
         return newJdbcScan;
@@ -245,8 +227,11 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         if 
(context.getRelationReplaceMap().containsKey(odbcScan.getRelationId())) {
             return 
context.getRelationReplaceMap().get(odbcScan.getRelationId());
         }
-        LogicalOdbcScan newOdbcScan = new 
LogicalOdbcScan(StatementScopeIdGenerator.newRelationId(),
-                odbcScan.getTable(), odbcScan.getQualifier());
+        Set<Expression> conjuncts = odbcScan.getConjuncts().stream()
+                .map(p -> ExpressionDeepCopier.INSTANCE.deepCopy(p, context))
+                .collect(ImmutableSet.toImmutableSet());
+        LogicalOdbcScan newOdbcScan = odbcScan.withConjuncts(conjuncts)
+                .withRelationId(StatementScopeIdGenerator.newRelationId());
         updateReplaceMapWithOutput(odbcScan, newOdbcScan, 
context.exprIdReplaceMap);
         context.putRelation(odbcScan.getRelationId(), newOdbcScan);
         return newOdbcScan;
@@ -257,8 +242,11 @@ public class LogicalPlanDeepCopier extends 
DefaultPlanRewriter<DeepCopierContext
         if 
(context.getRelationReplaceMap().containsKey(esScan.getRelationId())) {
             return context.getRelationReplaceMap().get(esScan.getRelationId());
         }
-        LogicalEsScan newEsScan = new 
LogicalEsScan(StatementScopeIdGenerator.newRelationId(),
-                esScan.getTable(), esScan.getQualifier());
+        Set<Expression> conjuncts = esScan.getConjuncts().stream()
+                .map(p -> ExpressionDeepCopier.INSTANCE.deepCopy(p, context))
+                .collect(ImmutableSet.toImmutableSet());
+        LogicalEsScan newEsScan = esScan.withConjuncts(conjuncts)
+                .withRelationId(StatementScopeIdGenerator.newRelationId());
         updateReplaceMapWithOutput(esScan, newEsScan, 
context.exprIdReplaceMap);
         context.putRelation(esScan.getRelationId(), newEsScan);
         return newEsScan;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEConsumer.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEConsumer.java
index 5fd088a2bba..aed808d811d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEConsumer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCTEConsumer.java
@@ -142,6 +142,11 @@ public class LogicalCTEConsumer extends LogicalRelation 
implements BlockFuncDeps
                 groupExpression, logicalProperties);
     }
 
+    @Override
+    public LogicalCTEConsumer withRelationId(RelationId relationId) {
+        throw new RuntimeException("should not call LogicalCTEConsumer's 
withRelationId method");
+    }
+
     @Override
     public List<Slot> computeOutput() {
         return ImmutableList.copyOf(producerToConsumerOutputMap.values());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeOlapScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeOlapScan.java
index a49e37d8df4..77da6537dd7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeOlapScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeOlapScan.java
@@ -24,6 +24,7 @@ import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.algebra.OlapScan;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.Utils;
@@ -130,6 +131,11 @@ public class LogicalDeferMaterializeOlapScan extends 
LogicalCatalogRelation impl
         return this;
     }
 
+    @Override
+    public LogicalDeferMaterializeOlapScan withRelationId(RelationId 
relationId) {
+        throw new RuntimeException("should not call 
LogicalDeferMaterializeOlapScan's withRelationId method");
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalDeferMaterializeOlapScan(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java
index ab816f7a408..4ed218410d9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEmptyRelation.java
@@ -81,6 +81,11 @@ public class LogicalEmptyRelation extends LogicalRelation
         return new LogicalEmptyRelation(relationId, projects, groupExpression, 
logicalProperties);
     }
 
+    @Override
+    public LogicalEmptyRelation withRelationId(RelationId relationId) {
+        throw new RuntimeException("should not call LogicalEmptyRelation's 
withRelationId method");
+    }
+
     @Override
     public List<Slot> computeOutput() {
         return projects.stream()
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
index f9b0c3d965e..66882354e20 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
@@ -84,10 +84,16 @@ public class LogicalEsScan extends LogicalCatalogRelation {
     }
 
     public LogicalEsScan withConjuncts(Set<Expression> conjuncts) {
-        return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
groupExpression,
+        return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
Optional.empty(),
                 Optional.of(getLogicalProperties()), conjuncts);
     }
 
+    @Override
+    public LogicalEsScan withRelationId(RelationId relationId) {
+        return new LogicalEsScan(relationId, (ExternalTable) table, qualifier, 
Optional.empty(),
+                Optional.empty(), conjuncts);
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalEsScan(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
index 03ec87aad0b..0b61dd24dac 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
@@ -109,15 +109,21 @@ public class LogicalFileScan extends 
LogicalCatalogRelation {
     }
 
     public LogicalFileScan withConjuncts(Set<Expression> conjuncts) {
-        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, groupExpression,
+        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
                 Optional.of(getLogicalProperties()), conjuncts, 
selectedPartitions, tableSample);
     }
 
     public LogicalFileScan withSelectedPartitions(SelectedPartitions 
selectedPartitions) {
-        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, groupExpression,
+        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
                 Optional.of(getLogicalProperties()), conjuncts, 
selectedPartitions, tableSample);
     }
 
+    @Override
+    public LogicalFileScan withRelationId(RelationId relationId) {
+        return new LogicalFileScan(relationId, (ExternalTable) table, 
qualifier, Optional.empty(),
+                Optional.empty(), conjuncts, selectedPartitions, tableSample);
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalFileScan(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
index 076b6027d23..1f295f37da7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
@@ -82,7 +82,7 @@ public class LogicalJdbcScan extends LogicalCatalogRelation {
     }
 
     public LogicalJdbcScan withConjuncts(Set<Expression> conjuncts) {
-        return new LogicalJdbcScan(relationId, table, qualifier, 
groupExpression,
+        return new LogicalJdbcScan(relationId, table, qualifier, 
Optional.empty(),
             Optional.of(getLogicalProperties()), conjuncts);
     }
 
@@ -92,6 +92,11 @@ public class LogicalJdbcScan extends LogicalCatalogRelation {
         return new LogicalJdbcScan(relationId, table, qualifier, 
groupExpression, logicalProperties, conjuncts);
     }
 
+    @Override
+    public LogicalJdbcScan withRelationId(RelationId relationId) {
+        return new LogicalJdbcScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty(), conjuncts);
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalJdbcScan(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
index 840cb1113a4..1e57ad80c45 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOdbcScan.java
@@ -78,7 +78,7 @@ public class LogicalOdbcScan extends LogicalCatalogRelation {
     }
 
     public LogicalOdbcScan withConjuncts(Set<Expression> conjuncts) {
-        return new LogicalOdbcScan(relationId, table, qualifier, 
groupExpression,
+        return new LogicalOdbcScan(relationId, table, qualifier, 
Optional.empty(),
                 Optional.of(getLogicalProperties()), conjuncts);
     }
 
@@ -88,6 +88,11 @@ public class LogicalOdbcScan extends LogicalCatalogRelation {
         return new LogicalOdbcScan(relationId, table, qualifier, 
groupExpression, logicalProperties, conjuncts);
     }
 
+    @Override
+    public LogicalOdbcScan withRelationId(RelationId relationId) {
+        return new LogicalOdbcScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty(), conjuncts);
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalOdbcScan(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
index c69a0b4dcf8..d0d91f1cf8d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
@@ -311,6 +311,16 @@ public class LogicalOlapScan extends 
LogicalCatalogRelation implements OlapScan
                 hints, cacheSlotWithSlotName, tableSample, directMvScan, 
projectPulledUp);
     }
 
+    @Override
+    public LogicalOlapScan withRelationId(RelationId relationId) {
+        // we have to set partitionPruned to false, so that mtmv rewrite can 
prevent deadlock when rewriting union
+        return new LogicalOlapScan(relationId, (Table) table, qualifier,
+                Optional.empty(), Optional.empty(),
+                selectedPartitionIds, false, selectedTabletIds,
+                selectedIndexId, indexSelected, preAggStatus, 
manuallySpecifiedPartitions,
+                hints, Maps.newHashMap(), tableSample, directMvScan, 
projectPulledUp);
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalOlapScan(this, context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java
index b6e5af2c591..77231dd9b35 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOneRowRelation.java
@@ -89,6 +89,11 @@ public class LogicalOneRowRelation extends LogicalRelation 
implements OneRowRela
         return new LogicalOneRowRelation(relationId, projects, 
groupExpression, logicalProperties);
     }
 
+    @Override
+    public LogicalOneRowRelation withRelationId(RelationId relationId) {
+        throw new RuntimeException("should not call LogicalOneRowRelation's 
withRelationId method");
+    }
+
     @Override
     public List<Slot> computeOutput() {
         return projects.stream()
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java
index 4a3f5005c88..cfa419d944c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRelation.java
@@ -83,6 +83,8 @@ public abstract class LogicalRelation extends LogicalLeaf 
implements Relation {
         return relationId;
     }
 
+    public abstract LogicalRelation withRelationId(RelationId relationId);
+
     @Override
     public JSONObject toJson() {
         JSONObject logicalRelation = super.toJson();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
index b71f6d5c432..568dd217cb3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSchemaScan.java
@@ -65,6 +65,11 @@ public class LogicalSchemaScan extends 
LogicalCatalogRelation {
         return new LogicalSchemaScan(relationId, table, qualifier, 
groupExpression, logicalProperties);
     }
 
+    @Override
+    public LogicalSchemaScan withRelationId(RelationId relationId) {
+        return new LogicalSchemaScan(relationId, table, qualifier, 
Optional.empty(), Optional.empty());
+    }
+
     @Override
     public String toString() {
         return Utils.toSqlString("LogicalSchemaScan");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
index 8302c9345dc..9b098a6ddba 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTVFRelation.java
@@ -67,6 +67,11 @@ public class LogicalTVFRelation extends LogicalRelation 
implements TVFRelation,
         return new LogicalTVFRelation(relationId, function, groupExpression, 
logicalProperties);
     }
 
+    @Override
+    public LogicalTVFRelation withRelationId(RelationId relationId) {
+        return new LogicalTVFRelation(relationId, function, Optional.empty(), 
Optional.empty());
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTestScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTestScan.java
index 94cae4b955d..0deed9f5152 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTestScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTestScan.java
@@ -70,6 +70,11 @@ public class LogicalTestScan extends LogicalCatalogRelation {
         return new LogicalTestScan(relationId, table, qualifier, 
groupExpression, logicalProperties);
     }
 
+    @Override
+    public LogicalTestScan withRelationId(RelationId relationId) {
+        throw new RuntimeException("should not call LogicalTestScan's 
withRelationId method");
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitLogicalTestScan(this, context);
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/RewriteTopDownJobTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/RewriteTopDownJobTest.java
index 6f1c2d9d959..f4adc72b32a 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/RewriteTopDownJobTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/RewriteTopDownJobTest.java
@@ -30,6 +30,7 @@ import 
org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
@@ -123,5 +124,10 @@ public class RewriteTopDownJobTest {
                 Optional<LogicalProperties> logicalProperties, List<Plan> 
children) {
             return new LogicalBoundRelation(table, qualifier, groupExpression, 
logicalProperties);
         }
+
+        @Override
+        public LogicalBoundRelation withRelationId(RelationId relationId) {
+            throw new RuntimeException("should not call LogicalBoundRelation's 
withRelationId method");
+        }
     }
 }


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

Reply via email to