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

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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 4c7af570e25 [Fix](func) CoreDump and Result Error in percentile 
function #36643 (#36648)
4c7af570e25 is described below

commit 4c7af570e25a19656f7dec1218c4c0b529905ac0
Author: HappenLee <happen...@hotmail.com>
AuthorDate: Sun Jun 23 13:25:49 2024 +0800

    [Fix](func) CoreDump and Result Error in percentile function #36643 (#36648)
---
 .../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 0fffbb994a6..634feb59779 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_percentile_approx.h
@@ -365,7 +365,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 b6a0b3c6ad5..9fda83ad47c 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
@@ -204,7 +204,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 b1af7ea2297..3b126c11714 100644
--- a/regression-test/data/nereids_function_p0/agg_function/agg.out
+++ b/regression-test/data/nereids_function_p0/agg_function/agg.out
@@ -2708,6 +2708,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 0def72db777..4742a187acd 100644
--- a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
+++ b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
@@ -1503,6 +1503,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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to