This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 90a4dd09f36 [Fix](func) CoreDump and Result Error in percentile
function (#36647)
90a4dd09f36 is described below
commit 90a4dd09f36f1e7a6dfa6b5d686444f8b07804ff
Author: HappenLee <[email protected]>
AuthorDate: Fri Jun 21 23:42:45 2024 +0800
[Fix](func) CoreDump and Result Error in percentile function (#36647)
cherry pick #36643
---
.../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 ++
5 files changed, 21 insertions(+), 8 deletions(-)
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 b89c273dd77..0f24aef6dbb 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
@@ -366,7 +366,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<ColumnVector<Float64>&>(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 d85b69516a8..31ab925ca6c 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;
@@ -35,8 +34,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(BigIntType.INSTANCE,
DoubleType.INSTANCE)
@@ -46,14 +45,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
@@ -70,7 +73,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 bde1ae61660..6037d7b7057 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
@@ -246,7 +246,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]