| 1 | #include <Functions/FunctionFactory.h> |
|---|---|
| 2 | #include <Functions/FunctionBinaryArithmetic.h> |
| 3 | #include <DataTypes/NumberTraits.h> |
| 4 | |
| 5 | |
| 6 | namespace DB |
| 7 | { |
| 8 | namespace ErrorCodes |
| 9 | { |
| 10 | extern const int BAD_CAST; |
| 11 | } |
| 12 | |
| 13 | /// Working with UInt8: last bit = can be true, previous = can be false (Like dbms/src/Storages/MergeTree/BoolMask.h). |
| 14 | /// This function provides "OR" operation for BoolMasks. |
| 15 | /// Returns: "can be true" = A."can be true" OR B."can be true" |
| 16 | /// "can be false" = A."can be false" AND B."can be false" |
| 17 | template <typename A, typename B> |
| 18 | struct BitBoolMaskOrImpl |
| 19 | { |
| 20 | using ResultType = UInt8; |
| 21 | |
| 22 | template <typename Result = ResultType> |
| 23 | static inline Result apply(A left, B right) |
| 24 | { |
| 25 | if constexpr (!std::is_same_v<A, ResultType> || !std::is_same_v<B, ResultType>) |
| 26 | throw DB::Exception("It's a bug! Only UInt8 type is supported by __bitBoolMaskOr.", ErrorCodes::BAD_CAST); |
| 27 | return static_cast<ResultType>( |
| 28 | ((static_cast<ResultType>(left) | static_cast<ResultType>(right)) & 1) |
| 29 | | ((((static_cast<ResultType>(left) >> 1) & (static_cast<ResultType>(right) >> 1)) & 1) << 1)); |
| 30 | } |
| 31 | |
| 32 | #if USE_EMBEDDED_COMPILER |
| 33 | static constexpr bool compilable = false; |
| 34 | |
| 35 | #endif |
| 36 | }; |
| 37 | |
| 38 | struct NameBitBoolMaskOr { static constexpr auto name = "__bitBoolMaskOr"; }; |
| 39 | using FunctionBitBoolMaskOr = FunctionBinaryArithmetic<BitBoolMaskOrImpl, NameBitBoolMaskOr>; |
| 40 | |
| 41 | void registerFunctionBitBoolMaskOr(FunctionFactory & factory) |
| 42 | { |
| 43 | factory.registerFunction<FunctionBitBoolMaskOr>(); |
| 44 | } |
| 45 | |
| 46 | } |
| 47 |