diff --git a/be/src/exprs/bitmap_function.cpp b/be/src/exprs/bitmap_function.cpp index dda07e3788..09fdd14c50 100644 --- a/be/src/exprs/bitmap_function.cpp +++ b/be/src/exprs/bitmap_function.cpp @@ -269,7 +269,6 @@ void BitmapFunctions::bitmap_update_int(FunctionContext* ctx, const T& src, Stri if (src.is_null) { return; } - auto dst_bitmap = reinterpret_cast(dst->ptr); dst_bitmap->add(src.val); } @@ -282,12 +281,18 @@ BigIntVal BitmapFunctions::bitmap_finalize(FunctionContext* ctx, const StringVal } BigIntVal BitmapFunctions::bitmap_get_value(FunctionContext* ctx, const StringVal& src) { + if (src.is_null) { + return 0; + } auto src_bitmap = reinterpret_cast(src.ptr); BigIntVal result(src_bitmap->cardinality()); return result; } void BitmapFunctions::bitmap_union(FunctionContext* ctx, const StringVal& src, StringVal* dst) { + if (src.is_null) { + return; + } auto dst_bitmap = reinterpret_cast(dst->ptr); // zero size means the src input is a agg object if (src.len == 0) { @@ -298,6 +303,9 @@ void BitmapFunctions::bitmap_union(FunctionContext* ctx, const StringVal& src, S } BigIntVal BitmapFunctions::bitmap_count(FunctionContext* ctx, const StringVal& src) { + if (src.is_null) { + return 0; + } // zero size means the src input is a agg object if (src.len == 0) { auto bitmap = reinterpret_cast(src.ptr); diff --git a/be/test/exprs/bitmap_function_test.cpp b/be/test/exprs/bitmap_function_test.cpp index c1bf245129..16239d9e60 100644 --- a/be/test/exprs/bitmap_function_test.cpp +++ b/be/test/exprs/bitmap_function_test.cpp @@ -138,6 +138,9 @@ TEST_F(BitmapFunctionsTest, bitmap_get_value) { BigIntVal finalize_result = BitmapFunctions::bitmap_finalize(ctx, dst); ASSERT_EQ(result, finalize_result); + + BigIntVal null_bitmap = BitmapFunctions::bitmap_get_value(ctx, StringVal::null()); + ASSERT_EQ(BigIntVal(0), null_bitmap); } @@ -159,6 +162,9 @@ TEST_F(BitmapFunctionsTest, bitmap_union) { StringVal src4 = convert_bitmap_to_string(ctx, bitmap3); BitmapFunctions::bitmap_union(ctx, src4, &dst); + StringVal src5 = StringVal::null(); + BitmapFunctions::bitmap_union(ctx, src5, &dst); + StringVal serialized = BitmapFunctions::bitmap_serialize(ctx, dst); BigIntVal result = BitmapFunctions::bitmap_count(ctx, serialized); @@ -175,6 +181,9 @@ TEST_F(BitmapFunctionsTest, bitmap_count) { BigIntVal result = BitmapFunctions::bitmap_count(ctx, bitmap_str); BigIntVal expected(3); ASSERT_EQ(expected, result); + + BigIntVal null_bitmap = BitmapFunctions::bitmap_count(ctx, StringVal::null()); + ASSERT_EQ(BigIntVal(0), null_bitmap); } template