diff --git a/be/src/exprs/bloom_filter_func.h b/be/src/exprs/bloom_filter_func.h index 330c939819cce6..7713d18715287d 100644 --- a/be/src/exprs/bloom_filter_func.h +++ b/be/src/exprs/bloom_filter_func.h @@ -226,6 +226,8 @@ class BloomFilterFuncBase : public FilterFuncBase { virtual bool find_olap_engine(const void* data) const = 0; + virtual bool find_olap_engine_crc32(const void* data) const = 0; + virtual bool find_uint32_t(uint32_t data) const = 0; virtual void insert_fixed_len(const char* data, const int* offsets, int number) = 0; @@ -334,6 +336,11 @@ struct CommonFindOp { bool find_olap_engine(const BloomFilterAdaptor& bloom_filter, const void* data) const { return find(bloom_filter, data); } + + bool find_olap_engine_crc32(const BloomFilterAdaptor& bloom_filter, const void* data) const { + return find(bloom_filter, data); + } + bool find(const BloomFilterAdaptor& bloom_filter, uint32_t data) const { return bloom_filter.test(data); } @@ -396,6 +403,11 @@ struct StringFindOp { bool find_olap_engine(const BloomFilterAdaptor& bloom_filter, const void* data) const { return StringFindOp::find(bloom_filter, data); } + + bool find_olap_engine_crc32(const BloomFilterAdaptor& bloom_filter, const void* data) const { + return StringFindOp::find_crc32_hash(bloom_filter, data); + } + bool find(const BloomFilterAdaptor& bloom_filter, uint32_t data) const { return bloom_filter.test(data); } @@ -414,6 +426,17 @@ struct FixedStringFindOp : public StringFindOp { } return bloom_filter.test(Slice(value->data, size)); } + bool find_olap_engine_crc32(const BloomFilterAdaptor& bloom_filter, + const void* input_data) const { + const auto* value = reinterpret_cast(input_data); + int64_t size = value->size; + const char* data = value->data; + // CHAR type may pad the tail with \0, need to trim + while (size > 0 && data[size - 1] == '\0') { + size--; + } + return bloom_filter.test_new_hash(Slice(value->data, size)); + } }; struct DateTimeFindOp : public CommonFindOp { @@ -555,6 +578,10 @@ class BloomFilterFunc final : public BloomFilterFuncBase { return dummy.find_olap_engine(*_bloom_filter, data); } + bool find_olap_engine_crc32(const void* data) const override { + return dummy.find_olap_engine_crc32(*_bloom_filter, data); + } + bool find_uint32_t(uint32_t data) const override { return dummy.find(*_bloom_filter, data); } private: diff --git a/be/src/olap/bloom_filter_predicate.h b/be/src/olap/bloom_filter_predicate.h index d2816be9966dc3..0876f4e8788a7b 100644 --- a/be/src/olap/bloom_filter_predicate.h +++ b/be/src/olap/bloom_filter_predicate.h @@ -113,12 +113,13 @@ class BloomFilterColumnPredicate : public ColumnPredicate { for (uint16_t i = 0; i < size; i++) { uint16_t idx = is_dense_column ? i : sel[i]; if constexpr (is_nullable) { - if (!null_map[idx] && - _specific_filter->find_crc32_hash(get_cell_value(pred_col_data[idx]))) { + if (!null_map[idx] && _specific_filter->find_olap_engine_crc32( + get_cell_value(pred_col_data[idx]))) { sel[new_size++] = idx; } } else { - if (_specific_filter->find_crc32_hash(get_cell_value(pred_col_data[idx]))) { + if (_specific_filter->find_olap_engine_crc32( + get_cell_value(pred_col_data[idx]))) { sel[new_size++] = idx; } }