Fix bitmap null crash (#3042)
This commit is contained in:
@ -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<BitmapValue*>(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<BitmapValue*>(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<BitmapValue*>(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<BitmapValue*>(src.ptr);
|
||||
|
||||
@ -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<typename ValType, typename ValueType>
|
||||
|
||||
Reference in New Issue
Block a user