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