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

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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 574a278e3ed [fix](Nereids) adjust min/max stats for cast function if 
types are comparable (#28166) (#38458)
574a278e3ed is described below

commit 574a278e3eda222f16e4b78415b351e055ff6c30
Author: minghong <[email protected]>
AuthorDate: Tue Jul 30 07:18:39 2024 +0800

    [fix](Nereids) adjust min/max stats for cast function if types are 
comparable (#28166) (#38458)
    
    pick from #28166
    
    estimate column stats for "cast(col, XXXType)"
    
    -----cast-est------
    query4 41169 40335 40267 40267
    query58 463 361 401 361
    Total cold run time: 41632 ms
    Total hot run time: 40628 ms
    
    ----master------
    query4 40624 40180 40299 40180
    query58 487 389 420 389
    Total cold run time: 41111 ms
    Total hot run time: 40569 ms
    
    ## Proposed changes
    
    Issue Number: close #xxx
    
    <!--Describe your changes.-->
---
 .../org/apache/doris/analysis/DecimalLiteral.java  |  2 +-
 .../org/apache/doris/analysis/FloatLiteral.java    |  2 +-
 .../java/org/apache/doris/analysis/IntLiteral.java |  2 +-
 .../org/apache/doris/analysis/LargeIntLiteral.java |  2 +-
 .../NumericLiteralExpr.java}                       | 29 +++++++---------------
 .../doris/nereids/stats/ExpressionEstimation.java  | 13 ++--------
 .../trees/expressions/literal/DecimalLiteral.java  |  2 +-
 .../expressions/literal/DecimalV3Literal.java      |  2 +-
 .../trees/expressions/literal/DoubleLiteral.java   |  2 +-
 .../trees/expressions/literal/FloatLiteral.java    |  2 +-
 ...egerLikeLiteral.java => FractionalLiteral.java} | 20 +++++----------
 .../expressions/literal/IntegerLikeLiteral.java    |  2 +-
 ...IntegerLikeLiteral.java => NumericLiteral.java} | 20 +++++----------
 .../doris/nereids/stats/FilterEstimationTest.java  |  4 ++-
 14 files changed, 35 insertions(+), 69 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
index afbe6c0c6cd..2d70117a1a4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
@@ -41,7 +41,7 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Objects;
 
