[fix](nereids) collect all correlated slots from subquery in correct way (#30908)

This commit is contained in:
starocean999
2024-02-08 13:48:13 +08:00
committed by yiguolei
parent d60ecdba6f
commit 448fb70f68
3 changed files with 15 additions and 19 deletions

View File

@ -17,10 +17,8 @@
package org.apache.doris.nereids.util;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@ -167,23 +165,8 @@ public class Utils {
*/
public static List<Expression> getCorrelatedSlots(List<Expression> correlatedPredicates,
List<Expression> correlatedSlots) {
List<Expression> slots = new ArrayList<>();
correlatedPredicates.forEach(predicate -> {
if (!(predicate instanceof BinaryExpression)
&& (!(predicate instanceof Not) || !(predicate.child(0) instanceof BinaryExpression))) {
throw new AnalysisException("Unsupported correlated subquery with"
+ " non-equals correlated predicate " + predicate.toSql());
}
BinaryExpression binaryExpression;
if (predicate instanceof Not) {
binaryExpression = (BinaryExpression) ((Not) predicate).child();
} else {
binaryExpression = (BinaryExpression) predicate;
}
slots.addAll(collectCorrelatedSlotsFromChildren(binaryExpression, correlatedSlots));
});
return slots;
return ExpressionUtils.getInputSlotSet(correlatedPredicates).stream()
.filter(slot -> !correlatedSlots.contains(slot)).collect(Collectors.toList());
}
private static List<Expression> collectCorrelatedSlotsFromChildren(