diff --git a/cpp/src/arrow/util/bitmap_ops.cc b/cpp/src/arrow/util/bitmap_ops.cc index cc24146ae94..d93a7545a96 100644 --- a/cpp/src/arrow/util/bitmap_ops.cc +++ b/cpp/src/arrow/util/bitmap_ops.cc @@ -329,6 +329,25 @@ bool OptionalBitmapEquals(const std::shared_ptr& left, int64_t left_offs right ? right->data() : nullptr, right_offset, length); } +Result> OptionalBitmapAnd(MemoryPool* pool, + const std::shared_ptr& left, + int64_t left_offset, + const std::shared_ptr& right, + int64_t right_offset, int64_t length, + int64_t out_offset) { + if (left == nullptr && right == nullptr) { + return nullptr; + } + if (left == nullptr) { + return CopyBitmap(pool, right->data(), right_offset, length, out_offset); + } + if (right == nullptr) { + return CopyBitmap(pool, left->data(), left_offset, length, out_offset); + } + return BitmapAnd(pool, left->data(), left_offset, right->data(), right_offset, length, + out_offset); +} + namespace { template