[Fix](nereids) fix partition_prune or expression evaluate wrongly (#38897) (#38998)

cherry-pick #38897 to branch-2.1
This commit is contained in:
feiniaofeiafei
2024-08-07 13:49:42 +08:00
committed by GitHub
parent 7550fbaff7
commit f9788b4ca5
3 changed files with 68 additions and 33 deletions

View File

@ -409,17 +409,8 @@ public class OneRangePartitionEvaluator
@Override
public EvaluateRangeResult visitAnd(And and, EvaluateRangeInput context) {
EvaluateRangeResult result = evaluateChildrenThenThis(and, context);
result = mergeRanges(result.result, result.childrenResult.get(0), result.childrenResult.get(1),
(leftRange, rightRange) -> {
if (leftRange == null) {
return rightRange;
}
if (rightRange == null) {
return leftRange;
}
return leftRange.intersect(rightRange);
});
(leftRange, rightRange) -> leftRange.intersect(rightRange));
result = returnFalseIfExistEmptyRange(result);
if (result.result.equals(BooleanLiteral.FALSE)) {
@ -435,18 +426,20 @@ public class OneRangePartitionEvaluator
@Override
public EvaluateRangeResult visitOr(Or or, EvaluateRangeInput context) {
EvaluateRangeResult result = evaluateChildrenThenThis(or, context);
if (result.result.equals(BooleanLiteral.FALSE)) {
return result;
} else if (result.childrenResult.get(0).result.equals(BooleanLiteral.FALSE)) {
// false or a<1 -> return range a<1
return new EvaluateRangeResult(result.result, result.childrenResult.get(1).columnRanges,
result.childrenResult);
} else if (result.childrenResult.get(1).result.equals(BooleanLiteral.FALSE)) {
// a<1 or false -> return range a<1
return new EvaluateRangeResult(result.result, result.childrenResult.get(0).columnRanges,
result.childrenResult);
}
result = mergeRanges(result.result, result.childrenResult.get(0), result.childrenResult.get(1),
(leftRange, rightRange) -> {
if (leftRange == null) {
return rightRange;
}
if (rightRange == null) {
return leftRange;
}
return leftRange.union(rightRange);
});
return removeEmptyRange(result);
(leftRange, rightRange) -> leftRange.union(rightRange));
return returnFalseIfExistEmptyRange(result);
}
@Override
@ -596,7 +589,9 @@ public class OneRangePartitionEvaluator
.build();
Map<Expression, ColumnRange> mergedRange = exprs.stream()
.map(expr -> Pair.of(expr, mergeFunction.apply(leftRanges.get(expr), rightRanges.get(expr))))
.map(expr -> Pair.of(expr, mergeFunction.apply(
leftRanges.containsKey(expr) ? leftRanges.get(expr) : rangeMap.get(expr),
rightRanges.containsKey(expr) ? rightRanges.get(expr) : rangeMap.get(expr))))
.collect(ImmutableMap.toImmutableMap(Pair::key, Pair::value));
return new EvaluateRangeResult(originResult, mergedRange, ImmutableList.of(left, right));
}
@ -821,17 +816,6 @@ public class OneRangePartitionEvaluator
return onePartitionInputs;
}
private EvaluateRangeResult removeEmptyRange(EvaluateRangeResult result) {
ImmutableMap.Builder<Expression, ColumnRange> builder = ImmutableMap.builder();
for (Map.Entry<Expression, ColumnRange> entry : result.columnRanges.entrySet()) {
if (entry.getValue().isEmptyRange()) {
continue;
}
builder.put(entry);
}
return new EvaluateRangeResult(result.result, builder.build(), result.childrenResult);
}
private EvaluateRangeResult computeMonotonicFunctionRange(EvaluateRangeResult result) {
Monotonic func = (Monotonic) result.result;
if (rangeMap.containsKey(func)) {