#include #include #include namespace DB { namespace ErrorCodes { extern const int BAD_CAST; } /// Working with UInt8: last bit = can be true, previous = can be false (Like dbms/src/Storages/MergeTree/BoolMask.h). /// This function provides "OR" operation for BoolMasks. /// Returns: "can be true" = A."can be true" OR B."can be true" /// "can be false" = A."can be false" AND B."can be false" template struct BitBoolMaskOrImpl { using ResultType = UInt8; static const constexpr bool allow_fixed_string = false; template static inline Result apply(A left, B right) { if constexpr (!std::is_same_v || !std::is_same_v) throw DB::Exception("It's a bug! Only UInt8 type is supported by __bitBoolMaskOr.", ErrorCodes::BAD_CAST); return static_cast( ((static_cast(left) | static_cast(right)) & 1) | ((((static_cast(left) >> 1) & (static_cast(right) >> 1)) & 1) << 1)); } #if USE_EMBEDDED_COMPILER static constexpr bool compilable = false; #endif }; struct NameBitBoolMaskOr { static constexpr auto name = "__bitBoolMaskOr"; }; using FunctionBitBoolMaskOr = FunctionBinaryArithmetic; void registerFunctionBitBoolMaskOr(FunctionFactory & factory) { factory.registerFunction(); } }