From dfc7d04626b27e69cb0949295f71a5b701d9b994 Mon Sep 17 00:00:00 2001 From: zhangstar333 <87313068+zhangstar333@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:05:48 +0800 Subject: [PATCH] [fix](functions) add quantile_state_empty function signature (#25306) --- .../vec/functions/function_quantile_state.cpp | 4 +- .../doris/catalog/BuiltinScalarFunctions.java | 2 + .../functions/scalar/QuantileStateEmpty.java | 57 +++++++++++++++++++ .../visitor/ScalarFunctionVisitor.java | 5 ++ gensrc/script/doris_builtins_functions.py | 1 + .../types/complex_types/basic_agg_test.out | 6 ++ .../types/complex_types/basic_agg_test.groovy | 1 + 7 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/QuantileStateEmpty.java diff --git a/be/src/vec/functions/function_quantile_state.cpp b/be/src/vec/functions/function_quantile_state.cpp index ffc569caf1..6e02c3cdf7 100644 --- a/be/src/vec/functions/function_quantile_state.cpp +++ b/be/src/vec/functions/function_quantile_state.cpp @@ -195,8 +195,8 @@ public: block.get_by_position(arguments.back()).column); if (!percent_arg) { - LOG(FATAL) << fmt::format( - "Second argument to {} must be a constant string describing type", get_name()); + return Status::InternalError( + "Second argument to {} must be a constant float describing type", get_name()); } float percent_arg_value = percent_arg->get_value(); if (percent_arg_value < 0 || percent_arg_value > 1) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index 939218b33f..5035bcebc7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -286,6 +286,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.Pow; import org.apache.doris.nereids.trees.expressions.functions.scalar.Power; import org.apache.doris.nereids.trees.expressions.functions.scalar.Protocol; import org.apache.doris.nereids.trees.expressions.functions.scalar.QuantilePercent; +import org.apache.doris.nereids.trees.expressions.functions.scalar.QuantileStateEmpty; import org.apache.doris.nereids.trees.expressions.functions.scalar.Quarter; import org.apache.doris.nereids.trees.expressions.functions.scalar.Radians; import org.apache.doris.nereids.trees.expressions.functions.scalar.Random; @@ -693,6 +694,7 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(Power.class, "power"), scalar(Protocol.class, "protocol"), scalar(QuantilePercent.class, "quantile_percent"), + scalar(QuantileStateEmpty.class, "quantile_state_empty"), scalar(Quarter.class, "quarter"), scalar(Radians.class, "radians"), scalar(Random.class, "rand", "random"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/QuantileStateEmpty.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/QuantileStateEmpty.java new file mode 100644 index 0000000000..9907c87a27 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/QuantileStateEmpty.java @@ -0,0 +1,57 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.trees.expressions.functions.scalar; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.shape.LeafExpression; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.QuantileStateType; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * ScalarFunction 'quantile_state_empty'. + */ +public class QuantileStateEmpty extends ScalarFunction + implements LeafExpression, ExplicitlyCastableSignature, AlwaysNotNullable { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(QuantileStateType.INSTANCE).args() + ); + + /** + * constructor with 0 argument. + */ + public QuantileStateEmpty() { + super("quantile_state_empty"); + } + + @Override + public List getSignatures() { + return SIGNATURES; + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitQuantileStateEmpty(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java index 916d1f4778..230203ad09 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java @@ -279,6 +279,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.Pow; import org.apache.doris.nereids.trees.expressions.functions.scalar.Power; import org.apache.doris.nereids.trees.expressions.functions.scalar.Protocol; import org.apache.doris.nereids.trees.expressions.functions.scalar.QuantilePercent; +import org.apache.doris.nereids.trees.expressions.functions.scalar.QuantileStateEmpty; import org.apache.doris.nereids.trees.expressions.functions.scalar.Quarter; import org.apache.doris.nereids.trees.expressions.functions.scalar.Radians; import org.apache.doris.nereids.trees.expressions.functions.scalar.Random; @@ -1407,6 +1408,10 @@ public interface ScalarFunctionVisitor { return visitScalarFunction(quantilePercent, context); } + default R visitQuantileStateEmpty(QuantileStateEmpty quantileEmpty, C context) { + return visitScalarFunction(quantileEmpty, context); + } + default R visitQuarter(Quarter quarter, C context) { return visitScalarFunction(quarter, context); } diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 41c2e50d58..991caa9e53 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -1866,6 +1866,7 @@ visible_functions = { # quantile_function "quantile" : [ + [['quantile_state_empty'], 'QUANTILE_STATE', [], 'ALWAYS_NOT_NULLABLE'], [['to_quantile_state'], 'QUANTILE_STATE', ['DOUBLE', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'], [['quantile_percent'], 'DOUBLE', ['QUANTILE_STATE', 'FLOAT'], 'ALWAYS_NOT_NULLABLE'] ], diff --git a/regression-test/data/types/complex_types/basic_agg_test.out b/regression-test/data/types/complex_types/basic_agg_test.out index bdd9af2e39..7bde7a43da 100644 --- a/regression-test/data/types/complex_types/basic_agg_test.out +++ b/regression-test/data/types/complex_types/basic_agg_test.out @@ -28,3 +28,9 @@ 1 -1.0 2 0.5 3 1.0 + +-- !sql_quantile_state_percent2 -- +1 \N -1.0 +2 \N 0.5 +3 \N 1.0 + diff --git a/regression-test/suites/types/complex_types/basic_agg_test.groovy b/regression-test/suites/types/complex_types/basic_agg_test.groovy index 6133a09031..278b8dc8cd 100644 --- a/regression-test/suites/types/complex_types/basic_agg_test.groovy +++ b/regression-test/suites/types/complex_types/basic_agg_test.groovy @@ -35,4 +35,5 @@ suite("basic_agg_test", "types") { qt_sql_quantile_state """select * from quantile_state_basic_agg;""" qt_sql_quantile_state_percent """select k1, quantile_percent(quantile_union(k2), 0.5) from quantile_state_basic_agg group by k1 order by k1;""" + qt_sql_quantile_state_percent2 """ select k1, quantile_state_empty(), quantile_percent(quantile_union(k2),0.5) from quantile_state_basic_agg group by k1 order by k1; """ }