From f909f82ccd82c1b69d81d57f565ff9839a874ddf Mon Sep 17 00:00:00 2001 From: zhangstar333 Date: Thu, 14 Nov 2024 14:59:03 +0800 Subject: [PATCH] [optimization](agg) add float/double type in agg percentile_array --- .../aggregate_function_percentile.cpp | 2 +- .../functions/agg/PercentileArray.java | 5 +++++ .../test_aggregate_percentile_no_cast.out | 3 +++ .../test_aggregate_percentile_no_cast.groovy | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/be/src/vec/aggregate_functions/aggregate_function_percentile.cpp b/be/src/vec/aggregate_functions/aggregate_function_percentile.cpp index bb4e1bd81e3db0..40b94168bf108f 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_percentile.cpp +++ b/be/src/vec/aggregate_functions/aggregate_function_percentile.cpp @@ -66,7 +66,7 @@ void register_aggregate_function_percentile(AggregateFunctionSimpleFactory& fact creator_with_numeric_type::creator); factory.register_function_both( "percentile_array", - creator_with_integer_type::creator); + creator_with_numeric_type::creator); } void register_percentile_approx_old_function(AggregateFunctionSimpleFactory& factory) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java index b4d7467e4c00b7..bf189d67e89b0b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java @@ -27,6 +27,7 @@ import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BigIntType; import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; import org.apache.doris.nereids.types.IntegerType; import org.apache.doris.nereids.types.LargeIntType; import org.apache.doris.nereids.types.SmallIntType; @@ -45,6 +46,10 @@ public class PercentileArray extends AggregateFunction implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNotNullable { public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) + .args(DoubleType.INSTANCE, ArrayType.of(DoubleType.INSTANCE)), + FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) + .args(FloatType.INSTANCE, ArrayType.of(DoubleType.INSTANCE)), FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) .args(LargeIntType.INSTANCE, ArrayType.of(DoubleType.INSTANCE)), FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) diff --git a/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.out b/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.out index 1764ba21ddeb8b..296589ed425c72 100644 --- a/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.out +++ b/regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.out @@ -34,3 +34,6 @@ 5 29.0 29.0 29.0 [29, 29, 29] 6 101.0 101.0 101.0 [101, 101, 101] +-- !select -- +[19.5, 24.25, 101.325] + diff --git a/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.groovy b/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.groovy index ef76aee4405a7e..a7f382abe2175e 100644 --- a/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.groovy +++ b/regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.groovy @@ -94,4 +94,21 @@ suite("test_aggregate_percentile_no_cast") { sql "INSERT INTO percentile_test_db values(1,10), (2,8), (2,114) ,(3,10) ,(5,29) ,(6,101)" qt_select "select id,percentile(level,0.5) , percentile(level,0.55) , percentile(level,0.805) , percentile_array(level,[0.5,0.55,0.805])from percentile_test_db group by id order by id" + sql "DROP TABLE IF EXISTS percentile_test_db2" + sql """ + CREATE TABLE IF NOT EXISTS percentile_test_db2 ( + id int, + level double + ) + DISTRIBUTED BY HASH(id) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ) + """ + explain { + sql("""select percentile_array(level,[0.5,0.55,0.805])from percentile_test_db2;""") + notContains("cast") + } + sql "INSERT INTO percentile_test_db2 values(1,10.1), (2,8.2), (2,114.3) ,(3,10.4) ,(5,29.5) ,(6,101.6)" + qt_select "select percentile_array(level,[0.5,0.55,0.805])from percentile_test_db2;" }