This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 8f6a0ee18b0 [fix](statistics) fix estimate non nullable (#53089)
8f6a0ee18b0 is described below
commit 8f6a0ee18b00df07cd0ce5d5f5be279a9e3a1793
Author: yujun <[email protected]>
AuthorDate: Mon Jul 14 14:26:40 2025 +0800
[fix](statistics) fix estimate non nullable (#53089)
---
.../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 e0779970784..215bab9d065 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;
@@ -280,6 +281,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 f0a9fca0be2..35cdd99ad9e 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
@@ -340,6 +340,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;
@@ -2455,4 +2456,8 @@ public interface ScalarFunctionVisitor<R, C> {
default R visitUncompress(Uncompress uncompress, C context) {
return visitScalarFunction(uncompress, 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]