ClickHouse

Форк
0
/
moduloOrZero.cpp 
49 строк · 1.3 Кб
1
#include <Functions/FunctionFactory.h>
2
#include <Functions/FunctionBinaryArithmetic.h>
3

4

5
namespace DB
6
{
7
namespace
8
{
9

10
template <typename A, typename B>
11
struct ModuloOrZeroImpl
12
{
13
    using ResultType = typename NumberTraits::ResultOfModulo<A, B>::Type;
14
    static const constexpr bool allow_fixed_string = false;
15
    static const constexpr bool allow_string_integer = false;
16

17
    template <typename Result = ResultType>
18
    static inline Result apply(A a, B b)
19
    {
20
        if constexpr (std::is_floating_point_v<ResultType>)
21
        {
22
            /// This computation is similar to `fmod` but the latter is not inlined and has 40 times worse performance.
23
            return ResultType(a) - trunc(ResultType(a) / ResultType(b)) * ResultType(b);
24
        }
25
        else
26
        {
27
            if (unlikely(divisionLeadsToFPE(a, b)))
28
                return 0;
29

30
            return ModuloImpl<A, B>::template apply<Result>(a, b);
31
        }
32
    }
33

34
#if USE_EMBEDDED_COMPILER
35
    static constexpr bool compilable = false; /// TODO implement the checks
36
#endif
37
};
38

39
struct NameModuloOrZero { static constexpr auto name = "moduloOrZero"; };
40
using FunctionModuloOrZero = BinaryArithmeticOverloadResolver<ModuloOrZeroImpl, NameModuloOrZero>;
41

42
}
43

44
REGISTER_FUNCTION(ModuloOrZero)
45
{
46
    factory.registerFunction<FunctionModuloOrZero>();
47
}
48

49
}
50

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.