[fix](Nereids) nullable not adjust in output exprs in result sink node (#30206)

This commit is contained in:
morrySnow
2024-01-22 14:47:18 +08:00
committed by yiguolei
parent 5c43708d92
commit 8061597f2a
8 changed files with 39 additions and 1 deletions

View File

@ -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<CHILD_TYPE extends Plan> extends LogicalSink<CHIL
Optional<LogicalProperties> logicalProperties, List<Plan> children) {
Preconditions.checkArgument(children.size() == 1, "UnboundResultSink only accepts one child");
return new UnboundResultSink<>(groupExpression, logicalProperties, children.get(0));
}
@Override
public UnboundResultSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> outputExprs) {
throw new UnboundException("could not call withOutputExprs on UnboundResultSink");
}
@Override

View File

@ -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<CHILD_TYPE extends Plan> extends LogicalSink<CHILD
dmlCommandType, groupExpression, Optional.empty(), children.get(0));
}
@Override
public UnboundTableSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> outputExprs) {
throw new UnboundException("could not call withOutputExprs on UnboundTableSink");
}
@Override
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
return visitor.visitUnboundTableSink(this, context);

View File

@ -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<Map<ExprId, Slot>> imple
return logicalPlan;
}
@Override
public Plan visitLogicalSink(LogicalSink<? extends Plan> logicalSink, Map<ExprId, Slot> replaceMap) {
logicalSink = (LogicalSink<? extends Plan>) super.visit(logicalSink, replaceMap);
List<NamedExpression> newOutputExprs = updateExpressions(logicalSink.getOutputExprs(), replaceMap);
return logicalSink.withOutputExprs(newOutputExprs);
}
@Override
public Plan visitLogicalAggregate(LogicalAggregate<? extends Plan> aggregate, Map<ExprId, Slot> replaceMap) {
aggregate = (LogicalAggregate<? extends Plan>) super.visit(aggregate, replaceMap);

View File

@ -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<CHILD_TYPE extends Plan>
olapTable, selectedIndexId, Optional.empty(), Optional.empty(), children.get(0));
}
@Override
public LogicalDeferMaterializeResultSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> outputExprs) {
return new LogicalDeferMaterializeResultSink<>(logicalResultSink, olapTable, selectedIndexId,
Optional.empty(), Optional.empty(), child());
}
@Override
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
return visitor.visitLogicalDeferMaterializeResultSink(this, context);

View File

@ -59,7 +59,7 @@ public class LogicalFileSink<CHILD_TYPE extends Plan> extends LogicalSink<CHILD_
this.properties = ImmutableMap.copyOf(Objects.requireNonNull(properties));
}
public Plan withOutputExprs(List<NamedExpression> outputExprs) {
public LogicalFileSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> outputExprs) {
return new LogicalFileSink<>(filePath, format, properties, outputExprs, child());
}

View File

@ -113,6 +113,11 @@ public class LogicalOlapTableSink<CHILD_TYPE extends Plan> extends LogicalSink<C
return dmlCommandType;
}
public LogicalOlapTableSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> 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) {

View File

@ -72,6 +72,11 @@ public class LogicalResultSink<CHILD_TYPE extends Plan> extends LogicalSink<CHIL
return new LogicalResultSink<>(outputExprs, groupExpression, logicalProperties, children.get(0));
}
@Override
public LogicalResultSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> outputExprs) {
return new LogicalResultSink<>(outputExprs, Optional.empty(), Optional.empty(), child());
}
@Override
public String toString() {
return Utils.toSqlString("LogicalResultSink[" + id.asInt() + "]",

View File

@ -52,6 +52,8 @@ public abstract class LogicalSink<CHILD_TYPE extends Plan> extends LogicalUnary<
return outputExprs;
}
public abstract LogicalSink<CHILD_TYPE> withOutputExprs(List<NamedExpression> outputExprs);
@Override
public List<? extends Expression> getExpressions() {
return outputExprs;