From 814bcba5a76504a8da9fb46e3cb3062516b20b70 Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Wed, 15 May 2024 22:04:47 +0800 Subject: [PATCH] [fix](nereids)LogicalPlanDeepCopier will lost some info when coping logical relation --- .../analyzer/UnboundOneRowRelation.java | 5 + .../nereids/analyzer/UnboundRelation.java | 5 + .../nereids/analyzer/UnboundTVFRelation.java | 5 + .../trees/copier/LogicalPlanDeepCopier.java | 112 ++++++++---------- .../plans/logical/LogicalCTEConsumer.java | 5 + .../LogicalDeferMaterializeOlapScan.java | 6 + .../plans/logical/LogicalEmptyRelation.java | 5 + .../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 ++ .../plans/logical/LogicalOneRowRelation.java | 5 + .../trees/plans/logical/LogicalRelation.java | 2 + .../plans/logical/LogicalSchemaScan.java | 5 + .../plans/logical/LogicalTVFRelation.java | 5 + .../trees/plans/logical/LogicalTestScan.java | 5 + .../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 160b7210f7a3bf..9bc368c8ad6b18 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 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 34217b249fc510..2dc81e01440731 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 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 13b8336933aad2..e876825af6569a 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 197de0089a31a9..9f87d6a60a69be 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.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 LogicalPlan deepCopy(LogicalPlan plan, DeepCopierContext context) { 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 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 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 Plan visitLogicalFilter(LogicalFilter filter, DeepCopierC 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 Plan visitLogicalDeferMaterializeOlapScan(LogicalDeferMaterializeOlapScan .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 Plan visitLogicalFileScan(LogicalFileScan fileScan, DeepCopierContext con 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 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 Plan visitLogicalJdbcScan(LogicalJdbcScan jdbcScan, DeepCopierContext con if (context.getRelationReplaceMap().containsKey(jdbcScan.getRelationId())) { return context.getRelationReplaceMap().get(jdbcScan.getRelationId()); } - LogicalJdbcScan newJdbcScan = new LogicalJdbcScan(StatementScopeIdGenerator.newRelationId(), - jdbcScan.getTable(), jdbcScan.getQualifier()); + Set 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 Plan visitLogicalOdbcScan(LogicalOdbcScan odbcScan, DeepCopierContext con if (context.getRelationReplaceMap().containsKey(odbcScan.getRelationId())) { return context.getRelationReplaceMap().get(odbcScan.getRelationId()); } - LogicalOdbcScan newOdbcScan = new LogicalOdbcScan(StatementScopeIdGenerator.newRelationId(), - odbcScan.getTable(), odbcScan.getQualifier()); + Set 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 Plan visitLogicalEsScan(LogicalEsScan esScan, DeepCopierContext context) if (context.getRelationReplaceMap().containsKey(esScan.getRelationId())) { return context.getRelationReplaceMap().get(esScan.getRelationId()); } - LogicalEsScan newEsScan = new LogicalEsScan(StatementScopeIdGenerator.newRelationId(), - esScan.getTable(), esScan.getQualifier()); + Set 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 5fd088a2bba196..aed808d811d50b 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr groupExpression, logicalProperties); } + @Override + public LogicalCTEConsumer withRelationId(RelationId relationId) { + throw new RuntimeException("should not call LogicalCTEConsumer's withRelationId method"); + } + @Override public List 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 a49e37d8df40a0..77da6537dd7d09 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.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 Plan withChildren(List children) { return this; } + @Override + public LogicalDeferMaterializeOlapScan withRelationId(RelationId relationId) { + throw new RuntimeException("should not call LogicalDeferMaterializeOlapScan's withRelationId method"); + } + @Override public R accept(PlanVisitor 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 ab816f7a40859d..4ed218410d95d2 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 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 f9b0c3d965eab5..66882354e20415 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr } public LogicalEsScan withConjuncts(Set 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 accept(PlanVisitor 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 03ec87aad0be93..0b61dd24dac3cf 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr } public LogicalFileScan withConjuncts(Set 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 accept(PlanVisitor 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 076b6027d23018..1f295f37da7c8d 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 LogicalJdbcScan withGroupExpression(Optional groupExpres } public LogicalJdbcScan withConjuncts(Set 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 accept(PlanVisitor 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 840cb1113a41c0..1e57ad80c45601 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 LogicalOdbcScan withGroupExpression(Optional groupExpres } public LogicalOdbcScan withConjuncts(Set 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 accept(PlanVisitor 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 c69a0b4dcf8378..d0d91f1cf8dafb 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 LogicalOlapScan withPreAggStatus(PreAggStatus preAggStatus) { 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 accept(PlanVisitor 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 b6e5af2c591370..77231dd9b359b5 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 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 4a3f5005c88659..cfa419d944c00e 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 RelationId getRelationId() { 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 b71f6d5c432c3a..568dd217cb3258 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 8302c9345dcc17..9b098a6ddbaa13 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 94cae4b955d798..0deed9f5152755 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 Plan withGroupExprLogicalPropChildren(Optional groupExpr 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 accept(PlanVisitor 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 6f1c2d9d9594d4..f4adc72b32a8da 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.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 Plan withGroupExprLogicalPropChildren(Optional groupExpr Optional logicalProperties, List children) { return new LogicalBoundRelation(table, qualifier, groupExpression, logicalProperties); } + + @Override + public LogicalBoundRelation withRelationId(RelationId relationId) { + throw new RuntimeException("should not call LogicalBoundRelation's withRelationId method"); + } } }