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]