This is an automated email from the ASF dual-hosted git repository.
lihaopeng 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 0e98c28d99c [Fix](func) CoreDump and Result Error in percentile
function (#36643)
0e98c28d99c is described below
commit 0e98c28d99cd73ba613daabdac2d69bc1cf14610
Author: HappenLee <[email protected]>
AuthorDate: Fri Jun 21 20:01:37 2024 +0800
[Fix](func) CoreDump and Result Error in percentile function (#36643)
## Proposed changes
Beforeļ¼
```
select percentile(kbint, 0.6) from fn_test where kbint > 100;
+----------------------------------------+
| percentile(kbint, cast(0.6 as DOUBLE)) |
+----------------------------------------+
| 0 |
+----------------------------------------+
```
After:
```
select percentile(kbint, 0.6) from fn_test where kbint > 100;
+----------------------------------------+
| percentile(kbint, cast(0.6 as DOUBLE)) |
+----------------------------------------+
| NULL |
+----------------------------------------+
```
<!--Describe your changes.-->
---
.../aggregate_function_percentile.h | 2 +-
.../aggregate_function_percentile_approx.h | 2 +-
.../trees/expressions/functions/agg/Percentile.java | 20 ++++++++++++++------
.../visitor/AggregateFunctionVisitor.java | 2 +-
.../data/nereids_function_p0/agg_function/agg.out | 3 +++
.../nereids_function_p0/agg_function/agg.groovy | 2 ++
6 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/be/src/vec/aggregate_functions/aggregate_function_percentile.h
b/be/src/vec/aggregate_functions/aggregate_function_percentile.h
index f11fb094cde..c6b4515a804 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_percentile.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_percentile.h
@@ -438,7 +438,7 @@ struct PercentileState {
inited_flag = false;
}
- double get() const { return vec_counts[0].terminate(vec_quantile[0]); }
+ double get() const { return vec_counts.empty() ? 0 :
vec_counts[0].terminate(vec_quantile[0]); }
void insert_result_into(IColumn& to) const {
auto& column_data = assert_cast<ColumnFloat64&>(to).get_data();
diff --git
a/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
b/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
index 7d742ca6d0d..e73b71e9c9b 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
@@ -133,7 +133,7 @@ struct OldPercentileState {
inited_flag = false;
}
- double get() const { return vec_counts[0].terminate(vec_quantile[0]); }
+ double get() const { return vec_counts.empty() ? 0 :
vec_counts[0].terminate(vec_quantile[0]); }
void insert_result_into(IColumn& to) const {
auto& column_data = assert_cast<ColumnFloat64&>(to).get_data();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java
index abc0498f6e1..d8328baadf7 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java
@@ -21,7 +21,6 @@ import org.apache.doris.catalog.FunctionSignature;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Expression;
import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BigIntType;
@@ -39,8 +38,8 @@ import java.util.List;
/**
* AggregateFunction 'percentile'. This class is generated by GenerateFunction.
*/
-public class Percentile extends AggregateFunction
- implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullable {
+public class Percentile extends NullableAggregateFunction
+ implements BinaryExpression, ExplicitlyCastableSignature {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(DoubleType.INSTANCE).args(LargeIntType.INSTANCE,
DoubleType.INSTANCE),
@@ -55,14 +54,18 @@ public class Percentile extends AggregateFunction
* constructor with 2 arguments.
*/
public Percentile(Expression arg0, Expression arg1) {
- super("percentile", arg0, arg1);
+ this(false, arg0, arg1);
}
/**
* constructor with 2 arguments.
*/
public Percentile(boolean distinct, Expression arg0, Expression arg1) {
- super("percentile", distinct, arg0, arg1);
+ this(distinct, false, arg0, arg1);
+ }
+
+ public Percentile(boolean distinct, boolean alwaysNullable, Expression
arg0, Expression arg1) {
+ super("percentile", distinct, alwaysNullable, arg0, arg1);
}
@Override
@@ -79,7 +82,12 @@ public class Percentile extends AggregateFunction
@Override
public Percentile withDistinctAndChildren(boolean distinct,
List<Expression> children) {
Preconditions.checkArgument(children.size() == 2);
- return new Percentile(distinct, children.get(0), children.get(1));
+ return new Percentile(distinct, alwaysNullable, children.get(0),
children.get(1));
+ }
+
+ @Override
+ public NullableAggregateFunction withAlwaysNullable(boolean
alwaysNullable) {
+ return new Percentile(distinct, alwaysNullable, children.get(0),
children.get(1));
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
index 38af4be08a8..9a2593b8a8d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
@@ -247,7 +247,7 @@ public interface AggregateFunctionVisitor<R, C> {
}
default R visitPercentile(Percentile percentile, C context) {
- return visitAggregateFunction(percentile, context);
+ return visitNullableAggregateFunction(percentile, context);
}
default R visitPercentileApprox(PercentileApprox percentileApprox, C
context) {
diff --git a/regression-test/data/nereids_function_p0/agg_function/agg.out
b/regression-test/data/nereids_function_p0/agg_function/agg.out
index f4ab7943a8d..8bbe343ccb0 100644
--- a/regression-test/data/nereids_function_p0/agg_function/agg.out
+++ b/regression-test/data/nereids_function_p0/agg_function/agg.out
@@ -2855,6 +2855,9 @@
-- !sql_percentile_BigInt_Double --
7.6
+-- !sql_percentile_Null_Empty --
+\N
+
-- !sql_percentile_BigInt_Double_agg_phase_1 --
0 \N
1 1.0
diff --git a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
index bdc524c4091..ba4ee172517 100644
--- a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
+++ b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
@@ -1580,6 +1580,8 @@ suite("nereids_agg_fn") {
select percentile(kbint, 0.6) from fn_test group by kbool order
by kbool'''
qt_sql_percentile_BigInt_Double '''
select percentile(kbint, 0.6) from fn_test'''
+ qt_sql_percentile_Null_Empty '''
+ select percentile(1, 0.6) from fn_test where kbint > 100;'''
qt_sql_percentile_BigInt_Double_agg_phase_1 '''
select count(id), percentile(kbint, 0.6) from fn_test group by
id order by id'''
qt_sql_percentile_BigInt_Double_agg_phase_2 '''
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]