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

gabriellee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 551c2a26a2a [refactor](field) Use Field to replace StringRef (#60253)
551c2a26a2a is described below

commit 551c2a26a2a2f06f8e3fa98135ccae490e63a762
Author: Gabriel <[email protected]>
AuthorDate: Tue Feb 3 14:16:47 2026 +0800

    [refactor](field) Use Field to replace StringRef (#60253)
---
 be/src/exec/olap_common.h                          |  24 +-
 be/src/olap/comparison_predicate.h                 | 151 ++++++----
 be/src/olap/delete_handler.cpp                     |  55 ++--
 be/src/olap/in_list_predicate.h                    |  77 +++--
 be/src/olap/predicate_creator.h                    | 139 ++++-----
 be/src/pipeline/exec/file_scan_operator.cpp        |   5 +-
 be/src/pipeline/exec/file_scan_operator.h          |   2 +-
 be/src/pipeline/exec/mock_scan_operator.h          |   5 +-
 be/src/pipeline/exec/olap_scan_operator.cpp        |   5 +-
 be/src/pipeline/exec/olap_scan_operator.h          |   2 +-
 be/src/pipeline/exec/scan_operator.cpp             |  94 +++----
 be/src/pipeline/exec/scan_operator.h               |   6 +-
 be/src/runtime/runtime_predicate.cpp               | 113 +-------
 be/src/runtime/runtime_predicate.h                 |   8 +-
 be/src/runtime/type_limit.h                        |   6 +
 be/test/olap/block_column_predicate_test.cpp       | 310 +++++++++++++--------
 be/test/olap/date_bloom_filter_test.cpp            |   6 +-
 .../vec/exec/format/parquet/parquet_expr_test.cpp  |  40 ++-
 18 files changed, 531 insertions(+), 517 deletions(-)

diff --git a/be/src/exec/olap_common.h b/be/src/exec/olap_common.h
index 91e6e5f8231..da1ed516eaa 100644
--- a/be/src/exec/olap_common.h
+++ b/be/src/exec/olap_common.h
@@ -99,9 +99,8 @@ std::string cast_to_string(T value, int scale) {
 template <PrimitiveType primitive_type>
 class ColumnValueRange {
 public:
-    using CppType =
-            std::conditional_t<primitive_type == TYPE_HLL || 
is_string_type(primitive_type),
-                               StringRef, typename 
PrimitiveTypeTraits<primitive_type>::CppType>;
+    using CppType = std::conditional_t<primitive_type == TYPE_HLL, StringRef,
+                                       typename 
PrimitiveTypeTraits<primitive_type>::CppType>;
     using SetType = std::set<CppType, doris::Less<CppType>>;
     using IteratorType = typename SetType::iterator;
 
@@ -216,21 +215,21 @@ public:
     int scale() const { return _scale; }
 
     static void add_fixed_value_range(ColumnValueRange<primitive_type>& range, 
SQLFilterOp op,
-                                      const CppType* value) {
-        static_cast<void>(range.add_fixed_value(*value));
+                                      const CppType& value) {
+        static_cast<void>(range.add_fixed_value(value));
     }
 
     static void remove_fixed_value_range(ColumnValueRange<primitive_type>& 
range, SQLFilterOp op,
-                                         const CppType* value) {
-        range.remove_fixed_value(*value);
+                                         const CppType& value) {
+        range.remove_fixed_value(value);
     }
 
     static void empty_function(ColumnValueRange<primitive_type>& range, 
SQLFilterOp op,
-                               const CppType* value) {}
+                               const CppType& value) {}
 
     static void add_value_range(ColumnValueRange<primitive_type>& range, 
SQLFilterOp op,
-                                const CppType* value) {
-        static_cast<void>(range.add_range(op, *value));
+                                const CppType& value) {
+        static_cast<void>(range.add_range(op, value));
     }
 
     static ColumnValueRange<primitive_type> 
create_empty_column_value_range(bool is_nullable_col,
@@ -821,9 +820,8 @@ template <PrimitiveType primitive_type>
 Status OlapScanKeys::extend_scan_key(ColumnValueRange<primitive_type>& range,
                                      int32_t max_scan_key_num, bool* 
exact_value, bool* eos,
                                      bool* should_break) {
-    using CppType =
-            std::conditional_t<primitive_type == TYPE_HLL || 
is_string_type(primitive_type),
-                               StringRef, typename 
PrimitiveTypeTraits<primitive_type>::CppType>;
+    using CppType = std::conditional_t<primitive_type == TYPE_HLL, StringRef,
+                                       typename 
PrimitiveTypeTraits<primitive_type>::CppType>;
     using ConstIterator = typename 
ColumnValueRange<primitive_type>::SetType::const_iterator;
 
     // 1. clear ScanKey if some column range is empty
diff --git a/be/src/olap/comparison_predicate.h 
b/be/src/olap/comparison_predicate.h
index feae988edd8..cf3a4dce6ba 100644
--- a/be/src/olap/comparison_predicate.h
+++ b/be/src/olap/comparison_predicate.h
@@ -34,11 +34,11 @@ template <PrimitiveType Type, PredicateType PT>
 class ComparisonPredicateBase final : public ColumnPredicate {
 public:
     ENABLE_FACTORY_CREATOR(ComparisonPredicateBase);
-    using T = std::conditional_t<is_string_type(Type), StringRef,
-                                 typename PrimitiveTypeTraits<Type>::CppType>;
-    ComparisonPredicateBase(uint32_t column_id, std::string col_name, const T& 
value,
-                            bool opposite = false)
-            : ColumnPredicate(column_id, col_name, Type, opposite), 
_value(value) {}
+    using T = typename PrimitiveTypeTraits<Type>::CppType;
+    ComparisonPredicateBase(uint32_t column_id, std::string col_name,
+                            const vectorized::Field& value, bool opposite = 
false)
+            : ColumnPredicate(column_id, col_name, Type, opposite),
+              _value(value.template get<Type>()) {}
     ComparisonPredicateBase(const ComparisonPredicateBase<Type, PT>& other, 
uint32_t col_id)
             : ColumnPredicate(other, col_id), _value(other._value) {}
     ComparisonPredicateBase(const ComparisonPredicateBase<Type, PT>& other) = 
delete;
@@ -139,22 +139,29 @@ public:
             return false;
         }
 
-        T tmp_min_value = get_zone_map_value<Type, 
T>(statistic.first->cell_ptr());
-        T tmp_max_value = get_zone_map_value<Type, 
T>(statistic.second->cell_ptr());
+        using CompareType = typename std::conditional<is_string_type(Type), 
StringRef, T>::type;
+        auto tmp_min_value = get_zone_map_value<Type, 
CompareType>(statistic.first->cell_ptr());
+        auto tmp_max_value = get_zone_map_value<Type, 
CompareType>(statistic.second->cell_ptr());
+        CompareType tmp_value;
+        if constexpr (is_string_type(Type)) {
+            tmp_value = StringRef(_value.data(), _value.size());
+        } else {
+            tmp_value = _value;
+        }
 
         if constexpr (PT == PredicateType::EQ) {
-            return _operator(Compare::less_equal(tmp_min_value, _value) &&
-                                     Compare::greater_equal(tmp_max_value, 
_value),
+            return _operator(Compare::less_equal(tmp_min_value, tmp_value) &&
+                                     Compare::greater_equal(tmp_max_value, 
tmp_value),
                              true);
         } else if constexpr (PT == PredicateType::NE) {
-            return _operator(
-                    Compare::equal(tmp_min_value, _value) && 
Compare::equal(tmp_max_value, _value),
-                    true);
+            return _operator(Compare::equal(tmp_min_value, tmp_value) &&
+                                     Compare::equal(tmp_max_value, tmp_value),
+                             true);
         } else if constexpr (PT == PredicateType::LT || PT == 
PredicateType::LE) {
-            return _operator(tmp_min_value, _value);
+            return _operator(tmp_min_value, tmp_value);
         } else {
             static_assert(PT == PredicateType::GT || PT == PredicateType::GE);
-            return _operator(tmp_max_value, _value);
+            return _operator(tmp_max_value, tmp_value);
         }
     }
 
@@ -168,17 +175,8 @@ public:
      */
 
     bool camp_field(const vectorized::Field& min_field, const 
vectorized::Field& max_field) const {
-        T min_value;
-        T max_value;
-        if constexpr (is_string_type(Type)) {
-            auto& tmp_min = min_field.template get<Type>();
-            auto& tmp_max = max_field.template get<Type>();
-            min_value = StringRef(tmp_min.data(), tmp_min.size());
-            max_value = StringRef(tmp_max.data(), tmp_max.size());
-        } else {
-            min_value = min_field.template get<Type>();
-            max_value = max_field.template get<Type>();
-        }
+        T min_value = min_field.template get<Type>();
+        T max_value = max_field.template get<Type>();
 
         if constexpr (PT == PredicateType::EQ) {
             return Compare::less_equal(min_value, _value) &&
@@ -259,17 +257,24 @@ public:
             return false;
         }
 
-        T tmp_min_value = get_zone_map_value<Type, 
T>(statistic.first->cell_ptr());
-        T tmp_max_value = get_zone_map_value<Type, 
T>(statistic.second->cell_ptr());
+        using CompareType = typename std::conditional<is_string_type(Type), 
StringRef, T>::type;
+        auto tmp_min_value = get_zone_map_value<Type, 
CompareType>(statistic.first->cell_ptr());
+        auto tmp_max_value = get_zone_map_value<Type, 
CompareType>(statistic.second->cell_ptr());
+        CompareType tmp_value;
+        if constexpr (is_string_type(Type)) {
+            tmp_value = StringRef(_value.data(), _value.size());
+        } else {
+            tmp_value = _value;
+        }
 
         if constexpr (PT == PredicateType::LT) {
-            return _value > tmp_max_value;
+            return tmp_value > tmp_max_value;
         } else if constexpr (PT == PredicateType::LE) {
-            return _value >= tmp_max_value;
+            return tmp_value >= tmp_max_value;
         } else if constexpr (PT == PredicateType::GT) {
-            return _value < tmp_min_value;
+            return tmp_value < tmp_min_value;
         } else if constexpr (PT == PredicateType::GE) {
-            return _value <= tmp_min_value;
+            return tmp_value <= tmp_min_value;
         }
 
         return false;
@@ -280,18 +285,25 @@ public:
             return false;
         }
 
-        T tmp_min_value = get_zone_map_value<Type, 
T>(statistic.first->cell_ptr());
-        T tmp_max_value = get_zone_map_value<Type, 
T>(statistic.second->cell_ptr());
+        using CompareType = typename std::conditional<is_string_type(Type), 
StringRef, T>::type;
+        auto tmp_min_value = get_zone_map_value<Type, 
CompareType>(statistic.first->cell_ptr());
+        auto tmp_max_value = get_zone_map_value<Type, 
CompareType>(statistic.second->cell_ptr());
+        CompareType tmp_value;
+        if constexpr (is_string_type(Type)) {
+            tmp_value = StringRef(_value.data(), _value.size());
+        } else {
+            tmp_value = _value;
+        }
 
         if constexpr (PT == PredicateType::EQ) {
-            return tmp_min_value == _value && tmp_max_value == _value;
+            return tmp_min_value == tmp_value && tmp_max_value == tmp_value;
         } else if constexpr (PT == PredicateType::NE) {
-            return tmp_min_value > _value || tmp_max_value < _value;
+            return tmp_min_value > tmp_value || tmp_max_value < tmp_value;
         } else if constexpr (PT == PredicateType::LT || PT == 
PredicateType::LE) {
-            return _operator(tmp_max_value, _value);
+            return _operator(tmp_max_value, tmp_value);
         } else {
             static_assert(PT == PredicateType::GT || PT == PredicateType::GE);
-            return _operator(tmp_min_value, _value);
+            return _operator(tmp_min_value, tmp_value);
         }
     }
 
@@ -301,8 +313,8 @@ public:
             if (bf->is_ngram_bf()) {
                 return true;
             }
-            if constexpr (std::is_same_v<T, StringRef>) {
-                return bf->test_bytes(_value.data, _value.size);
+            if constexpr (is_string_type(Type)) {
+                return bf->test_bytes(_value.data(), _value.size());
             } else {
                 // DecimalV2 using decimal12_t in bloom filter, should convert 
value to decimal12_t
                 if constexpr (Type == PrimitiveType::TYPE_DECIMALV2) {
@@ -330,7 +342,7 @@ public:
     }
 
     bool evaluate_and(const StringRef* dict_words, const size_t count) const 
override {
-        if constexpr (std::is_same_v<T, StringRef>) {
+        if constexpr (is_string_type(Type)) {
             for (size_t i = 0; i != count; ++i) {
                 if (_operator(dict_words[i], _value) ^ _opposite) {
                     return true;
@@ -370,9 +382,9 @@ public:
             } else if constexpr (Type == PrimitiveType::TYPE_DOUBLE) {
                 // DOUBLE -> hash as double
                 return test_bytes(_value);
-            } else if constexpr (std::is_same_v<T, StringRef>) {
+            } else if constexpr (is_string_type(Type)) {
                 // VARCHAR/STRING -> hash bytes
-                return bf->test_bytes(_value.data, _value.size);
+                return bf->test_bytes(_value.data(), _value.size());
             } else {
                 // Unsupported types: return true (accept)
                 return true;
@@ -422,7 +434,7 @@ public:
                                            .get_data();
 
             if (nested_column.is_column_dictionary()) {
-                if constexpr (std::is_same_v<T, StringRef>) {
+                if constexpr (is_string_type(Type)) {
                     const auto* dict_column_ptr =
                             
vectorized::check_and_get_column<vectorized::ColumnDictI32>(
                                     nested_column);
@@ -456,7 +468,7 @@ public:
             }
         } else {
             if (column.is_column_dictionary()) {
-                if constexpr (std::is_same_v<T, StringRef>) {
+                if constexpr (is_string_type(Type)) {
                     const auto* dict_column_ptr =
                             
vectorized::check_and_get_column<vectorized::ColumnDictI32>(column);
                     auto dict_code = 
_find_code_from_dictionary_column(*dict_column_ptr);
@@ -533,18 +545,34 @@ private:
 
     template <typename LeftT, typename RightT>
     bool _operator(const LeftT& lhs, const RightT& rhs) const {
-        if constexpr (PT == PredicateType::EQ) {
-            return Compare::equal(lhs, rhs);
-        } else if constexpr (PT == PredicateType::NE) {
-            return Compare::not_equal(lhs, rhs);
-        } else if constexpr (PT == PredicateType::LT) {
-            return Compare::less(lhs, rhs);
-        } else if constexpr (PT == PredicateType::LE) {
-            return Compare::less_equal(lhs, rhs);
-        } else if constexpr (PT == PredicateType::GT) {
-            return Compare::greater(lhs, rhs);
-        } else if constexpr (PT == PredicateType::GE) {
-            return Compare::greater_equal(lhs, rhs);
+        if constexpr (std::is_same_v<std::string, RightT> && 
!std::is_same_v<LeftT, RightT>) {
+            if constexpr (PT == PredicateType::EQ) {
+                return Compare::equal(lhs, StringRef(rhs.data(), rhs.size()));
+            } else if constexpr (PT == PredicateType::NE) {
+                return Compare::not_equal(lhs, StringRef(rhs.data(), 
rhs.size()));
+            } else if constexpr (PT == PredicateType::LT) {
+                return Compare::less(lhs, StringRef(rhs.data(), rhs.size()));
+            } else if constexpr (PT == PredicateType::LE) {
+                return Compare::less_equal(lhs, StringRef(rhs.data(), 
rhs.size()));
+            } else if constexpr (PT == PredicateType::GT) {
+                return Compare::greater(lhs, StringRef(rhs.data(), 
rhs.size()));
+            } else if constexpr (PT == PredicateType::GE) {
+                return Compare::greater_equal(lhs, StringRef(rhs.data(), 
rhs.size()));
+            }
+        } else {
+            if constexpr (PT == PredicateType::EQ) {
+                return Compare::equal(lhs, rhs);
+            } else if constexpr (PT == PredicateType::NE) {
+                return Compare::not_equal(lhs, rhs);
+            } else if constexpr (PT == PredicateType::LT) {
+                return Compare::less(lhs, rhs);
+            } else if constexpr (PT == PredicateType::LE) {
+                return Compare::less_equal(lhs, rhs);
+            } else if constexpr (PT == PredicateType::GT) {
+                return Compare::greater(lhs, rhs);
+            } else if constexpr (PT == PredicateType::GE) {
+                return Compare::greater_equal(lhs, rhs);
+            }
         }
     }
 
@@ -621,7 +649,7 @@ private:
     void _base_evaluate_bit(const vectorized::IColumn* column, const uint8_t* 
null_map,
                             const uint16_t* sel, uint16_t size, bool* flags) 
const {
         if (column->is_column_dictionary()) {
-            if constexpr (std::is_same_v<T, StringRef>) {
+            if constexpr (is_string_type(Type)) {
                 const auto* dict_column_ptr =
                         
vectorized::check_and_get_column<vectorized::ColumnDictI32>(column);
                 const auto* data_array = dict_column_ptr->get_data().data();
@@ -647,7 +675,7 @@ private:
     uint16_t _base_evaluate(const vectorized::IColumn* column, const uint8_t* 
null_map,
                             uint16_t* sel, uint16_t size) const {
         if (column->is_column_dictionary()) {
-            if constexpr (std::is_same_v<T, StringRef>) {
+            if constexpr (is_string_type(Type)) {
                 const auto* dict_column_ptr =
                         
vectorized::check_and_get_column<vectorized::ColumnDictI32>(column);
                 const auto& pred_col = dict_column_ptr->get_data();
@@ -691,14 +719,17 @@ private:
 
     int32_t __attribute__((flatten))
     _find_code_from_dictionary_column(const vectorized::ColumnDictI32& column) 
const {
+        static_assert(is_string_type(Type),
+                      "Only string type predicate can use dictionary column.");
         int32_t code = 0;
         if (_segment_id_to_cached_code.if_contains(
                     column.get_rowset_segment_id(),
                     [&code](const auto& pair) { code = pair.second; })) {
             return code;
         }
-        code = _is_range() ? column.find_code_by_bound(_value, _is_greater(), 
_is_eq())
-                           : column.find_code(_value);
+        code = _is_range() ? 
column.find_code_by_bound(StringRef(_value.data(), _value.size()),
+                                                       _is_greater(), _is_eq())
+                           : column.find_code(StringRef(_value.data(), 
_value.size()));
         // Sometimes the dict is not initialized when run comparison predicate 
here, for example,
         // the full page is null, then the reader will skip read, so that the 
dictionary is not
         // inited. The cached code is wrong during this case, because the 
following page maybe not
diff --git a/be/src/olap/delete_handler.cpp b/be/src/olap/delete_handler.cpp
index 3044b6e2d95..ab85af0bed2 100644
--- a/be/src/olap/delete_handler.cpp
+++ b/be/src/olap/delete_handler.cpp
@@ -248,32 +248,31 @@ Status convert(const vectorized::DataTypePtr& data_type, 
const std::list<std::st
     case PType: {                                                              
                   \
         typename PrimitiveTypeTraits<PType>::CppType tmp;                      
                   \
         RETURN_IF_ERROR(convert<PType>(type, res.value_str.front(), arena, 
tmp));                 \
-        v.data = reinterpret_cast<const char*>(&tmp);                          
                   \
-        v.size = sizeof(tmp);                                                  
                   \
+        v = vectorized::Field::create_field<PType>(tmp);                       
                   \
         switch (res.condition_op) {                                            
                   \
         case PredicateType::EQ:                                                
                   \
-            predicate = create_comparison_predicate0<PredicateType::EQ>(index, 
col_name, type, v, \
-                                                                        true, 
arena);             \
+            predicate = create_comparison_predicate<PredicateType::EQ>(index, 
col_name, type, v,  \
+                                                                       true);  
                   \
             return Status::OK();                                               
                   \
         case PredicateType::NE:                                                
                   \
-            predicate = create_comparison_predicate0<PredicateType::NE>(index, 
col_name, type, v, \
-                                                                        true, 
arena);             \
+            predicate = create_comparison_predicate<PredicateType::NE>(index, 
col_name, type, v,  \
+                                                                       true);  
                   \
             return Status::OK();                                               
                   \
         case PredicateType::GT:                                                
                   \
-            predicate = create_comparison_predicate0<PredicateType::GT>(index, 
col_name, type, v, \
-                                                                        true, 
arena);             \
+            predicate = create_comparison_predicate<PredicateType::GT>(index, 
col_name, type, v,  \
+                                                                       true);  
                   \
             return Status::OK();                                               
                   \
         case PredicateType::GE:                                                
                   \
-            predicate = create_comparison_predicate0<PredicateType::GE>(index, 
col_name, type, v, \
-                                                                        true, 
arena);             \
+            predicate = create_comparison_predicate<PredicateType::GE>(index, 
col_name, type, v,  \
+                                                                       true);  
                   \
             return Status::OK();                                               
                   \
         case PredicateType::LT:                                                
                   \
-            predicate = create_comparison_predicate0<PredicateType::LT>(index, 
col_name, type, v, \
-                                                                        true, 
arena);             \
+            predicate = create_comparison_predicate<PredicateType::LT>(index, 
col_name, type, v,  \
+                                                                       true);  
                   \
             return Status::OK();                                               
                   \
         case PredicateType::LE:                                                
                   \
-            predicate = create_comparison_predicate0<PredicateType::LE>(index, 
col_name, type, v, \
-                                                                        true, 
arena);             \
+            predicate = create_comparison_predicate<PredicateType::LE>(index, 
col_name, type, v,  \
+                                                                       true);  
                   \
             return Status::OK();                                               
                   \
         default:                                                               
                   \
             return Status::Error<ErrorCode::INVALID_ARGUMENT>(                 
                   \
@@ -292,7 +291,7 @@ Status parse_to_predicate(const uint32_t index, const 
std::string col_name,
                                                  type->get_primitive_type());
         return Status::OK();
     }
-    StringRef v;
+    vectorized::Field v;
     switch (type->get_primitive_type()) {
         CONVERT_CASE(TYPE_TINYINT);
         CONVERT_CASE(TYPE_SMALLINT);
@@ -317,31 +316,31 @@ Status parse_to_predicate(const uint32_t index, const 
std::string col_name,
     case TYPE_CHAR:
     case TYPE_VARCHAR:
     case TYPE_STRING: {
-        v = {res.value_str.front().data(), res.value_str.front().size()};
+        v = 
vectorized::Field::create_field<TYPE_STRING>(res.value_str.front());
         switch (res.condition_op) {
         case PredicateType::EQ:
-            predicate = create_comparison_predicate0<PredicateType::EQ>(index, 
col_name, type, v,
-                                                                        true, 
arena);
+            predicate =
+                    create_comparison_predicate<PredicateType::EQ>(index, 
col_name, type, v, true);
             return Status::OK();
         case PredicateType::NE:
-            predicate = create_comparison_predicate0<PredicateType::NE>(index, 
col_name, type, v,
-                                                                        true, 
arena);
+            predicate =
+                    create_comparison_predicate<PredicateType::NE>(index, 
col_name, type, v, true);
             return Status::OK();
         case PredicateType::GT:
-            predicate = create_comparison_predicate0<PredicateType::GT>(index, 
col_name, type, v,
-                                                                        true, 
arena);
+            predicate =
+                    create_comparison_predicate<PredicateType::GT>(index, 
col_name, type, v, true);
             return Status::OK();
         case PredicateType::GE:
-            predicate = create_comparison_predicate0<PredicateType::GE>(index, 
col_name, type, v,
-                                                                        true, 
arena);
+            predicate =
+                    create_comparison_predicate<PredicateType::GE>(index, 
col_name, type, v, true);
             return Status::OK();
         case PredicateType::LT:
-            predicate = create_comparison_predicate0<PredicateType::LT>(index, 
col_name, type, v,
-                                                                        true, 
arena);
+            predicate =
+                    create_comparison_predicate<PredicateType::LT>(index, 
col_name, type, v, true);
             return Status::OK();
         case PredicateType::LE:
-            predicate = create_comparison_predicate0<PredicateType::LE>(index, 
col_name, type, v,
-                                                                        true, 
arena);
+            predicate =
+                    create_comparison_predicate<PredicateType::LE>(index, 
col_name, type, v, true);
             return Status::OK();
         default:
             return Status::Error<ErrorCode::INVALID_ARGUMENT>(
diff --git a/be/src/olap/in_list_predicate.h b/be/src/olap/in_list_predicate.h
index d78856eee0d..3a388894f4d 100644
--- a/be/src/olap/in_list_predicate.h
+++ b/be/src/olap/in_list_predicate.h
@@ -66,16 +66,15 @@ template <PrimitiveType Type, PredicateType PT, int N>
 class InListPredicateBase final : public ColumnPredicate {
 public:
     ENABLE_FACTORY_CREATOR(InListPredicateBase);
-    using T = std::conditional_t<is_string_type(Type), StringRef,
-                                 typename PrimitiveTypeTraits<Type>::CppType>;
+    using T = typename PrimitiveTypeTraits<Type>::CppType;
     using HybridSetType = std::conditional_t<
             N >= 1 && N <= FIXED_CONTAINER_MAX_SIZE,
             std::conditional_t<
-                    std::is_same_v<T, StringRef>, 
StringSet<FixedContainer<std::string, N>>,
+                    is_string_type(Type), 
StringSet<FixedContainer<std::string, N>>,
                     HybridSet<Type, FixedContainer<T, N>,
                               
vectorized::PredicateColumnType<PredicateEvaluateType<Type>>>>,
             std::conditional_t<
-                    std::is_same_v<T, StringRef>, 
StringSet<DynamicContainer<std::string>>,
+                    is_string_type(Type), 
StringSet<DynamicContainer<std::string>>,
                     HybridSet<Type, DynamicContainer<T>,
                               
vectorized::PredicateColumnType<PredicateEvaluateType<Type>>>>>;
     InListPredicateBase(uint32_t column_id, std::string col_name,
@@ -244,34 +243,52 @@ public:
         if (statistic.first->is_null() && statistic.second->is_null()) {
             return false;
         }
+        using CompareType = typename std::conditional<is_string_type(Type), 
StringRef, T>::type;
+        CompareType tmp_min_value;
+        CompareType tmp_max_value;
+        if constexpr (is_string_type(Type)) {
+            tmp_min_value = StringRef(_min_value.data(), _min_value.size());
+            tmp_max_value = StringRef(_max_value.data(), _max_value.size());
+        } else {
+            tmp_min_value = _min_value;
+            tmp_max_value = _max_value;
+        }
         if constexpr (PT == PredicateType::IN_LIST) {
-            return Compare::less_equal(get_zone_map_value<Type, 
T>(statistic.first->cell_ptr()),
-                                       _max_value) &&
-                   Compare::greater_equal(get_zone_map_value<Type, 
T>(statistic.second->cell_ptr()),
-                                          _min_value);
+            return Compare::less_equal(
+                           get_zone_map_value<Type, 
CompareType>(statistic.first->cell_ptr()),
+                           tmp_max_value) &&
+                   Compare::greater_equal(
+                           get_zone_map_value<Type, 
CompareType>(statistic.second->cell_ptr()),
+                           tmp_min_value);
         } else {
             return true;
         }
     }
 
     bool camp_field(const vectorized::Field& min_field, const 
vectorized::Field& max_field) const {
-        T min_value;
-        T max_value;
+        using CompareType = typename std::conditional<is_string_type(Type), 
StringRef, T>::type;
+        CompareType min_value;
+        CompareType max_value;
+        CompareType tmp_min_value;
+        CompareType tmp_max_value;
         if constexpr (is_string_type(Type)) {
+            tmp_min_value = StringRef(_min_value.data(), _min_value.size());
+            tmp_max_value = StringRef(_max_value.data(), _max_value.size());
             auto& tmp_min = min_field.template get<Type>();
             auto& tmp_max = max_field.template get<Type>();
             min_value = StringRef(tmp_min.data(), tmp_min.size());
             max_value = StringRef(tmp_max.data(), tmp_max.size());
         } else {
+            tmp_min_value = _min_value;
+            tmp_max_value = _max_value;
             min_value = min_field.template get<Type>();
             max_value = max_field.template get<Type>();
         }
-
         if constexpr (PT == PredicateType::IN_LIST) {
-            return (Compare::less_equal(min_value, _max_value) &&
-                    Compare::greater_equal(max_value, _min_value)) ||
-                   (Compare::greater_equal(max_value, _min_value) &&
-                    Compare::less_equal(min_value, _max_value));
+            return (Compare::less_equal(min_value, tmp_max_value) &&
+                    Compare::greater_equal(max_value, tmp_min_value)) ||
+                   (Compare::greater_equal(max_value, tmp_min_value) &&
+                    Compare::less_equal(min_value, tmp_max_value));
         } else {
             return true;
         }
@@ -354,10 +371,22 @@ public:
             return false;
         }
         if constexpr (PT == PredicateType::NOT_IN_LIST) {
-            return Compare::greater(get_zone_map_value<Type, 
T>(statistic.first->cell_ptr()),
-                                    _max_value) ||
-                   Compare::less(get_zone_map_value<Type, 
T>(statistic.second->cell_ptr()),
-                                 _min_value);
+            using CompareType = typename 
std::conditional<is_string_type(Type), StringRef, T>::type;
+            CompareType tmp_min_value;
+            CompareType tmp_max_value;
+            if constexpr (is_string_type(Type)) {
+                tmp_min_value = StringRef(_min_value.data(), 
_min_value.size());
+                tmp_max_value = StringRef(_max_value.data(), 
_max_value.size());
+            } else {
+                tmp_min_value = _min_value;
+                tmp_max_value = _max_value;
+            }
+            return Compare::greater(
+                           get_zone_map_value<Type, 
CompareType>(statistic.first->cell_ptr()),
+                           tmp_max_value) ||
+                   Compare::less(
+                           get_zone_map_value<Type, 
CompareType>(statistic.second->cell_ptr()),
+                           tmp_min_value);
         } else {
             return false;
         }
@@ -371,7 +400,7 @@ public:
             }
             HybridSetBase::IteratorBase* iter = _values->begin();
             while (iter->has_next()) {
-                if constexpr (std::is_same_v<T, StringRef>) {
+                if constexpr (is_string_type(Type)) {
                     const auto* value = (const StringRef*)iter->get_value();
                     if (bf->test_bytes(value->data, value->size)) {
                         return true;
@@ -458,9 +487,9 @@ public:
                     if (test_bytes(*value)) {
                         return true;
                     }
-                } else if constexpr (std::is_same_v<T, StringRef>) {
+                } else if constexpr (is_string_type(Type)) {
                     // VARCHAR/STRING -> hash bytes
-                    if (bf->test_bytes(value->data, value->size)) {
+                    if (bf->test_bytes(value->data(), value->size())) {
                         return true;
                     }
                 } else {
@@ -519,7 +548,7 @@ private:
         uint16_t new_size = 0;
 
         if (column->is_column_dictionary()) {
-            if constexpr (std::is_same_v<T, StringRef>) {
+            if constexpr (is_string_type(Type)) {
                 const auto* nested_col_ptr =
                         
vectorized::check_and_get_column<vectorized::ColumnDictI32>(column);
                 const auto& data_array = nested_col_ptr->get_data();
@@ -586,7 +615,7 @@ private:
                             const 
vectorized::PaddedPODArray<vectorized::UInt8>* null_map,
                             const uint16_t* sel, uint16_t size, bool* flags) 
const {
         if (column->is_column_dictionary()) {
-            if constexpr (std::is_same_v<T, StringRef>) {
+            if constexpr (is_string_type(Type)) {
                 const auto* nested_col_ptr =
                         
vectorized::check_and_get_column<vectorized::ColumnDictI32>(column);
                 const auto& data_array = nested_col_ptr->get_data();
diff --git a/be/src/olap/predicate_creator.h b/be/src/olap/predicate_creator.h
index c225dcfc3d9..08c94d0bba6 100644
--- a/be/src/olap/predicate_creator.h
+++ b/be/src/olap/predicate_creator.h
@@ -172,134 +172,113 @@ std::shared_ptr<ColumnPredicate> 
create_in_list_predicate(const uint32_t cid,
 }
 
 template <PredicateType PT>
-std::shared_ptr<ColumnPredicate> create_comparison_predicate0(
+std::shared_ptr<ColumnPredicate> create_comparison_predicate(
         const uint32_t cid, const std::string col_name, const 
vectorized::DataTypePtr& data_type,
-        StringRef& value, bool opposite, vectorized::Arena& arena) {
+        const vectorized::Field& value, bool opposite) {
     switch (data_type->get_primitive_type()) {
     case TYPE_TINYINT: {
-        return ComparisonPredicateBase<TYPE_TINYINT, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_TINYINT>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_TINYINT, PT>::create_shared(cid, 
col_name, value,
+                                                                        
opposite);
     }
     case TYPE_SMALLINT: {
-        return ComparisonPredicateBase<TYPE_SMALLINT, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_SMALLINT>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_SMALLINT, PT>::create_shared(cid, 
col_name, value,
+                                                                         
opposite);
     }
     case TYPE_INT: {
-        return ComparisonPredicateBase<TYPE_INT, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_INT>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_INT, PT>::create_shared(cid, 
col_name, value, opposite);
     }
     case TYPE_BIGINT: {
-        return ComparisonPredicateBase<TYPE_BIGINT, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_BIGINT>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_BIGINT, PT>::create_shared(cid, 
col_name, value,
+                                                                       
opposite);
     }
     case TYPE_LARGEINT: {
-        return ComparisonPredicateBase<TYPE_LARGEINT, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_LARGEINT>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_LARGEINT, PT>::create_shared(cid, 
col_name, value,
+                                                                         
opposite);
     }
     case TYPE_FLOAT: {
-        return ComparisonPredicateBase<TYPE_FLOAT, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_FLOAT>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_FLOAT, PT>::create_shared(cid, 
col_name, value,
+                                                                      
opposite);
     }
     case TYPE_DOUBLE: {
-        return ComparisonPredicateBase<TYPE_DOUBLE, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DOUBLE>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DOUBLE, PT>::create_shared(cid, 
col_name, value,
+                                                                       
opposite);
     }
     case TYPE_DECIMALV2: {
-        return ComparisonPredicateBase<TYPE_DECIMALV2, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DECIMALV2>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DECIMALV2, PT>::create_shared(cid, 
col_name, value,
+                                                                          
opposite);
     }
     case TYPE_DECIMAL32: {
-        return ComparisonPredicateBase<TYPE_DECIMAL32, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DECIMAL32>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DECIMAL32, PT>::create_shared(cid, 
col_name, value,
+                                                                          
opposite);
     }
     case TYPE_DECIMAL64: {
-        return ComparisonPredicateBase<TYPE_DECIMAL64, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DECIMAL64>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DECIMAL64, PT>::create_shared(cid, 
col_name, value,
+                                                                          
opposite);
     }
     case TYPE_DECIMAL128I: {
-        return ComparisonPredicateBase<TYPE_DECIMAL128I, PT>::create_shared(
-                cid, col_name,
-                *(typename 
PrimitiveTypeTraits<TYPE_DECIMAL128I>::CppType*)value.data, opposite);
+        return ComparisonPredicateBase<TYPE_DECIMAL128I, 
PT>::create_shared(cid, col_name, value,
+                                                                            
opposite);
     }
     case TYPE_DECIMAL256: {
-        return ComparisonPredicateBase<TYPE_DECIMAL256, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DECIMAL256>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DECIMAL256, 
PT>::create_shared(cid, col_name, value,
+                                                                           
opposite);
     }
     case TYPE_CHAR: {
-        // TODO(gabriel): Use std::string instead of StringRef
         auto target =
                 std::max(cast_set<size_t>(assert_cast<const 
vectorized::DataTypeString*>(
                                                   
vectorized::remove_nullable(data_type).get())
                                                   ->len()),
-                         value.size);
-        char* buffer = arena.alloc(target);
-        memset(buffer, 0, target);
-        memcpy(buffer, value.data, value.size);
-        StringRef v = {buffer, target};
-        return ComparisonPredicateBase<TYPE_CHAR, PT>::create_shared(cid, 
col_name, v, opposite);
-    }
-    case TYPE_VARCHAR: {
-        char* buffer = arena.alloc(value.size);
-        memcpy(buffer, value.data, value.size);
-        StringRef v = {buffer, value.size};
-        return ComparisonPredicateBase<TYPE_VARCHAR, PT>::create_shared(cid, 
col_name, v, opposite);
-    }
+                         value.template get<TYPE_CHAR>().size());
+        if (target > value.template get<TYPE_CHAR>().size()) {
+            std::string tmp(target, '\0');
+            memcpy(tmp.data(), value.template get<TYPE_CHAR>().data(),
+                   value.template get<TYPE_CHAR>().size());
+            return ComparisonPredicateBase<TYPE_CHAR, PT>::create_shared(
+                    cid, col_name, 
vectorized::Field::create_field<TYPE_CHAR>(std::move(tmp)),
+                    opposite);
+        } else {
+            return ComparisonPredicateBase<TYPE_CHAR, PT>::create_shared(
+                    cid, col_name,
+                    vectorized::Field::create_field<TYPE_CHAR>(value.template 
get<TYPE_CHAR>()),
+                    opposite);
+        }
+    }
+    case TYPE_VARCHAR:
     case TYPE_STRING: {
-        char* buffer = arena.alloc(value.size);
-        memcpy(buffer, value.data, value.size);
-        StringRef v = {buffer, value.size};
-        return ComparisonPredicateBase<TYPE_STRING, PT>::create_shared(cid, 
col_name, v, opposite);
+        return ComparisonPredicateBase<TYPE_STRING, PT>::create_shared(cid, 
col_name, value,
+                                                                       
opposite);
     }
     case TYPE_DATE: {
-        return ComparisonPredicateBase<TYPE_DATE, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DATE>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DATE, PT>::create_shared(cid, 
col_name, value,
+                                                                     opposite);
     }
     case TYPE_DATEV2: {
-        return ComparisonPredicateBase<TYPE_DATEV2, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DATEV2>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DATEV2, PT>::create_shared(cid, 
col_name, value,
+                                                                       
opposite);
     }
     case TYPE_DATETIME: {
-        return ComparisonPredicateBase<TYPE_DATETIME, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DATETIME>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DATETIME, PT>::create_shared(cid, 
col_name, value,
+                                                                         
opposite);
     }
     case TYPE_DATETIMEV2: {
-        return ComparisonPredicateBase<TYPE_DATETIMEV2, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_DATETIMEV2>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_DATETIMEV2, 
PT>::create_shared(cid, col_name, value,
+                                                                           
opposite);
     }
     case TYPE_TIMESTAMPTZ: {
-        return ComparisonPredicateBase<TYPE_TIMESTAMPTZ, PT>::create_shared(
-                cid, col_name,
-                *(typename 
PrimitiveTypeTraits<TYPE_TIMESTAMPTZ>::CppType*)value.data, opposite);
+        return ComparisonPredicateBase<TYPE_TIMESTAMPTZ, 
PT>::create_shared(cid, col_name, value,
+                                                                            
opposite);
     }
     case TYPE_BOOLEAN: {
-        return ComparisonPredicateBase<TYPE_BOOLEAN, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_BOOLEAN>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_BOOLEAN, PT>::create_shared(cid, 
col_name, value,
+                                                                        
opposite);
     }
     case TYPE_IPV4: {
-        return ComparisonPredicateBase<TYPE_IPV4, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_IPV4>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_IPV4, PT>::create_shared(cid, 
col_name, value,
+                                                                     opposite);
     }
     case TYPE_IPV6: {
-        return ComparisonPredicateBase<TYPE_IPV6, PT>::create_shared(
-                cid, col_name, *(typename 
PrimitiveTypeTraits<TYPE_IPV6>::CppType*)value.data,
-                opposite);
+        return ComparisonPredicateBase<TYPE_IPV6, PT>::create_shared(cid, 
col_name, value,
+                                                                     opposite);
     }
     default:
         throw Exception(Status::InternalError("Unsupported type {} for 
comparison_predicate",
diff --git a/be/src/pipeline/exec/file_scan_operator.cpp 
b/be/src/pipeline/exec/file_scan_operator.cpp
index 2ffa0e64465..ace81d0b97c 100644
--- a/be/src/pipeline/exec/file_scan_operator.cpp
+++ b/be/src/pipeline/exec/file_scan_operator.cpp
@@ -34,11 +34,10 @@ namespace doris::pipeline {
 
 PushDownType FileScanLocalState::_should_push_down_binary_predicate(
         vectorized::VectorizedFnCall* fn_call, vectorized::VExprContext* 
expr_ctx,
-        StringRef* constant_val, const std::set<std::string> fn_name) const {
+        vectorized::Field& constant_val, const std::set<std::string> fn_name) 
const {
     if (!fn_name.contains(fn_call->fn().name.function_name)) {
         return PushDownType::UNACCEPTABLE;
     }
-    DCHECK(constant_val->data == nullptr) << "constant_val should not have a 
value";
     const auto& children = fn_call->children();
     DCHECK(children.size() == 2);
     DCHECK_EQ(children[0]->node_type(), TExprNodeType::SLOT_REF);
@@ -47,7 +46,7 @@ PushDownType 
FileScanLocalState::_should_push_down_binary_predicate(
         THROW_IF_ERROR(children[1]->get_const_col(expr_ctx, 
&const_col_wrapper));
         const auto* const_column =
                 assert_cast<const 
vectorized::ColumnConst*>(const_col_wrapper->column_ptr.get());
-        *constant_val = const_column->get_data_at(0);
+        constant_val = const_column->operator[](0);
         return PushDownType::PARTIAL_ACCEPTABLE;
     } else {
         // only handle constant value
diff --git a/be/src/pipeline/exec/file_scan_operator.h 
b/be/src/pipeline/exec/file_scan_operator.h
index 9c99df14874..31aa92cfbb2 100644
--- a/be/src/pipeline/exec/file_scan_operator.h
+++ b/be/src/pipeline/exec/file_scan_operator.h
@@ -87,7 +87,7 @@ private:
     }
     PushDownType _should_push_down_binary_predicate(
             vectorized::VectorizedFnCall* fn_call, vectorized::VExprContext* 
expr_ctx,
-            StringRef* constant_val, const std::set<std::string> fn_name) 
const override;
+            vectorized::Field& constant_val, const std::set<std::string> 
fn_name) const override;
     std::shared_ptr<vectorized::SplitSourceConnector> _split_source = nullptr;
     int _max_scanners;
     // A in memory cache to save some common components
diff --git a/be/src/pipeline/exec/mock_scan_operator.h 
b/be/src/pipeline/exec/mock_scan_operator.h
index 65e6cd32782..7f651e3391a 100644
--- a/be/src/pipeline/exec/mock_scan_operator.h
+++ b/be/src/pipeline/exec/mock_scan_operator.h
@@ -56,11 +56,10 @@ private:
     }
     PushDownType _should_push_down_binary_predicate(
             vectorized::VectorizedFnCall* fn_call, vectorized::VExprContext* 
expr_ctx,
-            StringRef* constant_val, const std::set<std::string> fn_name) 
const override {
+            vectorized::Field& constant_val, const std::set<std::string> 
fn_name) const override {
         if (!fn_name.contains(fn_call->fn().name.function_name)) {
             return PushDownType::UNACCEPTABLE;
         }
-        DCHECK(constant_val->data == nullptr) << "constant_val should not have 
a value";
         const auto& children = fn_call->children();
         DCHECK(children.size() == 2);
         DCHECK_EQ(children[0]->node_type(), TExprNodeType::SLOT_REF);
@@ -69,7 +68,7 @@ private:
             THROW_IF_ERROR(children[1]->get_const_col(expr_ctx, 
&const_col_wrapper));
             const auto* const_column = assert_cast<const 
vectorized::ColumnConst*>(
                     const_col_wrapper->column_ptr.get());
-            *constant_val = const_column->get_data_at(0);
+            constant_val = const_column->operator[](0);
             return PushDownType::ACCEPTABLE;
         } else {
             // only handle constant value
diff --git a/be/src/pipeline/exec/olap_scan_operator.cpp 
b/be/src/pipeline/exec/olap_scan_operator.cpp
index 46aa38577bf..09c3b742864 100644
--- a/be/src/pipeline/exec/olap_scan_operator.cpp
+++ b/be/src/pipeline/exec/olap_scan_operator.cpp
@@ -85,11 +85,10 @@ Status OlapScanLocalState::init(RuntimeState* state, 
LocalStateInfo& info) {
 
 PushDownType OlapScanLocalState::_should_push_down_binary_predicate(
         vectorized::VectorizedFnCall* fn_call, vectorized::VExprContext* 
expr_ctx,
-        StringRef* constant_val, const std::set<std::string> fn_name) const {
+        vectorized::Field& constant_val, const std::set<std::string> fn_name) 
const {
     if (!fn_name.contains(fn_call->fn().name.function_name)) {
         return PushDownType::UNACCEPTABLE;
     }
-    DCHECK(constant_val->data == nullptr) << "constant_val should not have a 
value";
     const auto& children = fn_call->children();
     DCHECK(children.size() == 2);
     DCHECK_EQ(children[0]->node_type(), TExprNodeType::SLOT_REF);
@@ -98,7 +97,7 @@ PushDownType 
OlapScanLocalState::_should_push_down_binary_predicate(
         THROW_IF_ERROR(children[1]->get_const_col(expr_ctx, 
&const_col_wrapper));
         const auto* const_column =
                 assert_cast<const 
vectorized::ColumnConst*>(const_col_wrapper->column_ptr.get());
-        *constant_val = const_column->get_data_at(0);
+        constant_val = const_column->operator[](0);
         return PushDownType::ACCEPTABLE;
     } else {
         // only handle constant value
diff --git a/be/src/pipeline/exec/olap_scan_operator.h 
b/be/src/pipeline/exec/olap_scan_operator.h
index cd054c66408..292081b29a6 100644
--- a/be/src/pipeline/exec/olap_scan_operator.h
+++ b/be/src/pipeline/exec/olap_scan_operator.h
@@ -99,7 +99,7 @@ private:
     }
     PushDownType _should_push_down_binary_predicate(
             vectorized::VectorizedFnCall* fn_call, vectorized::VExprContext* 
expr_ctx,
-            StringRef* constant_val, const std::set<std::string> fn_name) 
const override;
+            vectorized::Field& constant_val, const std::set<std::string> 
fn_name) const override;
 
     bool _should_push_down_common_expr() override;
 
diff --git a/be/src/pipeline/exec/scan_operator.cpp 
b/be/src/pipeline/exec/scan_operator.cpp
index e8d8193a289..404d3e412e5 100644
--- a/be/src/pipeline/exec/scan_operator.cpp
+++ b/be/src/pipeline/exec/scan_operator.cpp
@@ -735,8 +735,20 @@ Status ScanLocalState<Derived>::_normalize_in_predicate(
             // dispose next item
             DCHECK(iter->get_value() != nullptr);
             const auto* value = iter->get_value();
-            RETURN_IF_ERROR(
-                    _change_value_range(is_in, temp_range, value, fn, is_in ? 
"in" : "not_in"));
+            if constexpr (is_string_type(T)) {
+                const auto* str_value = reinterpret_cast<const 
StringRef*>(value);
+                RETURN_IF_ERROR(_change_value_range(is_in, temp_range,
+                                                    
vectorized::Field::create_field<T>(std::string(
+                                                            str_value->data, 
str_value->size)),
+                                                    fn, is_in ? "in" : 
"not_in"));
+            } else {
+                RETURN_IF_ERROR(_change_value_range(
+                        is_in, temp_range,
+                        vectorized::Field::create_field<T>(
+                                *reinterpret_cast<const typename 
PrimitiveTypeTraits<T>::CppType*>(
+                                        value)),
+                        fn, is_in ? "in" : "not_in"));
+            }
             iter->next();
         }
         if (is_in) {
@@ -785,9 +797,9 @@ Status ScanLocalState<Derived>::_normalize_binary_predicate(
     DCHECK(!root->is_rf_wrapper()) << root->debug_string();
     DCHECK(TExprNodeType::BINARY_PRED == root->node_type()) << 
root->debug_string();
     DCHECK(root->get_num_children() == 2);
-    StringRef value;
+    vectorized::Field value;
     *pdt = _should_push_down_binary_predicate(
-            assert_cast<vectorized::VectorizedFnCall*>(root.get()), expr_ctx, 
&value,
+            assert_cast<vectorized::VectorizedFnCall*>(root.get()), expr_ctx, 
value,
             {"eq", "ne", "lt", "gt", "le", "ge"});
     if (*pdt == PushDownType::UNACCEPTABLE) {
         return Status::OK();
@@ -799,60 +811,55 @@ Status 
ScanLocalState<Derived>::_normalize_binary_predicate(
     auto empty_range = ColumnValueRange<T>::create_empty_column_value_range(
             slot->is_nullable(), range.precision(), range.scale());
     auto& temp_range = op == SQLFilterOp::FILTER_EQ ? empty_range : range;
-    if (value.data != nullptr) {
-        if (!is_string_type(T) && sizeof(typename 
PrimitiveTypeTraits<T>::CppType) != value.size) {
-            return Status::InternalError(
-                    "PrimitiveType {} meet invalid input value size {}, expect 
size {}", T,
-                    value.size, sizeof(typename 
PrimitiveTypeTraits<T>::CppType));
-        }
+    if (value.get_type() != TYPE_NULL) {
         switch (op) {
         case SQLFilterOp::FILTER_EQ:
-            pred = create_comparison_predicate0<PredicateType::EQ>(
+            pred = create_comparison_predicate<PredicateType::EQ>(
                     
_parent->intermediate_row_desc().get_column_id(slot->id()), slot->col_name(),
                     slot->type()->get_primitive_type() == TYPE_VARIANT
                             ? root->get_child(0)->data_type()
                             : slot->type(),
-                    value, false, _arena);
+                    value, false);
             break;
         case SQLFilterOp::FILTER_NE:
-            pred = create_comparison_predicate0<PredicateType::NE>(
+            pred = create_comparison_predicate<PredicateType::NE>(
                     
_parent->intermediate_row_desc().get_column_id(slot->id()), slot->col_name(),
                     slot->type()->get_primitive_type() == TYPE_VARIANT
                             ? root->get_child(0)->data_type()
                             : slot->type(),
-                    value, false, _arena);
+                    value, false);
             break;
         case SQLFilterOp::FILTER_LESS:
-            pred = create_comparison_predicate0<PredicateType::LT>(
+            pred = create_comparison_predicate<PredicateType::LT>(
                     
_parent->intermediate_row_desc().get_column_id(slot->id()), slot->col_name(),
                     slot->type()->get_primitive_type() == TYPE_VARIANT
                             ? root->get_child(0)->data_type()
                             : slot->type(),
-                    value, false, _arena);
+                    value, false);
             break;
         case SQLFilterOp::FILTER_LARGER:
-            pred = create_comparison_predicate0<PredicateType::GT>(
+            pred = create_comparison_predicate<PredicateType::GT>(
                     
_parent->intermediate_row_desc().get_column_id(slot->id()), slot->col_name(),
                     slot->type()->get_primitive_type() == TYPE_VARIANT
                             ? root->get_child(0)->data_type()
                             : slot->type(),
-                    value, false, _arena);
+                    value, false);
             break;
         case SQLFilterOp::FILTER_LESS_OR_EQUAL:
-            pred = create_comparison_predicate0<PredicateType::LE>(
+            pred = create_comparison_predicate<PredicateType::LE>(
                     
_parent->intermediate_row_desc().get_column_id(slot->id()), slot->col_name(),
                     slot->type()->get_primitive_type() == TYPE_VARIANT
                             ? root->get_child(0)->data_type()
                             : slot->type(),
-                    value, false, _arena);
+                    value, false);
             break;
         case SQLFilterOp::FILTER_LARGER_OR_EQUAL:
-            pred = create_comparison_predicate0<PredicateType::GE>(
+            pred = create_comparison_predicate<PredicateType::GE>(
                     
_parent->intermediate_row_desc().get_column_id(slot->id()), slot->col_name(),
                     slot->type()->get_primitive_type() == TYPE_VARIANT
                             ? root->get_child(0)->data_type()
                             : slot->type(),
-                    value, false, _arena);
+                    value, false);
             break;
         default:
             throw Exception(Status::InternalError("Unsupported function name: 
{}", function_name));
@@ -864,20 +871,7 @@ Status 
ScanLocalState<Derived>::_normalize_binary_predicate(
                                      ? 
ColumnValueRange<T>::remove_fixed_value_range
                                      : ColumnValueRange<T>::empty_function)
                           : ColumnValueRange<T>::add_value_range;
-        if constexpr (T == TYPE_CHAR || T == TYPE_VARCHAR || T == TYPE_STRING 
|| T == TYPE_HLL) {
-            auto val = StringRef(value.data, value.size);
-            RETURN_IF_ERROR(_change_value_range(is_equal_op, temp_range,
-                                                reinterpret_cast<void*>(&val), 
fn, function_name));
-        } else {
-            if (sizeof(typename PrimitiveTypeTraits<T>::CppType) != 
value.size) {
-                return Status::InternalError(
-                        "PrimitiveType {} meet invalid input value size {}, 
expect size {}", T,
-                        value.size, sizeof(typename 
PrimitiveTypeTraits<T>::CppType));
-            }
-            RETURN_IF_ERROR(_change_value_range(is_equal_op, temp_range,
-                                                reinterpret_cast<const 
void*>(value.data), fn,
-                                                function_name));
-        }
+        RETURN_IF_ERROR(_change_value_range(is_equal_op, temp_range, value, 
fn, function_name));
         if (op == SQLFilterOp::FILTER_EQ) {
             range.intersection(temp_range);
         }
@@ -894,17 +888,14 @@ template <typename Derived>
 template <PrimitiveType PrimitiveType, typename ChangeFixedValueRangeFunc>
 Status ScanLocalState<Derived>::_change_value_range(bool is_equal_op,
                                                     
ColumnValueRange<PrimitiveType>& temp_range,
-                                                    const void* value,
+                                                    const vectorized::Field& 
value,
                                                     const 
ChangeFixedValueRangeFunc& func,
                                                     const std::string& 
fn_name) {
     if constexpr (PrimitiveType == TYPE_DATE) {
-        VecDateTimeValue tmp_value;
-        memcpy(&tmp_value, value, sizeof(VecDateTimeValue));
+        auto tmp_value = value.template get<TYPE_DATE>();
         if (is_equal_op) {
             if (!tmp_value.check_loss_accuracy_cast_to_date()) {
-                func(temp_range, to_olap_filter_type(fn_name),
-                     reinterpret_cast<typename 
PrimitiveTypeTraits<PrimitiveType>::CppType*>(
-                             &tmp_value));
+                func(temp_range, to_olap_filter_type(fn_name), tmp_value);
             }
         } else {
             if (tmp_value.check_loss_accuracy_cast_to_date()) {
@@ -912,15 +903,8 @@ Status ScanLocalState<Derived>::_change_value_range(bool 
is_equal_op,
                     ++tmp_value;
                 }
             }
-            func(temp_range, to_olap_filter_type(fn_name),
-                 reinterpret_cast<typename 
PrimitiveTypeTraits<PrimitiveType>::CppType*>(
-                         &tmp_value));
+            func(temp_range, to_olap_filter_type(fn_name), tmp_value);
         }
-    } else if constexpr (PrimitiveType == TYPE_DATETIME) {
-        func(temp_range, to_olap_filter_type(fn_name),
-             reinterpret_cast<const typename 
PrimitiveTypeTraits<PrimitiveType>::CppType*>(value));
-    } else if constexpr (PrimitiveType == TYPE_HLL) {
-        func(temp_range, to_olap_filter_type(fn_name), reinterpret_cast<const 
StringRef*>(value));
     } else if constexpr ((PrimitiveType == TYPE_DECIMALV2) || (PrimitiveType 
== TYPE_DATETIMEV2) ||
                          (PrimitiveType == TYPE_TINYINT) || (PrimitiveType == 
TYPE_SMALLINT) ||
                          (PrimitiveType == TYPE_INT) || (PrimitiveType == 
TYPE_BIGINT) ||
@@ -929,11 +913,13 @@ Status ScanLocalState<Derived>::_change_value_range(bool 
is_equal_op,
                          (PrimitiveType == TYPE_IPV6) || (PrimitiveType == 
TYPE_DECIMAL32) ||
                          (PrimitiveType == TYPE_DECIMAL64) || (PrimitiveType 
== TYPE_DECIMAL128I) ||
                          (PrimitiveType == TYPE_DECIMAL256) || (PrimitiveType 
== TYPE_BOOLEAN) ||
-                         (PrimitiveType == TYPE_DATEV2) || (PrimitiveType == 
TYPE_TIMESTAMPTZ)) {
+                         (PrimitiveType == TYPE_DATEV2) || (PrimitiveType == 
TYPE_TIMESTAMPTZ) ||
+                         (PrimitiveType == TYPE_DATETIME) || 
is_string_type(PrimitiveType)) {
+        func(temp_range, to_olap_filter_type(fn_name), value.template 
get<PrimitiveType>());
+    } else if constexpr (PrimitiveType == TYPE_HLL) {
+        auto tmp = value.template get<PrimitiveType>();
         func(temp_range, to_olap_filter_type(fn_name),
-             reinterpret_cast<const typename 
PrimitiveTypeTraits<PrimitiveType>::CppType*>(value));
-    } else if constexpr (is_string_type(PrimitiveType)) {
-        func(temp_range, to_olap_filter_type(fn_name), reinterpret_cast<const 
StringRef*>(value));
+             StringRef(reinterpret_cast<const char*>(&tmp), sizeof(tmp)));
     } else {
         static_assert(always_false_v<PrimitiveType>);
     }
diff --git a/be/src/pipeline/exec/scan_operator.h 
b/be/src/pipeline/exec/scan_operator.h
index f3deca4b55e..8e6fcf98a3a 100644
--- a/be/src/pipeline/exec/scan_operator.h
+++ b/be/src/pipeline/exec/scan_operator.h
@@ -223,7 +223,7 @@ protected:
     }
     virtual PushDownType _should_push_down_binary_predicate(
             vectorized::VectorizedFnCall* fn_call, vectorized::VExprContext* 
expr_ctx,
-            StringRef* constant_val, const std::set<std::string> fn_name) 
const {
+            vectorized::Field& constant_val, const std::set<std::string> 
fn_name) const {
         return PushDownType::UNACCEPTABLE;
     }
 
@@ -289,8 +289,8 @@ protected:
 
     template <PrimitiveType PrimitiveType, typename ChangeFixedValueRangeFunc>
     Status _change_value_range(bool is_equal_op, 
ColumnValueRange<PrimitiveType>& range,
-                               const void* value, const 
ChangeFixedValueRangeFunc& func,
-                               const std::string& fn_name);
+                               const vectorized::Field& value,
+                               const ChangeFixedValueRangeFunc& func, const 
std::string& fn_name);
 
     Status _prepare_scanners();
 
diff --git a/be/src/runtime/runtime_predicate.cpp 
b/be/src/runtime/runtime_predicate.cpp
index cd61775ef7c..8e0421c8af3 100644
--- a/be/src/runtime/runtime_predicate.cpp
+++ b/be/src/runtime/runtime_predicate.cpp
@@ -51,8 +51,8 @@ RuntimePredicate::RuntimePredicate(const TTopnFilterDesc& 
desc)
     // since values that > min_top_value are large than any value in current 
topn values
     // For DESC sort, create runtime predicate col_name >= min_top_value
     // since values that < min_top_value are less than any value in current 
topn values
-    _pred_constructor = _is_asc ? 
create_comparison_predicate0<PredicateType::LE>
-                                : 
create_comparison_predicate0<PredicateType::GE>;
+    _pred_constructor = _is_asc ? 
create_comparison_predicate<PredicateType::LE>
+                                : 
create_comparison_predicate<PredicateType::GE>;
 }
 
 Status RuntimePredicate::init_target(
@@ -79,112 +79,6 @@ Status RuntimePredicate::init_target(
     return Status::OK();
 }
 
-StringRef RuntimePredicate::_get_string_ref(const Field& field, const 
PrimitiveType type) {
-    switch (type) {
-    case PrimitiveType::TYPE_BOOLEAN: {
-        const auto& v = field.get<TYPE_BOOLEAN>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_TINYINT: {
-        const auto& v = field.get<TYPE_TINYINT>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_SMALLINT: {
-        const auto& v = field.get<TYPE_SMALLINT>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_INT: {
-        const auto& v = field.get<TYPE_INT>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_BIGINT: {
-        const auto& v = field.get<TYPE_BIGINT>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_LARGEINT: {
-        const auto& v = field.get<TYPE_LARGEINT>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_CHAR:
-    case PrimitiveType::TYPE_VARCHAR:
-    case PrimitiveType::TYPE_STRING: {
-        const auto& v = field.get<TYPE_STRING>();
-        auto length = v.size();
-        char* buffer = _predicate_arena.alloc(length);
-        memset(buffer, 0, length);
-        memcpy(buffer, v.data(), v.length());
-
-        return {buffer, length};
-    }
-    case PrimitiveType::TYPE_DATEV2: {
-        const auto& v = field.get<TYPE_DATEV2>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DATETIMEV2: {
-        const auto& v = field.get<TYPE_DATETIMEV2>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_TIMESTAMPTZ: {
-        const auto& v = field.get<TYPE_TIMESTAMPTZ>();
-        return StringRef((char*)&v, sizeof(v));
-        break;
-    }
-    case PrimitiveType::TYPE_DATE: {
-        const auto& v = field.get<TYPE_DATE>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DATETIME: {
-        const auto& v = field.get<TYPE_DATETIME>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_TIMEV2: {
-        const auto& v = field.get<TYPE_TIMEV2>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DECIMAL32: {
-        const auto& v = field.get<TYPE_DECIMAL32>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DECIMAL64: {
-        const auto& v = field.get<TYPE_DECIMAL64>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DECIMALV2: {
-        const auto& v = field.get<TYPE_DECIMALV2>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DECIMAL128I: {
-        const auto& v = field.get<TYPE_DECIMAL128I>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_DECIMAL256: {
-        const auto& v = field.get<TYPE_DECIMAL256>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_IPV4: {
-        const auto& v = field.get<TYPE_IPV4>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case PrimitiveType::TYPE_IPV6: {
-        const auto& v = field.get<TYPE_IPV6>();
-        return StringRef((char*)&v, sizeof(v));
-    }
-    case doris::PrimitiveType::TYPE_VARBINARY: {
-        const auto& v = field.get<TYPE_VARBINARY>();
-        auto length = v.size();
-        char* buffer = _predicate_arena.alloc(length);
-        memset(buffer, 0, length);
-        memcpy(buffer, v.data(), length);
-        return {buffer, length};
-    }
-    default:
-        break;
-    }
-
-    throw Exception(ErrorCode::INTERNAL_ERROR, "meet invalid type, type={}", 
type_to_string(type));
-    return {};
-}
-
 bool RuntimePredicate::_init(PrimitiveType type) {
     return is_int_or_bool(type) || is_decimal(type) || is_string_type(type) || 
is_date_type(type) ||
            is_time_type(type) || is_ip(type) || is_varbinary(type);
@@ -233,10 +127,9 @@ Status RuntimePredicate::update(const Field& value) {
             //) ORDER BY 1 LIMIT 1 ;
             continue;
         }
-        auto str_ref = _get_string_ref(_orderby_extrem, _type);
         std::shared_ptr<ColumnPredicate> pred =
                 _pred_constructor(ctx.predicate->column_id(), ctx.col_name, 
ctx.col_data_type,
-                                  str_ref, false, _predicate_arena);
+                                  _orderby_extrem, false);
 
         // For NULLS FIRST, wrap a AcceptNullPredicate to return true for NULL
         // since ORDER BY ASC/DESC should get NULL first but pred returns NULL
diff --git a/be/src/runtime/runtime_predicate.h 
b/be/src/runtime/runtime_predicate.h
index 632c6bfb78d..c9a68e8ffba 100644
--- a/be/src/runtime/runtime_predicate.h
+++ b/be/src/runtime/runtime_predicate.h
@@ -98,7 +98,6 @@ public:
     }
 
 private:
-    StringRef _get_string_ref(const Field& field, const PrimitiveType type);
     void check_target_node_id(int32_t target_node_id) const {
         if (!_contexts.contains(target_node_id)) {
             std::string msg = "context target node ids: [";
@@ -136,10 +135,9 @@ private:
     std::map<int32_t, TargetContext> _contexts;
 
     Field _orderby_extrem {PrimitiveType::TYPE_NULL};
-    Arena _predicate_arena;
-    std::function<std::shared_ptr<ColumnPredicate>(
-            const int cid, const std::string& col_name, const 
vectorized::DataTypePtr& data_type,
-            StringRef& value, bool opposite, vectorized::Arena& arena)>
+    std::function<std::shared_ptr<ColumnPredicate>(const int cid, const 
std::string& col_name,
+                                                   const 
vectorized::DataTypePtr& data_type,
+                                                   const vectorized::Field& 
value, bool opposite)>
             _pred_constructor;
     bool _detected_source = false;
     bool _detected_target = false;
diff --git a/be/src/runtime/type_limit.h b/be/src/runtime/type_limit.h
index 02e455e49d0..202455d5327 100644
--- a/be/src/runtime/type_limit.h
+++ b/be/src/runtime/type_limit.h
@@ -36,6 +36,12 @@ struct type_limit<StringRef> {
     static StringRef max() { return StringRef::max_string_val(); }
 };
 
+template <>
+struct type_limit<std::string> {
+    static std::string min() { return 
std::string((char*)(&StringRef::MIN_CHAR), 0); }
+    static std::string max() { return 
std::string((char*)(&StringRef::MAX_CHAR), 1); }
+};
+
 template <>
 struct type_limit<uint8_t> {
     static uint8_t min() { return 0; }
diff --git a/be/test/olap/block_column_predicate_test.cpp 
b/be/test/olap/block_column_predicate_test.cpp
index 6ad31db343c..2a387236af2 100644
--- a/be/test/olap/block_column_predicate_test.cpp
+++ b/be/test/olap/block_column_predicate_test.cpp
@@ -79,7 +79,7 @@ TEST_F(BlockColumnPredicateTest, SINGLE_COLUMN_VEC) {
     vectorized::MutableColumns block;
     block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
-    int value = 5;
+    auto value = vectorized::Field::create_field<TYPE_INT>(5);
     int rows = 10;
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
@@ -99,15 +99,15 @@ TEST_F(BlockColumnPredicateTest, SINGLE_COLUMN_VEC) {
     EXPECT_EQ(selected_size, 1);
     auto* pred_col =
             
reinterpret_cast<vectorized::PredicateColumnType<TYPE_INT>*>(block[col_idx].get());
-    EXPECT_EQ(pred_col->get_data()[sel_idx[0]], value);
+    EXPECT_EQ(pred_col->get_data()[sel_idx[0]], value.template 
get<TYPE_INT>());
 }
 
 TEST_F(BlockColumnPredicateTest, AND_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
     block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
-    int less_value = 5;
-    int great_value = 3;
+    auto less_value = vectorized::Field::create_field<TYPE_INT>(5);
+    auto great_value = vectorized::Field::create_field<TYPE_INT>(3);
     int rows = 10;
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> less_pred(
@@ -141,8 +141,8 @@ TEST_F(BlockColumnPredicateTest, OR_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
     block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
-    int less_value = 5;
-    int great_value = 3;
+    auto less_value = vectorized::Field::create_field<TYPE_INT>(5);
+    auto great_value = vectorized::Field::create_field<TYPE_INT>(3);
     int rows = 10;
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> less_pred(
@@ -176,8 +176,8 @@ TEST_F(BlockColumnPredicateTest, OR_AND_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
     block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
-    int less_value = 5;
-    int great_value = 3;
+    auto less_value = vectorized::Field::create_field<TYPE_INT>(5);
+    auto great_value = vectorized::Field::create_field<TYPE_INT>(3);
     int rows = 10;
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> less_pred(
@@ -243,8 +243,8 @@ TEST_F(BlockColumnPredicateTest, AND_OR_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
     block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
-    int less_value = 5;
-    int great_value = 3;
+    auto less_value = vectorized::Field::create_field<TYPE_INT>(5);
+    auto great_value = vectorized::Field::create_field<TYPE_INT>(3);
     int rows = 10;
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> less_pred(
@@ -302,8 +302,19 @@ TEST_F(BlockColumnPredicateTest, AND_OR_MUTI_COLUMN_VEC) {
 
 template <PrimitiveType T, PredicateType PT>
 void single_column_predicate_test_func(const std::pair<WrapperField*, 
WrapperField*>& statistic,
-                                       typename 
PrimitiveTypeTraits<T>::CppType check_value,
-                                       bool expect_match) {
+                                       vectorized::Field& check_value, bool 
expect_match) {
+    int col_idx = 0;
+    std::shared_ptr<ColumnPredicate> pred(
+            new ComparisonPredicateBase<T, PT>(col_idx, "", check_value));
+    SingleColumnBlockPredicate single_column_block_pred(pred);
+
+    bool matched = single_column_block_pred.evaluate_and(statistic);
+    EXPECT_EQ(matched, expect_match);
+}
+
+template <PrimitiveType T, PredicateType PT>
+void single_column_predicate_test_func(const std::pair<WrapperField*, 
WrapperField*>& statistic,
+                                       vectorized::Field&& check_value, bool 
expect_match) {
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<T, PT>(col_idx, "", check_value));
@@ -318,17 +329,20 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     FieldType type = FieldType::OLAP_FIELD_TYPE_DOUBLE;
     std::unique_ptr<WrapperField> min_field(WrapperField::create_by_type(type, 
0));
     std::unique_ptr<WrapperField> max_field(WrapperField::create_by_type(type, 
0));
-    static auto constexpr nan = std::numeric_limits<double>::quiet_NaN();
-    static auto constexpr neg_inf = -std::numeric_limits<double>::infinity();
-    static auto constexpr pos_inf = std::numeric_limits<double>::infinity();
-    static auto constexpr min = std::numeric_limits<double>::lowest();
-    static auto constexpr max = std::numeric_limits<double>::max();
+    auto nan =
+            
vectorized::Field::create_field<TYPE_DOUBLE>(std::numeric_limits<double>::quiet_NaN());
+    auto neg_inf =
+            
vectorized::Field::create_field<TYPE_DOUBLE>(-std::numeric_limits<double>::infinity());
+    auto pos_inf =
+            
vectorized::Field::create_field<TYPE_DOUBLE>(std::numeric_limits<double>::infinity());
+    auto min = 
vectorized::Field::create_field<TYPE_DOUBLE>(std::numeric_limits<double>::lowest());
+    auto max = 
vectorized::Field::create_field<TYPE_DOUBLE>(std::numeric_limits<double>::max());
 
     // test normal value min max:
     {
         std::cout << "========test normal value min max\n";
-        double zonemap_min_v = std::numeric_limits<float>::lowest();
-        double zonemap_max_v = std::numeric_limits<float>::max();
+        double zonemap_min_v = std::numeric_limits<double>::lowest();
+        double zonemap_max_v = std::numeric_limits<double>::max();
         min_field->set_raw_value(&zonemap_min_v, sizeof(zonemap_min_v));
         max_field->set_raw_value(&zonemap_max_v, sizeof(zonemap_max_v));
 
@@ -374,9 +388,13 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, false);
 
-        std::vector<double> test_values_in_range = {
-                zonemap_min_v, zonemap_max_v, -123456.789012345, -0.0, 0.0, 
123456.789012345,
-        };
+        std::vector<vectorized::Field> test_values_in_range = {
+                vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_min_v),
+                vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_max_v),
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                
vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345)};
         for (auto v : test_values_in_range) {
             // test EQ
             // std::cout << "test double EQ value: " << v << std::endl;
@@ -390,7 +408,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test LT
             // std::cout << "test double LT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LT>(
-                    {min_field.get(), max_field.get()}, v, v != zonemap_min_v);
+                    {min_field.get(), max_field.get()}, v,
+                    v.template get<TYPE_DOUBLE>() != zonemap_min_v);
 
             // test LE
             // std::cout << "test double LE value: " << v << std::endl;
@@ -400,7 +419,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test GT
             // std::cout << "test double GT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::GT>(
-                    {min_field.get(), max_field.get()}, v, v != zonemap_max_v);
+                    {min_field.get(), max_field.get()}, v,
+                    v.template get<TYPE_DOUBLE>() != zonemap_max_v);
 
             // test GE
             // std::cout << "test double GE value: " << v << std::endl;
@@ -410,7 +430,7 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
 
         // test values out of zonemap range
         {
-            double v = zonemap_min_v * 2;
+            auto v = 
vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_min_v * 2);
             // test EQ
             // std::cout << "test double EQ value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -441,7 +461,7 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
                     {min_field.get(), max_field.get()}, v, true);
         }
         {
-            double v = zonemap_max_v * 2;
+            auto v = 
vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_max_v * 2);
             // test EQ
             // std::cout << "test double EQ value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -475,9 +495,9 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [normal, +Infinity]
     {
         std::cout << "========test special range: [normal, +Infinity]\n";
-        double zonemap_min_v = std::numeric_limits<float>::lowest();
-        min_field->set_raw_value(&zonemap_min_v, sizeof(zonemap_min_v));
-        max_field->set_raw_value(&pos_inf, sizeof(pos_inf));
+        double zonemap_min_v = std::numeric_limits<double>::lowest();
+        min_field->set_raw_value(&zonemap_min_v, sizeof(double));
+        max_field->set_raw_value(&pos_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -521,8 +541,14 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, false);
 
-        std::vector<double> test_values_in_range = {
-                zonemap_min_v, max, pos_inf, -123456.789012345, -0.0, 0.0, 
123456.789012345,
+        std::vector<vectorized::Field> test_values_in_range = {
+                vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_min_v),
+                max,
+                pos_inf,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_in_range) {
             // test EQ
@@ -537,7 +563,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test LT
             // std::cout << "test double LT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LT>(
-                    {min_field.get(), max_field.get()}, v, v != zonemap_min_v);
+                    {min_field.get(), max_field.get()}, v,
+                    v.template get<TYPE_DOUBLE>() != zonemap_min_v);
 
             // test LE
             // std::cout << "test double LE value: " << v << std::endl;
@@ -547,7 +574,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test GT
             // std::cout << "test double GT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::GT>(
-                    {min_field.get(), max_field.get()}, v, v != pos_inf);
+                    {min_field.get(), max_field.get()}, v,
+                    v.template get<TYPE_DOUBLE>() != pos_inf.template 
get<TYPE_DOUBLE>());
 
             // test GE
             // std::cout << "test double GE value: " << v << std::endl;
@@ -557,7 +585,7 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
 
         // test values out of zonemap range
         {
-            double v = zonemap_min_v * 2;
+            auto v = 
vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_min_v * 2);
             // test EQ
             // std::cout << "test double EQ value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -591,9 +619,9 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [-Infinity, normal]
     {
         std::cout << "========test special range: [-Infinity, normal]\n";
-        double zonemap_max_v = std::numeric_limits<float>::max();
-        min_field->set_raw_value(&neg_inf, sizeof(neg_inf));
-        max_field->set_raw_value(&zonemap_max_v, sizeof(zonemap_max_v));
+        double zonemap_max_v = std::numeric_limits<double>::max();
+        min_field->set_raw_value(&neg_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
+        max_field->set_raw_value(&zonemap_max_v, sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -637,8 +665,14 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, true);
 
-        std::vector<double> test_values_in_range = {
-                neg_inf, min, zonemap_max_v, -123456.789012345, -0.0, 0.0, 
123456.789012345,
+        std::vector<vectorized::Field> test_values_in_range = {
+                neg_inf,
+                min,
+                vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_max_v),
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_in_range) {
             // test EQ
@@ -663,7 +697,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test GT
             // std::cout << "test double GT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::GT>(
-                    {min_field.get(), max_field.get()}, v, v != zonemap_max_v);
+                    {min_field.get(), max_field.get()}, v,
+                    v.template get<TYPE_DOUBLE>() != zonemap_max_v);
 
             // test GE
             // std::cout << "test double GE value: " << v << std::endl;
@@ -672,7 +707,7 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         }
         // test values out of zonemap range
         {
-            double v = zonemap_max_v * 2;
+            auto v = 
vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_max_v * 2);
             // test EQ
             // std::cout << "test double EQ value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -706,9 +741,9 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [normal, NaN]
     {
         std::cout << "========test special range: [normal, NaN]\n";
-        double zonemap_min_v = std::numeric_limits<float>::lowest();
-        min_field->set_raw_value(&zonemap_min_v, sizeof(zonemap_min_v));
-        max_field->set_raw_value(&nan, sizeof(nan));
+        double zonemap_min_v = std::numeric_limits<double>::lowest();
+        min_field->set_raw_value(&zonemap_min_v, sizeof(double));
+        max_field->set_raw_value(&nan.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -752,8 +787,14 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, false);
 
-        std::vector<double> test_values_in_range = {
-                zonemap_min_v, max, pos_inf, -123456.789012345, -0.0, 0.0, 
123456.789012345,
+        std::vector<vectorized::Field> test_values_in_range = {
+                vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_min_v),
+                max,
+                pos_inf,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_in_range) {
             // test EQ
@@ -768,7 +809,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test LT
             // std::cout << "test double LT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LT>(
-                    {min_field.get(), max_field.get()}, v, v != zonemap_min_v);
+                    {min_field.get(), max_field.get()}, v,
+                    v.template get<TYPE_DOUBLE>() != zonemap_min_v);
 
             // test LE
             // std::cout << "test double LE value: " << v << std::endl;
@@ -778,7 +820,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
             // test GT
             // std::cout << "test double GT value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::GT>(
-                    {min_field.get(), max_field.get()}, v, !std::isnan(v));
+                    {min_field.get(), max_field.get()}, v,
+                    !std::isnan(v.template get<TYPE_DOUBLE>()));
 
             // test GE
             // std::cout << "test double GE value: " << v << std::endl;
@@ -788,7 +831,7 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
 
         // test values out of zonemap range
         {
-            double v = zonemap_min_v * 2;
+            auto v = 
vectorized::Field::create_field<TYPE_DOUBLE>(zonemap_min_v * 2);
             // test EQ
             // std::cout << "test double EQ value: " << v << std::endl;
             single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -822,8 +865,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [-Infinity, +Infinity]
     {
         std::cout << "========test special range: [-Infinity, +Infinity]\n";
-        min_field->set_raw_value(&neg_inf, sizeof(neg_inf));
-        max_field->set_raw_value(&pos_inf, sizeof(pos_inf));
+        min_field->set_raw_value(&neg_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
+        max_field->set_raw_value(&pos_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -867,8 +910,13 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, true);
 
-        std::vector<double> test_values_in_range = {
-                min, max, -123456.789012345, -0.0, 0.0, 123456.789012345,
+        std::vector<vectorized::Field> test_values_in_range = {
+                min,
+                max,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_in_range) {
             // test EQ
@@ -904,8 +952,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [-Infinity, NaN]
     {
         std::cout << "========test special range: [-Infinity, NaN]\n";
-        min_field->set_raw_value(&neg_inf, sizeof(neg_inf));
-        max_field->set_raw_value(&nan, sizeof(nan));
+        min_field->set_raw_value(&neg_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
+        max_field->set_raw_value(&nan.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -949,8 +997,13 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, true);
 
-        std::vector<double> test_values_in_range = {
-                min, max, -123456.789012345, -0.0, 0.0, 123456.789012345,
+        std::vector<vectorized::Field> test_values_in_range = {
+                min,
+                max,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_in_range) {
             // std::cout << "test double EQ value: " << v << std::endl;
@@ -980,8 +1033,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [-Infinity, -Infinity]
     {
         std::cout << "========test special range: [-Infinity, -Infinity]\n";
-        min_field->set_raw_value(&neg_inf, sizeof(neg_inf));
-        max_field->set_raw_value(&neg_inf, sizeof(neg_inf));
+        min_field->set_raw_value(&neg_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
+        max_field->set_raw_value(&neg_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -1025,8 +1078,13 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, true);
 
-        std::vector<double> test_values_not_in_range = {
-                min, max, -123456.789012345, -0.0, 0.0, 123456.789012345,
+        std::vector<vectorized::Field> test_values_not_in_range = {
+                min,
+                max,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_not_in_range) {
             // std::cout << "test double EQ value: " << v << std::endl;
@@ -1056,8 +1114,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [+Infinity, +Infinity]
     {
         std::cout << "========test special range: [+Infinity, +Infinity]\n";
-        min_field->set_raw_value(&pos_inf, sizeof(pos_inf));
-        max_field->set_raw_value(&pos_inf, sizeof(pos_inf));
+        min_field->set_raw_value(&pos_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
+        max_field->set_raw_value(&pos_inf.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         std::cout << "========test NaN\n";
@@ -1105,8 +1163,13 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
                 {min_field.get(), max_field.get()}, neg_inf, false);
 
         std::cout << "========test values not in range\n";
-        std::vector<double> test_values_not_in_range = {
-                min, max, -123456.789012345, -0.0, 0.0, 123456.789012345,
+        std::vector<vectorized::Field> test_values_not_in_range = {
+                min,
+                max,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_not_in_range) {
             // std::cout << "test double EQ value: " << v << std::endl;
@@ -1136,8 +1199,8 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
     // test special range: [NaN, NaN]
     {
         std::cout << "========test special range: [NaN, NaN]\n";
-        min_field->set_raw_value(&nan, sizeof(nan));
-        max_field->set_raw_value(&nan, sizeof(nan));
+        min_field->set_raw_value(&nan.template get<TYPE_DOUBLE>(), 
sizeof(double));
+        max_field->set_raw_value(&nan.template get<TYPE_DOUBLE>(), 
sizeof(double));
 
         // test NaN
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::EQ>(
@@ -1181,8 +1244,13 @@ TEST_F(BlockColumnPredicateTest, 
test_double_single_column_predicate) {
         single_column_predicate_test_func<TYPE_DOUBLE, PredicateType::LE>(
                 {min_field.get(), max_field.get()}, neg_inf, false);
 
-        std::vector<double> test_values_not_in_range = {
-                min, max, -123456.789012345, -0.0, 0.0, 123456.789012345,
+        std::vector<vectorized::Field> test_values_not_in_range = {
+                min,
+                max,
+                
vectorized::Field::create_field<TYPE_DOUBLE>(-123456.789012345),
+                vectorized::Field::create_field<TYPE_DOUBLE>(-0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(0.0),
+                vectorized::Field::create_field<TYPE_DOUBLE>(123456.789012345),
         };
         for (auto v : test_values_not_in_range) {
             // std::cout << "test double EQ value: " << v << std::endl;
@@ -1243,21 +1311,28 @@ TEST_F(BlockColumnPredicateTest, 
test_timestamptz_zonemap_index) {
             TimestampTzValue tz {};
             EXPECT_TRUE(tz.from_string(StringRef {str}, &time_zone, params, 
0));
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::NE>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::LT>(
-                    {min_field.get(), max_field.get()}, tz, tz != 
zonemap_min_v);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), tz 
!= zonemap_min_v);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::LE>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::GT>(
-                    {min_field.get(), max_field.get()}, tz, tz != 
zonemap_max_v);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), tz 
!= zonemap_max_v);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::GE>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
         }
         // test values out of zonemap range
         {
-            auto v = type_limit<TimestampTzValue>::min();
+            auto v = vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(
+                    type_limit<TimestampTzValue>::min());
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(
                     {min_field.get(), max_field.get()}, v, false);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::NE>(
@@ -1277,7 +1352,8 @@ TEST_F(BlockColumnPredicateTest, 
test_timestamptz_zonemap_index) {
         }
         // test values out of zonemap range
         {
-            auto v = type_limit<TimestampTzValue>::max();
+            auto v = vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(
+                    type_limit<TimestampTzValue>::max());
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(
                     {min_field.get(), max_field.get()}, v, false);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::NE>(
@@ -1312,25 +1388,30 @@ TEST_F(BlockColumnPredicateTest, 
test_timestamptz_zonemap_index) {
             TimestampTzValue tz {};
             EXPECT_TRUE(tz.from_string(StringRef {str}, &time_zone, params, 
6));
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::NE>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::LT>(
-                    {min_field.get(), max_field.get()}, tz, tz != 
zonemap_min_v);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), tz 
!= zonemap_min_v);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::LE>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::GT>(
-                    {min_field.get(), max_field.get()}, tz, tz != 
zonemap_max_v);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), tz 
!= zonemap_max_v);
             single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::GE>(
-                    {min_field.get(), max_field.get()}, tz, true);
+                    {min_field.get(), max_field.get()},
+                    vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), 
true);
         }
     }
 }
 
 template <PrimitiveType T, PredicateType PT>
 void single_column_predicate_test_func(const segment_v2::BloomFilter* bf,
-                                       typename 
PrimitiveTypeTraits<T>::CppType check_value,
-                                       bool expect_match) {
+                                       vectorized::Field&& check_value, bool 
expect_match) {
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<T, PT>(col_idx, "", check_value));
@@ -1368,26 +1449,29 @@ TEST_F(BlockColumnPredicateTest, 
test_timestamptz_bloom_filter) {
     }
 
     for (const auto& v : values) {
-        single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(bf.get(), v, true);
+        single_column_predicate_test_func<TYPE_TIMESTAMPTZ, PredicateType::EQ>(
+                bf.get(), 
vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(v), true);
     }
     {
         auto str = "0000-01-01 00:00:00";
         TimestampTzValue tz {};
         EXPECT_TRUE(tz.from_string(StringRef {str}, &time_zone, params, 0));
-        single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(bf.get(), tz, false);
+        single_column_predicate_test_func<TYPE_TIMESTAMPTZ, PredicateType::EQ>(
+                bf.get(), 
vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), false);
     }
     {
         auto str = "9999-12-31 23:59:59.999999";
         TimestampTzValue tz {};
         EXPECT_TRUE(tz.from_string(StringRef {str}, &time_zone, params, 6));
-        single_column_predicate_test_func<TYPE_TIMESTAMPTZ, 
PredicateType::EQ>(bf.get(), tz, false);
+        single_column_predicate_test_func<TYPE_TIMESTAMPTZ, PredicateType::EQ>(
+                bf.get(), 
vectorized::Field::create_field<TYPE_TIMESTAMPTZ>(tz), false);
     }
 }
 
 TEST_F(BlockColumnPredicateTest, PARQUET_COMPARISON_PREDICATE) {
     { // INT
      {// EQ
-      int value = 5;
+      auto value = vectorized::Field::create_field<TYPE_INT>(5);
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<TYPE_INT, PredicateType::EQ>(col_idx, 
"", value));
@@ -1464,7 +1548,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
 }
 {
     // NE
-    int value = 5;
+    auto value = vectorized::Field::create_field<TYPE_INT>(5);
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<TYPE_INT, PredicateType::NE>(col_idx, 
"", value));
@@ -1533,7 +1617,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
 }
 {
     // GE
-    int value = 5;
+    auto value = vectorized::Field::create_field<TYPE_INT>(5);
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<TYPE_INT, PredicateType::GE>(col_idx, 
"", value));
@@ -1602,7 +1686,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
 }
 {
     // LE
-    int value = 5;
+    auto value = vectorized::Field::create_field<TYPE_INT>(5);
     int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<TYPE_INT, PredicateType::LE>(col_idx, 
"", value));
@@ -1674,7 +1758,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
     // FLOAT
     {
         // EQ
-        float value = 5.0;
+        auto value = vectorized::Field::create_field<TYPE_FLOAT>(5.0);
         int col_idx = 0;
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_FLOAT, 
PredicateType::EQ>(col_idx, "", value));
@@ -1768,7 +1852,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
     }
     {
         // NE
-        float value = 5;
+        auto value = vectorized::Field::create_field<TYPE_FLOAT>(5.0);
         int col_idx = 0;
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_FLOAT, 
PredicateType::NE>(col_idx, "", value));
@@ -1837,7 +1921,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
     }
     {
         // GE
-        float value = 5.0;
+        auto value = vectorized::Field::create_field<TYPE_FLOAT>(5.0);
         int col_idx = 0;
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_FLOAT, 
PredicateType::GE>(col_idx, "", value));
@@ -1906,7 +1990,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE) {
     }
     {
         // LE
-        float value = 5.0;
+        auto value = vectorized::Field::create_field<TYPE_FLOAT>(5.0);
         int col_idx = 0;
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_FLOAT, 
PredicateType::LE>(col_idx, "", value));
@@ -2075,7 +2159,7 @@ TEST_F(BlockColumnPredicateTest, PARQUET_IN_PREDICATE) {
 }
 
 TEST_F(BlockColumnPredicateTest, PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
-    const int value = 42;
+    auto value = vectorized::Field::create_field<TYPE_INT>(42);
     const int col_idx = 0;
     std::shared_ptr<ColumnPredicate> pred(
             new ComparisonPredicateBase<TYPE_INT, PredicateType::EQ>(col_idx, 
"", value));
@@ -2103,8 +2187,8 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
                     current_stat->col_schema = parquet_field.get();
                     current_stat->is_all_null = false;
                     current_stat->has_null = false;
-                    current_stat->encoded_min_value = encode_value(value);
-                    current_stat->encoded_max_value = encode_value(value);
+                    current_stat->encoded_min_value = 
encode_value(value.template get<TYPE_INT>());
+                    current_stat->encoded_max_value = 
encode_value(value.template get<TYPE_INT>());
                     return true;
                 };
         stat.get_stat_func = &get_stat_func;
@@ -2121,7 +2205,9 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
                                 current_stat->bloom_filter.get());
                         Status st = bloom->init(256, 
segment_v2::HashStrategyPB::XX_HASH_64);
                         EXPECT_TRUE(st.ok());
-                        bloom->add_bytes(reinterpret_cast<const 
char*>(&value), sizeof(value));
+                        bloom->add_bytes(
+                                reinterpret_cast<const char*>(&value.template 
get<TYPE_INT>()),
+                                sizeof(value.template get<TYPE_INT>()));
                     }
                     return true;
                 };
@@ -2142,8 +2228,8 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
                     current_stat->col_schema = parquet_field.get();
                     current_stat->is_all_null = false;
                     current_stat->has_null = false;
-                    current_stat->encoded_min_value = encode_value(value);
-                    current_stat->encoded_max_value = encode_value(value);
+                    current_stat->encoded_min_value = 
encode_value(value.template get<TYPE_INT>());
+                    current_stat->encoded_max_value = 
encode_value(value.template get<TYPE_INT>());
                     return true;
                 };
         stat.get_stat_func = &get_stat_func;
@@ -2160,7 +2246,7 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
                                 current_stat->bloom_filter.get());
                         Status st = bloom->init(256, 
segment_v2::HashStrategyPB::XX_HASH_64);
                         EXPECT_TRUE(st.ok());
-                        int other_value = value + 10;
+                        int other_value = value.template get<TYPE_INT>() + 10;
                         bloom->add_bytes(reinterpret_cast<const 
char*>(&other_value),
                                          sizeof(other_value));
                     }
@@ -2183,8 +2269,8 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
                     current_stat->col_schema = parquet_field.get();
                     current_stat->is_all_null = false;
                     current_stat->has_null = false;
-                    current_stat->encoded_min_value = encode_value(value);
-                    current_stat->encoded_max_value = encode_value(value);
+                    current_stat->encoded_min_value = 
encode_value(value.template get<TYPE_INT>());
+                    current_stat->encoded_max_value = 
encode_value(value.template get<TYPE_INT>());
                     return true;
                 };
         stat.get_stat_func = &get_stat_func;
@@ -2213,8 +2299,8 @@ TEST_F(BlockColumnPredicateTest, 
PARQUET_COMPARISON_PREDICATE_BLOOM_FILTER) {
                     current_stat->col_schema = parquet_field.get();
                     current_stat->is_all_null = false;
                     current_stat->has_null = false;
-                    int min_value = value + 5;
-                    int max_value = value + 10;
+                    int min_value = value.template get<TYPE_INT>() + 5;
+                    int max_value = value.template get<TYPE_INT>() + 10;
                     current_stat->encoded_min_value = encode_value(min_value);
                     current_stat->encoded_max_value = encode_value(max_value);
                     return true;
@@ -2464,7 +2550,7 @@ TEST_F(BlockColumnPredicateTest, COMBINED_PREDICATE) {
 
         std::unique_ptr<SingleColumnBlockPredicate> true_predicate;
         int col_idx = 0;
-        int value = 5;
+        auto value = vectorized::Field::create_field<TYPE_INT>(5);
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(col_idx, "", value));
         true_predicate = std::make_unique<SingleColumnBlockPredicate>(pred);
@@ -2509,7 +2595,7 @@ TEST_F(BlockColumnPredicateTest, COMBINED_PREDICATE) {
 
         std::unique_ptr<SingleColumnBlockPredicate> true_predicate;
         int col_idx = 0;
-        int value = 5;
+        auto value = vectorized::Field::create_field<TYPE_INT>(5);
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(col_idx, "", value));
         true_predicate = std::make_unique<SingleColumnBlockPredicate>(pred);
@@ -2554,7 +2640,7 @@ TEST_F(BlockColumnPredicateTest, COMBINED_PREDICATE) {
 
         std::unique_ptr<SingleColumnBlockPredicate> true_predicate;
         int col_idx = 0;
-        int value = 5;
+        auto value = vectorized::Field::create_field<TYPE_INT>(5);
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(col_idx, "", value));
         true_predicate = std::make_unique<SingleColumnBlockPredicate>(pred);
@@ -2599,7 +2685,7 @@ TEST_F(BlockColumnPredicateTest, COMBINED_PREDICATE) {
 
         std::unique_ptr<SingleColumnBlockPredicate> false_predicate2;
         int col_idx = 0;
-        int value = 5;
+        auto value = vectorized::Field::create_field<TYPE_INT>(5);
         std::shared_ptr<ColumnPredicate> pred(
                 new ComparisonPredicateBase<TYPE_INT, 
PredicateType::NE>(col_idx, "", value));
         false_predicate2 = std::make_unique<SingleColumnBlockPredicate>(pred);
@@ -2643,7 +2729,7 @@ TEST_F(BlockColumnPredicateTest, COMBINED_PREDICATE) {
         OrBlockColumnPredicate or_block_column_pred;
 
         int col_idx = 0;
-        int value = 5;
+        auto value = vectorized::Field::create_field<TYPE_INT>(5);
         std::unique_ptr<SingleColumnBlockPredicate> false_predicate;
         std::shared_ptr<ColumnPredicate> pred2(
                 new ComparisonPredicateBase<TYPE_INT, 
PredicateType::NE>(col_idx, "", value));
diff --git a/be/test/olap/date_bloom_filter_test.cpp 
b/be/test/olap/date_bloom_filter_test.cpp
index b5539fff686..b95697365dd 100644
--- a/be/test/olap/date_bloom_filter_test.cpp
+++ b/be/test/olap/date_bloom_filter_test.cpp
@@ -180,7 +180,8 @@ TEST_F(DateBloomFilterTest, query_index_test) {
         auto test = [&](const std::string& query_string, bool result) {
             auto date = timestamp_from_date(query_string);
             std::unique_ptr<ComparisonPredicateBase<TYPE_DATE, 
PredicateType::EQ>> date_pred(
-                    new ComparisonPredicateBase<TYPE_DATE, 
PredicateType::EQ>(0, "", date));
+                    new ComparisonPredicateBase<TYPE_DATE, PredicateType::EQ>(
+                            0, "", 
vectorized::Field::create_field<TYPE_DATE>(date)));
             EXPECT_EQ(date_pred->evaluate_and(bf.get()), result);
         };
         test("2024-11-08", true);
@@ -202,7 +203,8 @@ TEST_F(DateBloomFilterTest, query_index_test) {
         auto test = [&](const std::string& query_string, bool result) {
             auto datetime = timestamp_from_datetime(query_string);
             std::unique_ptr<ComparisonPredicateBase<TYPE_DATETIME, 
PredicateType::EQ>> date_pred(
-                    new ComparisonPredicateBase<TYPE_DATETIME, 
PredicateType::EQ>(0, "", datetime));
+                    new ComparisonPredicateBase<TYPE_DATETIME, 
PredicateType::EQ>(
+                            0, "", 
vectorized::Field::create_field<TYPE_DATETIME>(datetime)));
             EXPECT_EQ(date_pred->evaluate_and(bf.get()), result);
         };
         test("2024-11-08 09:00:00", true);
diff --git a/be/test/vec/exec/format/parquet/parquet_expr_test.cpp 
b/be/test/vec/exec/format/parquet/parquet_expr_test.cpp
index c078401dc40..fb3d2754d7f 100644
--- a/be/test/vec/exec/format/parquet/parquet_expr_test.cpp
+++ b/be/test/vec/exec/format/parquet/parquet_expr_test.cpp
@@ -1053,19 +1053,19 @@ TEST_F(ParquetExprTest, test_expr_push_down_and) {
     {
         pred->add_column_predicate(SingleColumnBlockPredicate::create_unique(
                 ComparisonPredicateBase<TYPE_BIGINT, 
PredicateType::LE>::create_shared(
-                        2, "", 10000000002)));
+                        2, "", 
Field::create_field<TYPE_BIGINT>(10000000002))));
     }
 
     { // x > 100
         pred->add_column_predicate(SingleColumnBlockPredicate::create_unique(
-                ComparisonPredicateBase<TYPE_BIGINT, 
PredicateType::GT>::create_shared(2, "",
-                                                                               
        100)));
+                ComparisonPredicateBase<TYPE_BIGINT, 
PredicateType::GT>::create_shared(
+                        2, "", Field::create_field<TYPE_BIGINT>(100))));
     }
 
     { // x >= 900
         pred->add_column_predicate(SingleColumnBlockPredicate::create_unique(
-                ComparisonPredicateBase<TYPE_BIGINT, 
PredicateType::GE>::create_shared(2, "",
-                                                                               
        900)));
+                ComparisonPredicateBase<TYPE_BIGINT, 
PredicateType::GE>::create_shared(
+                        2, "", Field::create_field<TYPE_BIGINT>(900))));
     }
 
     const std::function<bool(const FieldSchema*, 
ParquetPredicate::ColumnStat*)>& get_stat_func =
@@ -1160,7 +1160,8 @@ TEST_F(ParquetExprTest, test_expr_push_down_or_string) {
 TEST_F(ParquetExprTest, test_bloom_filter_skipped_when_range_miss) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1202,7 +1203,8 @@ TEST_F(ParquetExprTest, 
test_bloom_filter_skipped_when_range_miss) {
 TEST_F(ParquetExprTest, test_bloom_filter_rejects_value) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1253,7 +1255,8 @@ TEST_F(ParquetExprTest, test_bloom_filter_rejects_value) {
 TEST_F(ParquetExprTest, test_bloom_filter_accepts_value) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1304,7 +1307,8 @@ TEST_F(ParquetExprTest, test_bloom_filter_accepts_value) {
 TEST_F(ParquetExprTest, 
test_bloom_filter_skipped_when_min_max_evicts_rowgroup) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1347,7 +1351,8 @@ TEST_F(ParquetExprTest, 
test_bloom_filter_skipped_when_min_max_evicts_rowgroup)
 TEST_F(ParquetExprTest, test_bloom_filter_loader_called_when_min_max_allows) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1398,7 +1403,8 @@ TEST_F(ParquetExprTest, 
test_bloom_filter_loader_called_when_min_max_allows) {
 TEST_F(ParquetExprTest, 
test_bloom_filter_loader_not_called_when_missing_metadata) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1440,7 +1446,8 @@ TEST_F(ParquetExprTest, 
test_bloom_filter_loader_not_called_when_missing_metadat
 TEST_F(ParquetExprTest, test_bloom_filter_loader_resets_on_failure) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1487,7 +1494,8 @@ TEST_F(ParquetExprTest, 
test_bloom_filter_loader_resets_on_failure) {
 TEST_F(ParquetExprTest, test_bloom_filter_not_supported_type) {
     const int col_idx = 6; // bool column
     const bool predicate_value = true;
-    ComparisonPredicateBase<TYPE_BOOLEAN, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BOOLEAN, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BOOLEAN>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1527,7 +1535,8 @@ TEST_F(ParquetExprTest, 
test_bloom_filter_not_supported_type) {
 TEST_F(ParquetExprTest, test_bloom_filter_min_max_overlap_but_no_loader) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;
@@ -1664,7 +1673,8 @@ TEST_F(ParquetExprTest, 
test_in_list_predicate_no_loader_on_range_miss) {
 TEST_F(ParquetExprTest, test_bloom_filter_reused_after_first_load) {
     const int col_idx = 2;
     const int64_t predicate_value = 10000000001;
-    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(col_idx, 
"", predicate_value);
+    ComparisonPredicateBase<TYPE_BIGINT, PredicateType::EQ> eq_pred(
+            col_idx, "", 
vectorized::Field::create_field<TYPE_BIGINT>(predicate_value));
 
     ParquetPredicate::ColumnStat stat;
     stat.ctz = &ctz;


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

Reply via email to