You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/02/08 16:32:37 UTC
[doris] 09/12: [fix](planner) npe in RewriteBinaryPredicatesRule (#16401)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 443649111070b7dc990d670c23d902623cfcfa81
Author: minghong <en...@gmail.com>
AuthorDate: Wed Feb 8 15:57:35 2023 +0800
[fix](planner) npe in RewriteBinaryPredicatesRule (#16401)
RewriteBinaryPredicatesRule rewrite expression like
`cast(A decimal) > decimal` to `A > some_other_bigint`
in order to:
1. push down the rewrite predicate
2. avoid convert column A to decimal
We get the datatype of `A` by `expr0.getSrcSlotRef().getColumn().getType()`.
However, when A is result of a function from sub-query, this rule is not applicable.
For example:
```
select *
from (
select TIMESTAMPDIFF(MINUTE,startTime,endTime) AS timediff
from CNC_SliceSate) T
where timediff > 5.0;
```
we cannot push predicate down to OlapScan(CNC_SliceSate) to save effort.
---
.../doris/rewrite/RewriteBinaryPredicatesRule.java | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteBinaryPredicatesRule.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteBinaryPredicatesRule.java
index 32c4e3597b..ba86efa138 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteBinaryPredicatesRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteBinaryPredicatesRule.java
@@ -64,9 +64,8 @@ public class RewriteBinaryPredicatesRule implements ExprRewriteRule {
* 11) "select * from T where t1> 2.0" is converted to "select * from T where t1> 2"
* 12) "select * from T where t1> 2.1" is converted to "select * from T where t1> 2"
*/
- private Expr rewriteBigintSlotRefCompareDecimalLiteral(Expr expr0, DecimalLiteral expr1,
+ private Expr rewriteBigintSlotRefCompareDecimalLiteral(Expr expr0, Type expr0ColumnType, DecimalLiteral expr1,
BinaryPredicate.Operator op) {
- Type columnType = expr0.getSrcSlotRef().getColumn().getType();
try {
// Convert childExpr to column type and compare the converted values. There are 3 possible situations:
// case 1. The value of childExpr exceeds the range of the column type, then castTo() will throw an
@@ -74,7 +73,7 @@ public class RewriteBinaryPredicatesRule implements ExprRewriteRule {
// case 2. childExpr is converted to column type, but the value of childExpr loses precision.
// For example, 2.1 is converted to 2;
// case 3. childExpr is precisely converted to column type. For example, 2.0 is converted to 2.
- LiteralExpr newExpr = (LiteralExpr) expr1.castTo(columnType);
+ LiteralExpr newExpr = (LiteralExpr) expr1.castTo(expr0ColumnType);
int compResult = expr1.compareLiteral(newExpr);
// case 2
if (compResult != 0) {
@@ -99,11 +98,11 @@ public class RewriteBinaryPredicatesRule implements ExprRewriteRule {
}
}
// case 3
- return new BinaryPredicate(op, expr0.castTo(columnType), newExpr);
+ return new BinaryPredicate(op, expr0.castTo(expr0ColumnType), newExpr);
} catch (AnalysisException e) {
// case 1
- IntLiteral colTypeMinValue = IntLiteral.createMinValue(columnType);
- IntLiteral colTypeMaxValue = IntLiteral.createMaxValue(columnType);
+ IntLiteral colTypeMinValue = IntLiteral.createMinValue(expr0ColumnType);
+ IntLiteral colTypeMaxValue = IntLiteral.createMaxValue(expr0ColumnType);
if (op == Operator.NE || ((expr1).compareLiteral(colTypeMinValue) < 0 && (op == Operator.GE
|| op == Operator.GT)) || ((expr1).compareLiteral(colTypeMaxValue) > 0 && (op == Operator.LE
|| op == Operator.LT))) {
@@ -123,8 +122,10 @@ public class RewriteBinaryPredicatesRule implements ExprRewriteRule {
Expr expr1 = expr.getChild(1);
if (expr0 instanceof CastExpr && (expr0.getType() == Type.DECIMALV2 || expr0.getType().isDecimalV3())
&& expr0.getChild(0) instanceof SlotRef
- && expr0.getChild(0).getType().getResultType() == Type.BIGINT && expr1 instanceof DecimalLiteral) {
- return rewriteBigintSlotRefCompareDecimalLiteral(expr0, (DecimalLiteral) expr1, op);
+ && expr0.getChild(0).getType().getResultType() == Type.BIGINT
+ && expr1 instanceof DecimalLiteral) {
+ return rewriteBigintSlotRefCompareDecimalLiteral(expr0,
+ expr0.getChild(0).getType(), (DecimalLiteral) expr1, op);
}
return expr;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org