You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/05/22 14:51:29 UTC
[incubator-doris] 04/13: [fix] UT MathFunctionTest.round_test fix (#9447)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit 2cc31df3c53071226f1c2d5bce9c702c3f744bfa
Author: camby <10...@qq.com>
AuthorDate: Mon May 9 09:37:27 2022 +0800
[fix] UT MathFunctionTest.round_test fix (#9447)
Function round support two format round(double) and round(double, int), the argument is variadic.
But FunctionBinaryArithmetic not support variadic argument now, make get_function for round(double, int) failed.
reproduce steps:
1. set enable_vectorized_engine=true;
2. try to call round(double, int);
```
> select round(10.12345,2);
ERROR 1105 (HY000): errCode = 2, detailMessage = Function round is not implemented
```
---
be/src/vec/functions/function_binary_arithmetic.h | 30 ++++++++++++++---------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/be/src/vec/functions/function_binary_arithmetic.h b/be/src/vec/functions/function_binary_arithmetic.h
index 74b7df4260..ad3ad38bdf 100644
--- a/be/src/vec/functions/function_binary_arithmetic.h
+++ b/be/src/vec/functions/function_binary_arithmetic.h
@@ -58,19 +58,20 @@ struct ModuloImpl;
template <template <typename, typename> typename Operation>
struct OperationTraits {
using T = UInt8;
- static constexpr bool is_plus_minus = std::is_same_v<Operation<T, T>, PlusImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, MinusImpl<T, T>>;
- static constexpr bool is_multiply = std::is_same_v<Operation<T, T>, MultiplyImpl<T, T>>;
- static constexpr bool is_division = std::is_same_v<Operation<T, T>, DivideFloatingImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, DivideIntegralImpl<T, T>>;
+ using Op = Operation<T, T>;
+ static constexpr bool is_plus_minus =
+ std::is_same_v<Op, PlusImpl<T, T>> || std::is_same_v<Op, MinusImpl<T, T>>;
+ static constexpr bool is_multiply = std::is_same_v<Op, MultiplyImpl<T, T>>;
+ static constexpr bool is_division = std::is_same_v<Op, DivideFloatingImpl<T, T>> ||
+ std::is_same_v<Op, DivideIntegralImpl<T, T>>;
static constexpr bool allow_decimal =
- std::is_same_v<Operation<T, T>, PlusImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, MinusImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, MultiplyImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, ModuloImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, DivideFloatingImpl<T, T>> ||
- std::is_same_v<Operation<T, T>, DivideIntegralImpl<T, T>>;
+ std::is_same_v<Op, PlusImpl<T, T>> || std::is_same_v<Op, MinusImpl<T, T>> ||
+ std::is_same_v<Op, MultiplyImpl<T, T>> || std::is_same_v<Op, ModuloImpl<T, T>> ||
+ std::is_same_v<Op, DivideFloatingImpl<T, T>> ||
+ std::is_same_v<Op, DivideIntegralImpl<T, T>>;
static constexpr bool can_overflow = is_plus_minus || is_multiply;
+ static constexpr bool has_variadic_argument =
+ !std::is_void_v<decltype(has_variadic_argument_types(std::declval<Op>()))>;
};
template <typename A, typename B, typename Op, typename ResultType = typename Op::ResultType>
@@ -756,6 +757,13 @@ public:
size_t get_number_of_arguments() const override { return 2; }
+ DataTypes get_variadic_argument_types_impl() const override {
+ if constexpr (OpTraits::has_variadic_argument) {
+ return OpTraits::Op::get_variadic_argument_types();
+ }
+ return {};
+ }
+
DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
DataTypePtr type_res;
bool valid = cast_both_types(
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org