[fix](nereids)need substitute agg function using agg node's output if it's in order by key (#30704)

This commit is contained in:
starocean999
2024-02-02 20:37:54 +08:00
committed by yiguolei
parent 5687ca977d
commit e413dbec91
2 changed files with 29 additions and 1 deletions

View File

@ -183,10 +183,14 @@ public class FillUpMissingSlots implements AnalysisRuleFactory {
private final List<Expression> groupByExpressions;
private final Map<Expression, Slot> substitution = Maps.newHashMap();
private final List<NamedExpression> newOutputSlots = Lists.newArrayList();
private final Map<Slot, Expression> outputSubstitutionMap;
Resolver(Aggregate aggregate) {
outputExpressions = aggregate.getOutputExpressions();
groupByExpressions = aggregate.getGroupByExpressions();
outputSubstitutionMap = outputExpressions.stream().filter(Alias.class::isInstance)
.collect(Collectors.toMap(alias -> alias.toSlot(), alias -> alias.child(0),
(k1, k2) -> k1));
}
public void resolve(Expression expression) {
@ -273,7 +277,8 @@ public class FillUpMissingSlots implements AnalysisRuleFactory {
}
private void generateAliasForNewOutputSlots(Expression expression) {
Alias alias = new Alias(expression);
Expression replacedExpr = ExpressionUtils.replace(expression, outputSubstitutionMap);
Alias alias = new Alias(replacedExpr);
newOutputSlots.add(alias);
substitution.put(expression, alias.toSlot());
}