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