This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new d58aafb32d1 branch-3.0: [fix](Nereids) simplify comparison predicate 
do wrong cast #44054 (#44107)
d58aafb32d1 is described below

commit d58aafb32d1a21c78d39f400dcbd44d8c1ba2869
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Nov 18 14:01:05 2024 +0800

    branch-3.0: [fix](Nereids) simplify comparison predicate do wrong cast 
#44054 (#44107)
    
    Cherry-picked from #44054
    
    Co-authored-by: morrySnow <zhangwen...@selectdb.com>
---
 .../expression/rules/SimplifyComparisonPredicate.java     | 15 +++++++--------
 .../expression/rules/SimplifyComparisonPredicateTest.java | 12 ++++++++++++
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
index cc1694575ec..cb617958652 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
@@ -229,15 +229,15 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule i
             left = cast.child();
             DecimalV3Literal literal = (DecimalV3Literal) right;
             if (left.getDataType().isDecimalV3Type()) {
-                if (((DecimalV3Type) left.getDataType())
-                        .getScale() < ((DecimalV3Type) 
literal.getDataType()).getScale()) {
+                DecimalV3Type leftType = (DecimalV3Type) left.getDataType();
+                DecimalV3Type literalType = (DecimalV3Type) 
literal.getDataType();
+                if (leftType.getScale() < literalType.getScale()) {
                     int toScale = ((DecimalV3Type) 
left.getDataType()).getScale();
                     if (comparisonPredicate instanceof EqualTo) {
                         try {
                             return 
TypeCoercionUtils.processComparisonPredicate((ComparisonPredicate)
-                                    comparisonPredicate.withChildren(left,
-                                            new 
DecimalV3Literal((DecimalV3Type) left.getDataType(),
-                                                    
literal.getValue().setScale(toScale, RoundingMode.UNNECESSARY))));
+                                    comparisonPredicate.withChildren(left, new 
DecimalV3Literal(
+                                            
literal.getValue().setScale(toScale, RoundingMode.UNNECESSARY))));
                         } catch (ArithmeticException e) {
                             if (left.nullable()) {
                                 // TODO: the ideal way is to return an If expr 
like:
@@ -255,9 +255,8 @@ public class SimplifyComparisonPredicate extends 
AbstractExpressionRewriteRule i
                     } else if (comparisonPredicate instanceof NullSafeEqual) {
                         try {
                             return 
TypeCoercionUtils.processComparisonPredicate((ComparisonPredicate)
-                                    comparisonPredicate.withChildren(left,
-                                            new 
DecimalV3Literal((DecimalV3Type) left.getDataType(),
-                                                    
literal.getValue().setScale(toScale, RoundingMode.UNNECESSARY))));
+                                    comparisonPredicate.withChildren(left, new 
DecimalV3Literal(
+                                            
literal.getValue().setScale(toScale, RoundingMode.UNNECESSARY))));
                         } catch (ArithmeticException e) {
                             return BooleanLiteral.of(false);
                         }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
index 402594d6861..84ebd7c7250 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicateTest.java
@@ -279,5 +279,17 @@ class SimplifyComparisonPredicateTest extends 
ExpressionRewriteTestHelper {
                 rewrittenExpression.child(0).getDataType());
         Assertions.assertInstanceOf(DecimalV3Literal.class, 
rewrittenExpression.child(1));
         Assertions.assertEquals(new BigDecimal("12.35"), ((DecimalV3Literal) 
rewrittenExpression.child(1)).getValue());
+
+        // left's child range smaller than right literal
+        leftChild = new DecimalV3Literal(new BigDecimal("1234.12"));
+        left = new Cast(leftChild, DecimalV3Type.createDecimalV3Type(10, 5));
+        right = new DecimalV3Literal(new BigDecimal("12345.12000"));
+        expression = new EqualTo(left, right);
+        rewrittenExpression = executor.rewrite(expression, context);
+        Assertions.assertInstanceOf(Cast.class, rewrittenExpression.child(0));
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(7, 2),
+                rewrittenExpression.child(0).getDataType());
+        Assertions.assertInstanceOf(DecimalV3Literal.class, 
rewrittenExpression.child(1));
+        Assertions.assertEquals(new BigDecimal("12345.12"), 
((DecimalV3Literal) rewrittenExpression.child(1)).getValue());
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to