-public class DecimalLiteral extends LiteralExpr {
+public class DecimalLiteral extends NumericLiteralExpr {
     private static final Logger LOG = 
LogManager.getLogger(DecimalLiteral.class);
     private BigDecimal value;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
index 2eabd21c01f..a64e5d9050b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
@@ -35,7 +35,7 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.text.NumberFormat;
 
-public class FloatLiteral extends LiteralExpr {
+public class FloatLiteral extends NumericLiteralExpr {
     private double value;
 
     public FloatLiteral() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
index 25f8ab753b2..476d63c982f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
@@ -38,7 +38,7 @@ import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
-public class IntLiteral extends LiteralExpr {
+public class IntLiteral extends NumericLiteralExpr {
     private static final Logger LOG = LogManager.getLogger(IntLiteral.class);
 
     public static final long TINY_INT_MIN = Byte.MIN_VALUE; // -2^7 ~ 2^7 - 1
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
index c72889b94b2..ff46e2d7952 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
@@ -38,7 +38,7 @@ import java.nio.ByteOrder;
 import java.util.Objects;
 
 // large int for the num that native types can not
-public class LargeIntLiteral extends LiteralExpr {
+public class LargeIntLiteral extends NumericLiteralExpr {
     private static final Logger LOG = 
LogManager.getLogger(LargeIntLiteral.class);
 
     // -2^127
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
 b/fe/fe-core/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java
similarity index 59%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java
index 9f8a08a00f5..31cde22078f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java
@@ -14,29 +14,18 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
+// This file is copied from
+// 
https://github.com/apache/impala/blob/branch-2.9.0/fe/src/main/java/org/apache/impala/LiteralExpr.java
+// and modified by Doris
 
-package org.apache.doris.nereids.trees.expressions.literal;
+package org.apache.doris.analysis;
 
-import org.apache.doris.nereids.types.DataType;
-
-/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
-    /**
-     * Constructor for Literal.
-     *
-     * @param dataType logical data type in Nereids
-     */
-    public IntegerLikeLiteral(DataType dataType) {
-        super(dataType);
-    }
-
-    public int getIntValue() {
-        return getNumber().intValue();
+public abstract class NumericLiteralExpr extends LiteralExpr {
+    public NumericLiteralExpr() {
+        super();
     }
 
-    public long getLongValue() {
-        return getNumber().longValue();
+    public NumericLiteralExpr(NumericLiteralExpr other) {
+        super(other);
     }
-
-    public abstract Number getNumber();
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
index 8972a26b032..8d137ca8210 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
@@ -18,11 +18,7 @@
 package org.apache.doris.nereids.stats;
 
 import org.apache.doris.analysis.ArithmeticExpr.Operator;
-import org.apache.doris.analysis.DecimalLiteral;
-import org.apache.doris.analysis.FloatLiteral;
-import org.apache.doris.analysis.IntLiteral;
-import org.apache.doris.analysis.LargeIntLiteral;
-import org.apache.doris.analysis.LiteralExpr;
+import org.apache.doris.analysis.NumericLiteralExpr;
 import org.apache.doris.analysis.StringLiteral;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.Add;
@@ -224,7 +220,7 @@ public class ExpressionEstimation extends 
ExpressionVisitor<ColumnStatistic, Sta
             }
         }
         // cast numeric to numeric
-        if (isNumericLiteralExpr(colStats.minExpr) && 
isNumericLiteralExpr(colStats.maxExpr)) {
+        if (colStats.minExpr instanceof NumericLiteralExpr && colStats.maxExpr 
instanceof NumericLiteralExpr) {
             if (targetType.isNumericType()) {
                 return colStats;
             }
@@ -237,11 +233,6 @@ public class ExpressionEstimation extends 
ExpressionVisitor<ColumnStatistic, Sta
         return builder.build();
     }
 
-    private boolean isNumericLiteralExpr(LiteralExpr literal) {
-        return literal instanceof DecimalLiteral || literal instanceof 
FloatLiteral
-                || literal instanceof IntLiteral || literal instanceof 
LargeIntLiteral;
-    }
-
     @Override
     public ColumnStatistic visitLiteral(Literal literal, Statistics context) {
         if 
(ColumnStatistic.UNSUPPORTED_TYPE.contains(literal.getDataType().toCatalogDataType()))
 {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
index 1d0281796ba..ea198d947ae 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
@@ -31,7 +31,7 @@ import java.util.Objects;
 /**
  * decimal type literal
  */
-public class DecimalLiteral extends Literal {
+public class DecimalLiteral extends FractionalLiteral {
 
     private final BigDecimal value;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
index a7c9813fe5d..ce805273405 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
@@ -31,7 +31,7 @@ import java.util.Objects;
 /**
  * Literal for DecimalV3 Type
  */
-public class DecimalV3Literal extends Literal {
+public class DecimalV3Literal extends FractionalLiteral {
 
     private final BigDecimal value;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
index 92c0172ec49..33e9397f287 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
@@ -28,7 +28,7 @@ import java.text.NumberFormat;
 /**
  * Double literal
  */
-public class DoubleLiteral extends Literal {
+public class DoubleLiteral extends FractionalLiteral {
 
     private final double value;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
index f593743676d..c8150e56a02 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
@@ -27,7 +27,7 @@ import java.text.NumberFormat;
 /**
  * float type literal
  */
-public class FloatLiteral extends Literal {
+public class FloatLiteral extends FractionalLiteral {
 
     private final float value;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FractionalLiteral.java
similarity index 73%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FractionalLiteral.java
index 9f8a08a00f5..ac63225dc3b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FractionalLiteral.java
@@ -19,24 +19,16 @@ package org.apache.doris.nereids.trees.expressions.literal;
 
 import org.apache.doris.nereids.types.DataType;
 
-/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
+/**
+ * float/double/decimal
+ */
+public abstract class FractionalLiteral extends NumericLiteral {
     /**
-     * Constructor for Literal.
+     * Constructor for FractionalLiteral.
      *
      * @param dataType logical data type in Nereids
      */
-    public IntegerLikeLiteral(DataType dataType) {
+    public FractionalLiteral(DataType dataType) {
         super(dataType);
     }
-
-    public int getIntValue() {
-        return getNumber().intValue();
-    }
-
-    public long getLongValue() {
-        return getNumber().longValue();
-    }
-
-    public abstract Number getNumber();
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
index 9f8a08a00f5..54456bd9493 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
@@ -20,7 +20,7 @@ package org.apache.doris.nereids.trees.expressions.literal;
 import org.apache.doris.nereids.types.DataType;
 
 /** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
+public abstract class IntegerLikeLiteral extends NumericLiteral {
     /**
      * Constructor for Literal.
      *
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java
similarity index 73%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java
index 9f8a08a00f5..93b03e4fafa 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java
@@ -19,24 +19,16 @@ package org.apache.doris.nereids.trees.expressions.literal;
 
 import org.apache.doris.nereids.types.DataType;
 
-/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
+/**
+ * numeric literal
+ */
+public abstract class NumericLiteral extends Literal {
     /**
-     * Constructor for Literal.
+     * Constructor for NumericLiteral.
      *
      * @param dataType logical data type in Nereids
      */
-    public IntegerLikeLiteral(DataType dataType) {
+    public NumericLiteral(DataType dataType) {
         super(dataType);
     }
-
-    public int getIntValue() {
-        return getNumber().intValue();
-    }
-
-    public long getLongValue() {
-        return getNumber().longValue();
-    }
-
-    public abstract Number getNumber();
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
index de5e4bba877..d0f6b3da077 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
@@ -842,7 +842,9 @@ class FilterEstimationTest {
                 .setNdv(100)
                 .setAvgSizeByte(4)
                 .setNumNulls(0)
+                .setMaxExpr(new IntLiteral(100))
                 .setMaxValue(100)
+                .setMinExpr(new IntLiteral(0))
                 .setMinValue(0)
                 .setMaxExpr(new IntLiteral(100))
                 .setMinExpr(new IntLiteral(0))
@@ -856,7 +858,7 @@ class FilterEstimationTest {
         stats.addColumnStats(a, builder.build());
         FilterEstimation filterEstimation = new FilterEstimation();
         Statistics result = filterEstimation.estimate(and, stats);
-        Assertions.assertEquals(result.getRowCount(), 10, 0.01);
+        Assertions.assertEquals(10, result.getRowCount(), 0.01);
         ColumnStatistic colStats = result.findColumnStatistics(a);
         Assertions.assertTrue(colStats != null);
         Assertions.assertEquals(10, colStats.ndv, 0.1);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to