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]

Reply via email to