From 8061597f2a09959fc1cbf5a71051dbfc8e9467b0 Mon Sep 17 00:00:00 2001 From: morrySnow <101034200+morrySnow@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:47:18 +0800 Subject: [PATCH] [fix](Nereids) nullable not adjust in output exprs in result sink node (#30206) --- .../apache/doris/nereids/analyzer/UnboundResultSink.java | 5 +++++ .../apache/doris/nereids/analyzer/UnboundTableSink.java | 6 ++++++ .../doris/nereids/rules/rewrite/AdjustNullable.java | 8 ++++++++ .../plans/logical/LogicalDeferMaterializeResultSink.java | 7 +++++++ .../nereids/trees/plans/logical/LogicalFileSink.java | 2 +- .../nereids/trees/plans/logical/LogicalOlapTableSink.java | 5 +++++ .../nereids/trees/plans/logical/LogicalResultSink.java | 5 +++++ .../doris/nereids/trees/plans/logical/LogicalSink.java | 2 ++ 8 files changed, 39 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundResultSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundResultSink.java index 6f378e9911..10a6b0121e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundResultSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundResultSink.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; 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.plans.BlockFuncDepsPropagation; import org.apache.doris.nereids.trees.plans.Plan; @@ -77,7 +78,11 @@ public class UnboundResultSink extends LogicalSink logicalProperties, List children) { Preconditions.checkArgument(children.size() == 1, "UnboundResultSink only accepts one child"); return new UnboundResultSink<>(groupExpression, logicalProperties, children.get(0)); + } + @Override + public UnboundResultSink withOutputExprs(List outputExprs) { + throw new UnboundException("could not call withOutputExprs on UnboundResultSink"); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java index 1bd4e994ac..89d67dc376 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.properties.UnboundLogicalProperties; 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.plans.BlockFuncDepsPropagation; import org.apache.doris.nereids.trees.plans.Plan; @@ -137,6 +138,11 @@ public class UnboundTableSink extends LogicalSink withOutputExprs(List outputExprs) { + throw new UnboundException("could not call withOutputExprs on UnboundTableSink"); + } + @Override public R accept(PlanVisitor visitor, C context) { return visitor.visitUnboundTableSink(this, context); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java index 2aa095875e..8f70b86e4b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java @@ -40,6 +40,7 @@ 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.LogicalRepeat; import org.apache.doris.nereids.trees.plans.logical.LogicalSetOperation; +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.LogicalTopN; import org.apache.doris.nereids.trees.plans.logical.LogicalUnion; @@ -78,6 +79,13 @@ public class AdjustNullable extends DefaultPlanRewriter> imple return logicalPlan; } + @Override + public Plan visitLogicalSink(LogicalSink logicalSink, Map replaceMap) { + logicalSink = (LogicalSink) super.visit(logicalSink, replaceMap); + List newOutputExprs = updateExpressions(logicalSink.getOutputExprs(), replaceMap); + return logicalSink.withOutputExprs(newOutputExprs); + } + @Override public Plan visitLogicalAggregate(LogicalAggregate aggregate, Map replaceMap) { aggregate = (LogicalAggregate) super.visit(aggregate, replaceMap); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeResultSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeResultSink.java index ab6efb8977..dab393cb00 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeResultSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeResultSink.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.OlapTable; import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.properties.LogicalProperties; import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.PropagateFuncDeps; import org.apache.doris.nereids.trees.plans.algebra.Sink; @@ -82,6 +83,12 @@ public class LogicalDeferMaterializeResultSink olapTable, selectedIndexId, Optional.empty(), Optional.empty(), children.get(0)); } + @Override + public LogicalDeferMaterializeResultSink withOutputExprs(List outputExprs) { + return new LogicalDeferMaterializeResultSink<>(logicalResultSink, olapTable, selectedIndexId, + Optional.empty(), Optional.empty(), child()); + } + @Override public R accept(PlanVisitor visitor, C context) { return visitor.visitLogicalDeferMaterializeResultSink(this, context); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java index 3ca559c519..43e490c00c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileSink.java @@ -59,7 +59,7 @@ public class LogicalFileSink extends LogicalSink outputExprs) { + public LogicalFileSink withOutputExprs(List outputExprs) { return new LogicalFileSink<>(filePath, format, properties, outputExprs, child()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java index a1147a9617..1a298ea8c4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableSink.java @@ -113,6 +113,11 @@ public class LogicalOlapTableSink extends LogicalSink withOutputExprs(List outputExprs) { + return new LogicalOlapTableSink<>(database, targetTable, cols, partitionIds, outputExprs, isPartialUpdate, + dmlCommandType, Optional.empty(), Optional.empty(), child()); + } + @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/LogicalResultSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalResultSink.java index 564938dd8b..6312aee623 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalResultSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalResultSink.java @@ -72,6 +72,11 @@ public class LogicalResultSink extends LogicalSink(outputExprs, groupExpression, logicalProperties, children.get(0)); } + @Override + public LogicalResultSink withOutputExprs(List outputExprs) { + return new LogicalResultSink<>(outputExprs, Optional.empty(), Optional.empty(), child()); + } + @Override public String toString() { return Utils.toSqlString("LogicalResultSink[" + id.asInt() + "]", diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSink.java index 028c0e93e0..ea2fa49e46 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSink.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSink.java @@ -52,6 +52,8 @@ public abstract class LogicalSink extends LogicalUnary< return outputExprs; } + public abstract LogicalSink withOutputExprs(List outputExprs); + @Override public List getExpressions() { return outputExprs;