[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 ```
This commit is contained in:
@ -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(
|
||||
|
||||
Reference in New Issue
Block a user