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

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


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 64e19f5fb17 branch-3.1: [fix](statistics) fix estimate non nullable 
#53089 (#53356)
64e19f5fb17 is described below

commit 64e19f5fb17f3091eaff05eb8d536f9a7b1bc567
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Jul 16 14:49:09 2025 +0800

    branch-3.1: [fix](statistics) fix estimate non nullable #53089 (#53356)
    
    Cherry-picked from #53089
    
    Co-authored-by: yujun <[email protected]>
---
 .../doris/nereids/stats/ExpressionEstimation.java  |  8 ++++++++
 .../expressions/functions/scalar/NonNullable.java  |  6 ++++++
 .../expressions/visitor/ScalarFunctionVisitor.java |  5 +++++
 .../nereids/stats/ExpressionEstimationTest.java    | 22 ++++++++++++++++++++++
 4 files changed, 41 insertions(+)

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 10c45c0b157..cbb88c8cfa4 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
@@ -72,6 +72,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsAdd;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsDiff;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsSub;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Negative;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NonNullable;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Quarter;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Radians;
@@ -281,6 +282,13 @@ public class ExpressionEstimation extends 
ExpressionVisitor<ColumnStatistic, Sta
         return context.findColumnStatistics(slotReference);
     }
 
+    @Override
+    public ColumnStatistic visitNonNullable(NonNullable nonNullable, 
Statistics context) {
+        ColumnStatistic childColStats = nonNullable.child().accept(this, 
context);
+        ColumnStatisticBuilder builder = new 
ColumnStatisticBuilder(childColStats);
+        return builder.setNumNulls(0).build();
+    }
+
     @Override
     public ColumnStatistic visitBinaryArithmetic(BinaryArithmetic 
binaryArithmetic, Statistics context) {
         ColumnStatistic leftColStats = binaryArithmetic.left().accept(this, 
context);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NonNullable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NonNullable.java
index f008058c76d..58f80c8b3ba 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NonNullable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NonNullable.java
@@ -22,6 +22,7 @@ import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DataType;
 
 import com.google.common.base.Preconditions;
@@ -37,6 +38,11 @@ public class NonNullable extends ScalarFunction implements 
UnaryExpression, Cust
         super("non_nullable", expr);
     }
 
+    @Override
+    public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+        return visitor.visitNonNullable(this, context);
+    }
+
     @Override
     public FunctionSignature customSignature() {
         DataType dataType = getArgument(0).getDataType();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
index c7b9ffe9b82..0c49e99362f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
@@ -330,6 +330,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Negative;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.NextDay;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.NgramSearch;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NonNullable;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.NormalCdf;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.NotNullOrEmpty;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Now;
@@ -2368,4 +2369,8 @@ public interface ScalarFunctionVisitor<R, C> {
     default R visitGetVariantType(GetVariantType getVariantType, C context) {
         return visitScalarFunction(getVariantType, context);
     }
+
+    default R visitNonNullable(NonNullable nonNullable, C context) {
+        return visitScalarFunction(nonNullable, context);
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/ExpressionEstimationTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/ExpressionEstimationTest.java
index 39ff8a10d4c..db3ca58ee70 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/ExpressionEstimationTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/ExpressionEstimationTest.java
@@ -31,6 +31,7 @@ import org.apache.doris.nereids.trees.expressions.WhenClause;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Max;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Min;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.If;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NonNullable;
 import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
@@ -395,6 +396,27 @@ class ExpressionEstimationTest {
         Assertions.assertEquals(est.avgSizeByte, 16);
     }
 
+    @Test
+    public void testNonNullable() {
+        SlotReference a = new SlotReference("a", StringType.INSTANCE);
+        Map<Expression, ColumnStatistic> slotToColumnStat = new HashMap<>();
+        ColumnStatisticBuilder builder = new ColumnStatisticBuilder()
+                .setNdv(100)
+                .setMinExpr(new StringLiteral("2020-01-01"))
+                .setMinValue(20200101000000.0)
+                .setMaxExpr(new StringLiteral("2021abcdefg"))
+                .setNumNulls(10)
+                .setMaxValue(20210101000000.0);
+        slotToColumnStat.put(a, builder.build());
+        Statistics stats = new Statistics(1000, slotToColumnStat);
+
+        ColumnStatistic est = ExpressionEstimation.estimate(a, stats);
+        Assertions.assertEquals(10, est.numNulls);
+
+        est = ExpressionEstimation.estimate(new NonNullable(a), stats);
+        Assertions.assertEquals(0, est.numNulls);
+    }
+
     @Test
     public void testLiteral() {
         Statistics stats = new Statistics(1000, new HashMap<>());


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

Reply via email to