diff --git a/be/src/vec/data_types/data_type_bitmap.h b/be/src/vec/data_types/data_type_bitmap.h index fcabd75e6aa165..55fa4dadb54024 100644 --- a/be/src/vec/data_types/data_type_bitmap.h +++ b/be/src/vec/data_types/data_type_bitmap.h @@ -27,6 +27,8 @@ class DataTypeBitMap : public IDataType { DataTypeBitMap() = default; ~DataTypeBitMap() = default; + using FieldType = BitmapValue; + std::string doGetName() const override { return getFamilyName(); } const char* getFamilyName() const override { return "BitMap"; } @@ -66,4 +68,14 @@ class DataTypeBitMap : public IDataType { ErrorCodes::NOT_IMPLEMENTED); } }; + +template +struct is_complex : std::false_type {}; + +template <> +struct is_complex : std::true_type {}; + +template +constexpr bool is_complex_v = is_complex::value; + } // namespace doris::vectorized diff --git a/be/src/vec/functions/function_bitmap.cpp b/be/src/vec/functions/function_bitmap.cpp index c40eabb2a46f49..1123402b123800 100644 --- a/be/src/vec/functions/function_bitmap.cpp +++ b/be/src/vec/functions/function_bitmap.cpp @@ -53,12 +53,42 @@ struct ToBitmapImpl { return Status::OK(); } }; -// using FunctionToBitmap = FunctionBitmap; + +// B00LEAN BITMAP_CONTAINS(BITMAP bitmap, BIGINT input) +// B00LEAN BITMAP_HAS_ANY(BITMAP lhs, BITMAP rhs) +// BITMAP BITMAP_OR(BITMAP lhs, BITMAP rhs) +// BITMAP BITMAP_XOR(BITMAP lhs, BITMAP rhs) +// BITMAP BITMAP_NOT(BITMAP lhs, BITMAP rhs) +// BITMAP BITMAP_XOR(BITMAP lhs, BITMAP rhs) + +struct NameBitmapAnd { + static constexpr auto name = "bitmap_and"; +}; + +template +struct BitmapAnd { + using ResultDataType = DataTypeBitMap; + using T0 = typename LeftDataType::FieldType; + using T1 = typename RightDataType::FieldType; + using TData = std::vector; + + static Status vector_vector(const TData& lvec, const TData& rvec, TData& res) { + int size = lvec.size(); + for (int i = 0; i < size; ++i) { + res[i] = lvec[i]; + res[i] &= rvec[i]; + } + return Status::OK(); + } +}; using FunctionToBitmap = FunctionUnaryToType; +using FunctionBitmapAnd = + FunctionBinaryToType; void registerFunctionBitmap(SimpleFunctionFactory& factory) { factory.registerFunction(); + factory.registerFunction(); } } // namespace doris::vectorized diff --git a/be/src/vec/functions/function_totype.h b/be/src/vec/functions/function_totype.h index af52d7e0073824..c7fa17932acfbd 100644 --- a/be/src/vec/functions/function_totype.h +++ b/be/src/vec/functions/function_totype.h @@ -22,6 +22,8 @@ #include "vec/columns/column_vector.h" #include "vec/data_types/data_type.h" #include "vec/data_types/data_type_bitmap.h" +#include "vec/data_types/data_type_number.h" +#include "vec/functions/cast_type_to_either.h" #include "vec/functions/function.h" namespace doris::vectorized { @@ -65,4 +67,62 @@ class FunctionUnaryToType : public IFunction { getName())); } }; + +template typename Impl, typename Name> +class FunctionBinaryToType : public IFunction { + +public: + static constexpr auto name = Name::name; + static FunctionPtr create() { return std::make_shared(); } + String getName() const override { return name; } + size_t getNumberOfArguments() const override { return 2; } + DataTypePtr getReturnTypeImpl(const DataTypes& arguments) const override { + using ResultDataType = typename Impl::ResultDataType; + return std::make_shared(); + } + + bool useDefaultImplementationForConstants() const override { return true; } + + Status executeImpl(Block& block, const ColumnNumbers& arguments, size_t result, + size_t /*input_rows_count*/) override { + DCHECK_EQ(arguments.size(), 2); + const auto& left = block.getByPosition(arguments[0]); + const auto& right = block.getByPosition(arguments[1]); + const auto& left_type = left.type; + const auto& right_type = left.type; + + using ResultDataType = typename Impl::ResultDataType; + + using T0 = typename LeftDataType::FieldType; + using T1 = typename RightDataType::FieldType; + using ResultType = typename ResultDataType::FieldType; + + using ColVecLeft = std::conditional_t, ColumnComplexType, + ColumnVector>; + using ColVecRight = std::conditional_t, ColumnComplexType, + ColumnVector>; + + using ColVecResult = std::conditional_t, + ColumnComplexType, + ColumnVector>; + + + typename ColVecResult::MutablePtr col_res = nullptr; + + col_res = ColVecResult::create(); + auto& vec_res = col_res->getData(); + vec_res.resize(block.rows()); + + if (auto col_left = checkAndGetColumn(left.column.get())) { + if (auto col_right = checkAndGetColumn(right.column.get())) { + Impl::vector_vector(col_left->getData(), col_right->getData(), + vec_res); + block.getByPosition(result).column = std::move(col_res); + } + } + + return Status::OK(); + } +}; + } // namespace doris::vectorized diff --git a/be/src/vec/sink/result_sink.cpp b/be/src/vec/sink/result_sink.cpp index 8f9e83a57d2a0b..4c3fc4b810a273 100644 --- a/be/src/vec/sink/result_sink.cpp +++ b/be/src/vec/sink/result_sink.cpp @@ -101,7 +101,7 @@ Status ResultSink::send(RuntimeState* state, Block* block) { } Status ResultSink::close(RuntimeState* state, Status exec_status) { - if (_closed) { + if (_closed || _writer == nullptr|| _sender == nullptr) { return Status::OK(); } diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 3186e841f16331..e1b0fbcbb03bdb 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -813,7 +813,7 @@ [['bitmap_not'], 'BITMAP', ['BITMAP','BITMAP'], '_ZN5doris15BitmapFunctions10bitmap_notEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'], [['bitmap_and'], 'BITMAP', ['BITMAP','BITMAP'], - '_ZN5doris15BitmapFunctions10bitmap_andEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'], + '_ZN5doris15BitmapFunctions10bitmap_andEPN9doris_udf15FunctionContextERKNS1_9StringValES6_', 'vec'], [['bitmap_to_string'], 'VARCHAR', ['BITMAP'], '_ZN5doris15BitmapFunctions16bitmap_to_stringEPN9doris_udf15FunctionContextERKNS1_9StringValE'], [['bitmap_from_string'], 'BITMAP', ['VARCHAR'],