1#include <Functions/FunctionFactory.h>
2#include <Functions/FunctionBinaryArithmetic.h>
3#include <DataTypes/NumberTraits.h>
4
5
6namespace 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