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]

Reply via email to