This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 0b18ce05578 [fix](FixedString) fix type char error when be 
config::enable_low_cardinality_optimize = false #28376
0b18ce05578 is described below

commit 0b18ce055788582bfc2c14bd3bb11fea13e55efc
Author: Mryange <[email protected]>
AuthorDate: Fri Dec 15 09:23:50 2023 +0800

    [fix](FixedString) fix type char error when be 
config::enable_low_cardinality_optimize = false #28376
---
 be/src/exprs/bloom_filter_func.h     | 27 +++++++++++++++++++++++++++
 be/src/olap/bloom_filter_predicate.h |  7 ++++---
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/be/src/exprs/bloom_filter_func.h b/be/src/exprs/bloom_filter_func.h
index 330c939819c..7713d187152 100644
--- a/be/src/exprs/bloom_filter_func.h
+++ b/be/src/exprs/bloom_filter_func.h
@@ -226,6 +226,8 @@ public:
 
     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<const StringRef*>(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<vectorized::VecDateTimeValue> {
@@ -555,6 +578,10 @@ public:
         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 d2816be9966..0876f4e8788 100644
--- a/be/src/olap/bloom_filter_predicate.h
+++ b/be/src/olap/bloom_filter_predicate.h
@@ -113,12 +113,13 @@ private:
             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;
                     }
                 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to