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

yiguolei 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 06d0035c02 [refactor](non-vec)remove schema change related non-vec 
code (#15313)
06d0035c02 is described below

commit 06d0035c0295902dd068aeb7aebe065d9f5a2719
Author: yiguolei <[email protected]>
AuthorDate: Fri Dec 23 18:33:04 2022 +0800

    [refactor](non-vec)remove schema change related non-vec code (#15313)
    
    
    
    Co-authored-by: yiguolei <[email protected]>
---
 be/src/olap/memtable.cpp                       |    3 +-
 be/src/olap/row_block.h                        |    4 -
 be/src/olap/rowset/beta_rowset_reader.cpp      |    1 -
 be/src/olap/rowset/beta_rowset_reader.h        |    3 -
 be/src/olap/schema_change.cpp                  |  824 ------------------
 be/src/olap/schema_change.h                    |   29 -
 be/src/util/tuple_row_zorder_compare.cpp       |  204 -----
 be/src/util/tuple_row_zorder_compare.h         |   29 -
 be/test/CMakeLists.txt                         |    1 -
 be/test/util/tuple_row_zorder_compare_test.cpp | 1111 ------------------------
 10 files changed, 1 insertion(+), 2208 deletions(-)

diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp
index 63575a3bb2..fda31df925 100644
--- a/be/src/olap/memtable.cpp
+++ b/be/src/olap/memtable.cpp
@@ -86,8 +86,7 @@ MemTable::MemTable(TabletSharedPtr tablet, Schema* schema, 
const TabletSchema* t
             _aggregate_two_row_fn = &MemTable::_aggregate_two_row;
         }
         if (tablet_schema->sort_type() == SortType::ZORDER) {
-            _row_comparator = std::make_shared<TupleRowZOrderComparator>(
-                    _schema, tablet_schema->sort_col_num());
+            LOG(FATAL) << "ZOrder not supported";
         } else {
             _row_comparator = std::make_shared<RowCursorComparator>(_schema);
         }
diff --git a/be/src/olap/row_block.h b/be/src/olap/row_block.h
index 0d9ed4c24a..eead5cb9cf 100644
--- a/be/src/olap/row_block.h
+++ b/be/src/olap/row_block.h
@@ -49,10 +49,6 @@ struct RowBlockInfo {
 // 3. 给定查询的key,在RowBlock内做二分查找,返回起点的行偏移;
 // 4. 向量化的条件过滤下推到RowBlock级别进行,因此增加完成过滤的数据读取接口
 class RowBlock {
-    // Please keep these classes as 'friend'.  They have to use lots of 
private fields for
-    // faster operation.
-    friend class RowBlockChanger;
-
 public:
     RowBlock(TabletSchemaSPtr schema);
 
diff --git a/be/src/olap/rowset/beta_rowset_reader.cpp 
b/be/src/olap/rowset/beta_rowset_reader.cpp
index e5d461210e..1c9cf8c449 100644
--- a/be/src/olap/rowset/beta_rowset_reader.cpp
+++ b/be/src/olap/rowset/beta_rowset_reader.cpp
@@ -215,7 +215,6 @@ Status BetaRowsetReader::init(RowsetReaderContext* 
read_context) {
         return Status::Error<ROWSET_READER_INIT>();
     }
     _iterator.reset(final_iterator);
-
     return Status::OK();
 }
 
diff --git a/be/src/olap/rowset/beta_rowset_reader.h 
b/be/src/olap/rowset/beta_rowset_reader.h
index c80d258d3b..2812339b10 100644
--- a/be/src/olap/rowset/beta_rowset_reader.h
+++ b/be/src/olap/rowset/beta_rowset_reader.h
@@ -85,9 +85,6 @@ private:
 
     std::unique_ptr<RowwiseIterator> _iterator;
 
-    std::shared_ptr<RowBlockV2> _input_block;
-    std::unique_ptr<RowCursor> _row;
-
     // make sure this handle is initialized and valid before
     // reading data.
     SegmentCacheHandle _segment_cache_handle;
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index f4015fdcb3..4f8595b168 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -47,50 +47,6 @@ using namespace ErrorCode;
 
 constexpr int ALTER_TABLE_BATCH_SIZE = 4096;
 
-class RowBlockSorter {
-public:
-    explicit RowBlockSorter(RowBlockAllocator* allocator);
-    virtual ~RowBlockSorter();
-    size_t num_rows() { return _swap_row_block != nullptr ? 
_swap_row_block->capacity() : 0; }
-
-    bool sort(RowBlock** row_block);
-
-private:
-    static bool _row_cursor_comparator(const std::unique_ptr<RowCursor>& a,
-                                       const std::unique_ptr<RowCursor>& b) {
-        return compare_row(*a, *b) < 0;
-    }
-
-    RowBlockAllocator* _row_block_allocator;
-    RowBlock* _swap_row_block;
-};
-
-class RowBlockMerger {
-public:
-    explicit RowBlockMerger(TabletSharedPtr tablet);
-    virtual ~RowBlockMerger();
-
-    bool merge(const std::vector<RowBlock*>& row_block_arr, RowsetWriter* 
rowset_writer,
-               uint64_t* merged_rows);
-
-private:
-    struct MergeElement {
-        bool operator<(const MergeElement& other) const {
-            return compare_row(*row_cursor, *other.row_cursor) > 0;
-        }
-
-        const RowBlock* row_block;
-        RowCursor* row_cursor;
-        uint32_t row_block_index;
-    };
-
-    bool _make_heap(const std::vector<RowBlock*>& row_block_arr);
-    void _pop_heap();
-
-    TabletSharedPtr _tablet;
-    std::priority_queue<MergeElement> _heap;
-};
-
 class MultiBlockMerger {
 public:
     MultiBlockMerger(TabletSharedPtr tablet) : _tablet(tablet), _cmp(tablet) {}
@@ -261,524 +217,6 @@ ColumnMapping* 
RowBlockChanger::get_mutable_column_mapping(size_t column_index)
     return &(_schema_mapping[column_index]);
 }
 
-#define TYPE_REINTERPRET_CAST(FromType, ToType)                         \
-    {                                                                   \
-        size_t row_num = ref_block->row_block_info().row_num;           \
-        for (size_t row = 0, mutable_row = 0; row < row_num; ++row) {   \
-            char* ref_ptr = ref_block->field_ptr(row, ref_column);      \
-            char* new_ptr = mutable_block->field_ptr(mutable_row++, i); \
-            *new_ptr = *ref_ptr;                                        \
-            *(ToType*)(new_ptr + 1) = *(FromType*)(ref_ptr + 1);        \
-        }                                                               \
-        break;                                                          \
-    }
-
-#define LARGEINT_REINTERPRET_CAST(FromType, ToType)                     \
-    {                                                                   \
-        size_t row_num = ref_block->row_block_info().row_num;           \
-        for (size_t row = 0, mutable_row = 0; row < row_num; ++row) {   \
-            char* ref_ptr = ref_block->field_ptr(row, ref_column);      \
-            char* new_ptr = mutable_block->field_ptr(mutable_row++, i); \
-            *new_ptr = *ref_ptr;                                        \
-            ToType new_value = *(FromType*)(ref_ptr + 1);               \
-            memcpy(new_ptr + 1, &new_value, sizeof(ToType));            \
-        }                                                               \
-        break;                                                          \
-    }
-
-#define CONVERT_FROM_TYPE(from_type)                                           
                  \
-    {                                                                          
                  \
-        switch (newtype) {                                                     
                  \
-        case OLAP_FIELD_TYPE_TINYINT:                                          
                  \
-            TYPE_REINTERPRET_CAST(from_type, int8_t);                          
                  \
-        case OLAP_FIELD_TYPE_UNSIGNED_TINYINT:                                 
                  \
-            TYPE_REINTERPRET_CAST(from_type, uint8_t);                         
                  \
-        case OLAP_FIELD_TYPE_SMALLINT:                                         
                  \
-            TYPE_REINTERPRET_CAST(from_type, int16_t);                         
                  \
-        case OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:                                
                  \
-            TYPE_REINTERPRET_CAST(from_type, uint16_t);                        
                  \
-        case OLAP_FIELD_TYPE_INT:                                              
                  \
-            TYPE_REINTERPRET_CAST(from_type, int32_t);                         
                  \
-        case OLAP_FIELD_TYPE_UNSIGNED_INT:                                     
                  \
-            TYPE_REINTERPRET_CAST(from_type, uint32_t);                        
                  \
-        case OLAP_FIELD_TYPE_BIGINT:                                           
                  \
-            TYPE_REINTERPRET_CAST(from_type, int64_t);                         
                  \
-        case OLAP_FIELD_TYPE_UNSIGNED_BIGINT:                                  
                  \
-            TYPE_REINTERPRET_CAST(from_type, uint64_t);                        
                  \
-        case OLAP_FIELD_TYPE_LARGEINT:                                         
                  \
-            LARGEINT_REINTERPRET_CAST(from_type, int128_t);                    
                  \
-        case OLAP_FIELD_TYPE_FLOAT:                                            
                  \
-            TYPE_REINTERPRET_CAST(from_type, float);                           
                  \
-        case OLAP_FIELD_TYPE_DOUBLE:                                           
                  \
-            TYPE_REINTERPRET_CAST(from_type, double);                          
                  \
-        default:                                                               
                  \
-            LOG(WARNING) << "the column type which was altered to was 
unsupported."              \
-                         << " origin_type="                                    
                  \
-                         << 
ref_block->tablet_schema()->column(ref_column).type()                \
-                         << ", alter_type=" << 
mutable_block->tablet_schema()->column(i).type(); \
-            return Status::Error<SCHEMA_CHANGE_INFO_INVALID>();                
                  \
-        }                                                                      
                  \
-        break;                                                                 
                  \
-    }
-
-#define ASSIGN_DEFAULT_VALUE(length)                                           
 \
-    case length: {                                                             
 \
-        for (size_t row = 0; row < ref_block.row_block_info().row_num; ++row) 
{ \
-            memcpy(buf, _schema_mapping[i].default_value->ptr(), length);      
 \
-            buf += length;                                                     
 \
-        }                                                                      
 \
-        break;                                                                 
 \
-    }
-
-struct ConvertTypeMapHash {
-    size_t operator()(const std::pair<FieldType, FieldType>& pair) const {
-        return (pair.first + 31) ^ pair.second;
-    }
-};
-
-class ConvertTypeResolver {
-    DECLARE_SINGLETON(ConvertTypeResolver);
-
-public:
-    bool get_convert_type_info(const FieldType from_type, const FieldType 
to_type) const {
-        return _convert_type_set.find(std::make_pair(from_type, to_type)) !=
-               _convert_type_set.end();
-    }
-
-    template <FieldType from_type, FieldType to_type>
-    void add_convert_type_mapping() {
-        _convert_type_set.emplace(std::make_pair(from_type, to_type));
-    }
-
-private:
-    using convert_type_pair = std::pair<FieldType, FieldType>;
-    std::unordered_set<convert_type_pair, ConvertTypeMapHash> 
_convert_type_set;
-
-    DISALLOW_COPY_AND_ASSIGN(ConvertTypeResolver);
-};
-
-ConvertTypeResolver::ConvertTypeResolver() {
-    // from char type
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_TINYINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_SMALLINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_INT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_BIGINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_LARGEINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_FLOAT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_DOUBLE>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_DATE>();
-
-    // supported type convert should annotate in doc:
-    // 
http://doris.apache.org/master/zh-CN/sql-reference/sql-statements/Data%20Definition/ALTER%20TABLE.html#description
-    // If type convert is supported here, you should check 
fe/src/main/java/org/apache/doris/catalog/ColumnType.java to supported it either
-    // from varchar type
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, 
OLAP_FIELD_TYPE_TINYINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, 
OLAP_FIELD_TYPE_SMALLINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, OLAP_FIELD_TYPE_INT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, 
OLAP_FIELD_TYPE_BIGINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, 
OLAP_FIELD_TYPE_LARGEINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, OLAP_FIELD_TYPE_FLOAT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, 
OLAP_FIELD_TYPE_DOUBLE>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, OLAP_FIELD_TYPE_DATE>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_VARCHAR, 
OLAP_FIELD_TYPE_STRING>();
-
-    // to varchar type
-    add_convert_type_mapping<OLAP_FIELD_TYPE_TINYINT, 
OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_SMALLINT, 
OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_INT, OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_BIGINT, 
OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_LARGEINT, 
OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_FLOAT, OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_DOUBLE, 
OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_DECIMAL, 
OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_VARCHAR>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, 
OLAP_FIELD_TYPE_VARCHAR>();
-
-    // from string
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, 
OLAP_FIELD_TYPE_TINYINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, 
OLAP_FIELD_TYPE_SMALLINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, OLAP_FIELD_TYPE_INT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, OLAP_FIELD_TYPE_BIGINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, 
OLAP_FIELD_TYPE_LARGEINT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, OLAP_FIELD_TYPE_FLOAT>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, OLAP_FIELD_TYPE_DOUBLE>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, OLAP_FIELD_TYPE_DATE>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, 
OLAP_FIELD_TYPE_VARCHAR>();
-
-    // to string
-    add_convert_type_mapping<OLAP_FIELD_TYPE_TINYINT, 
OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_SMALLINT, 
OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_INT, OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_BIGINT, OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_LARGEINT, 
OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_FLOAT, OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_DOUBLE, OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_DECIMAL, 
OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_STRING>();
-    add_convert_type_mapping<OLAP_FIELD_TYPE_STRING, OLAP_FIELD_TYPE_STRING>();
-
-    add_convert_type_mapping<OLAP_FIELD_TYPE_DATE, OLAP_FIELD_TYPE_DATETIME>();
-
-    add_convert_type_mapping<OLAP_FIELD_TYPE_DATETIME, OLAP_FIELD_TYPE_DATE>();
-
-    add_convert_type_mapping<OLAP_FIELD_TYPE_FLOAT, OLAP_FIELD_TYPE_DOUBLE>();
-
-    add_convert_type_mapping<OLAP_FIELD_TYPE_INT, OLAP_FIELD_TYPE_DATE>();
-}
-
-ConvertTypeResolver::~ConvertTypeResolver() = default;
-
-bool to_bitmap(RowCursor* read_helper, RowCursor* write_helper, const 
TabletColumn& ref_column,
-               int field_idx, int ref_field_idx, MemPool* mem_pool) {
-    write_helper->set_not_null(field_idx);
-    BitmapValue bitmap;
-    if (!read_helper->is_null(ref_field_idx)) {
-        uint64_t origin_value;
-        char* src = read_helper->cell_ptr(ref_field_idx);
-        switch (ref_column.type()) {
-        case OLAP_FIELD_TYPE_TINYINT:
-            if (*(int8_t*)src < 0) {
-                LOG(WARNING)
-                        << "The input: " << *(int8_t*)src
-                        << " is not valid, to_bitmap only support bigint value 
from 0 to "
-                           "18446744073709551615 currently, cannot create MV 
with to_bitmap on "
-                           "column with negative values.";
-                return false;
-            }
-            origin_value = *(int8_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_UNSIGNED_TINYINT:
-            origin_value = *(uint8_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_SMALLINT:
-            if (*(int16_t*)src < 0) {
-                LOG(WARNING)
-                        << "The input: " << *(int16_t*)src
-                        << " is not valid, to_bitmap only support bigint value 
from 0 to "
-                           "18446744073709551615 currently, cannot create MV 
with to_bitmap on "
-                           "column with negative values.";
-                return false;
-            }
-            origin_value = *(int16_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:
-            origin_value = *(uint16_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_INT:
-            if (*(int32_t*)src < 0) {
-                LOG(WARNING)
-                        << "The input: " << *(int32_t*)src
-                        << " is not valid, to_bitmap only support bigint value 
from 0 to "
-                           "18446744073709551615 currently, cannot create MV 
with to_bitmap on "
-                           "column with negative values.";
-                return false;
-            }
-            origin_value = *(int32_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_UNSIGNED_INT:
-            origin_value = *(uint32_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_BIGINT:
-            if (*(int64_t*)src < 0) {
-                LOG(WARNING)
-                        << "The input: " << *(int64_t*)src
-                        << " is not valid, to_bitmap only support bigint value 
from 0 to "
-                           "18446744073709551615 currently, cannot create MV 
with to_bitmap on "
-                           "column with negative values.";
-                return false;
-            }
-            origin_value = *(int64_t*)src;
-            break;
-        case OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
-            origin_value = *(uint64_t*)src;
-            break;
-        default:
-            LOG(WARNING) << "the column type which was altered from was 
unsupported."
-                         << " from_type=" << ref_column.type();
-            return false;
-        }
-        bitmap.add(origin_value);
-    }
-    char* buf = 
reinterpret_cast<char*>(mem_pool->allocate(bitmap.getSizeInBytes()));
-    Slice dst(buf, bitmap.getSizeInBytes());
-    bitmap.write(dst.data);
-    write_helper->set_field_content(field_idx, reinterpret_cast<char*>(&dst), 
mem_pool);
-    return true;
-}
-
-bool hll_hash(RowCursor* read_helper, RowCursor* write_helper, const 
TabletColumn& ref_column,
-              int field_idx, int ref_field_idx, MemPool* mem_pool) {
-    write_helper->set_not_null(field_idx);
-    HyperLogLog hll;
-    if (!read_helper->is_null(ref_field_idx)) {
-        uint64_t hash_value;
-
-        switch (ref_column.type()) {
-        case OLAP_FIELD_TYPE_CHAR: {
-            int p = ref_column.length() - 1;
-            Slice* slice = 
reinterpret_cast<Slice*>(read_helper->cell_ptr(ref_field_idx));
-            char* buf = slice->data;
-            while (p >= 0 && buf[p] == '\0') {
-                p--;
-            }
-            slice->size = p + 1;
-        }
-
-        case OLAP_FIELD_TYPE_VARCHAR:
-        case OLAP_FIELD_TYPE_STRING: {
-            Slice slice = 
*reinterpret_cast<Slice*>(read_helper->cell_ptr(ref_field_idx));
-            hash_value = HashUtil::murmur_hash64A(slice.data, slice.size, 
HashUtil::MURMUR_SEED);
-            break;
-        }
-        case OLAP_FIELD_TYPE_BOOL:
-        case OLAP_FIELD_TYPE_TINYINT:
-        case OLAP_FIELD_TYPE_UNSIGNED_TINYINT:
-        case OLAP_FIELD_TYPE_SMALLINT:
-        case OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:
-        case OLAP_FIELD_TYPE_INT:
-        case OLAP_FIELD_TYPE_UNSIGNED_INT:
-        case OLAP_FIELD_TYPE_BIGINT:
-        case OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
-        case OLAP_FIELD_TYPE_LARGEINT:
-        case OLAP_FIELD_TYPE_FLOAT:
-        case OLAP_FIELD_TYPE_DOUBLE:
-        case OLAP_FIELD_TYPE_DISCRETE_DOUBLE:
-        case OLAP_FIELD_TYPE_DATE:
-        case OLAP_FIELD_TYPE_DATETIME: {
-            std::string ref_column_string =
-                    read_helper->column_schema(ref_field_idx)
-                            ->type_info()
-                            ->to_string(read_helper->cell_ptr(ref_field_idx));
-            hash_value = HashUtil::murmur_hash64A(
-                    ref_column_string.c_str(), ref_column_string.length(), 
HashUtil::MURMUR_SEED);
-            break;
-        }
-        default:
-            LOG(WARNING) << "fail to hll hash type : " << ref_column.type();
-            return false;
-        }
-
-        hll.update(hash_value);
-    }
-    std::string buf;
-    buf.resize(hll.max_serialized_size());
-    buf.resize(hll.serialize((uint8_t*)buf.c_str()));
-    Slice dst(buf);
-    write_helper->set_field_content(field_idx, reinterpret_cast<char*>(&dst), 
mem_pool);
-    return true;
-}
-
-bool count_field(RowCursor* read_helper, RowCursor* write_helper, const 
TabletColumn& ref_column,
-                 int field_idx, int ref_field_idx, MemPool* mem_pool) {
-    write_helper->set_not_null(field_idx);
-    int64_t count = read_helper->is_null(ref_field_idx) ? 0 : 1;
-    write_helper->set_field_content(field_idx, (char*)&count, mem_pool);
-    return true;
-}
-
-Status RowBlockChanger::change_row_block(const RowBlock* ref_block, int32_t 
data_version,
-                                         RowBlock* mutable_block,
-                                         const uint64_t* filtered_rows) const {
-    if (mutable_block == nullptr) {
-        LOG(FATAL) << "mutable block is uninitialized.";
-        return Status::Error<UNINITIALIZED>();
-    } else if (mutable_block->tablet_schema()->num_columns() != 
_schema_mapping.size()) {
-        LOG(WARNING) << "mutable block does not match with schema mapping 
rules. "
-                     << "block_schema_size=" << 
mutable_block->tablet_schema()->num_columns()
-                     << ", mapping_schema_size=" << _schema_mapping.size();
-        return Status::Error<UNINITIALIZED>();
-    }
-
-    if (mutable_block->capacity() < ref_block->row_block_info().row_num) {
-        LOG(WARNING) << "mutable block is not large enough for storing the 
changed block. "
-                     << "mutable_block_size=" << mutable_block->capacity()
-                     << ", ref_block_row_num=" << 
ref_block->row_block_info().row_num;
-        return Status::Error<UNINITIALIZED>();
-    }
-
-    mutable_block->clear();
-
-    RowCursor write_helper;
-    if (write_helper.init(mutable_block->tablet_schema()) != Status::OK()) {
-        LOG(WARNING) << "fail to init rowcursor.";
-        return Status::Error<UNINITIALIZED>();
-    }
-
-    RowCursor read_helper;
-    if (read_helper.init(ref_block->tablet_schema()) != Status::OK()) {
-        LOG(WARNING) << "fail to init rowcursor.";
-        return Status::Error<UNINITIALIZED>();
-    }
-
-    // a.1 First determine whether the data needs to be filtered, and finally 
only those marked as 1 are left as needed
-    // For those without filter, it is equivalent to leave after setting all 
to 1
-    const uint32_t row_num = ref_block->row_block_info().row_num;
-
-    // a.2 Calculate the left row num
-    uint32_t new_row_num = row_num - *filtered_rows;
-
-    const bool filter_all = (new_row_num == 0);
-
-    MemPool* mem_pool = mutable_block->mem_pool();
-    // b. According to the previous filtering information, only processes that 
are also marked as 1
-    for (size_t i = 0, len = mutable_block->tablet_schema()->num_columns(); 
!filter_all && i < len;
-         ++i) {
-        int32_t ref_column = _schema_mapping[i].ref_column;
-        if (_schema_mapping[i].ref_column >= 0) {
-            if (!_schema_mapping[i].materialized_function.empty()) {
-                bool (*_do_materialized_transform)(RowCursor*, RowCursor*, 
const TabletColumn&, int,
-                                                   int, MemPool*) = nullptr;
-                if (_schema_mapping[i].materialized_function == "to_bitmap" ||
-                    _schema_mapping[i].materialized_function == 
"to_bitmap_with_check") {
-                    _do_materialized_transform = to_bitmap;
-                } else if (_schema_mapping[i].materialized_function == 
"hll_hash") {
-                    _do_materialized_transform = hll_hash;
-                } else if (_schema_mapping[i].materialized_function == 
"count_field") {
-                    _do_materialized_transform = count_field;
-                } else {
-                    LOG(WARNING) << "error materialized view function : "
-                                 << _schema_mapping[i].materialized_function;
-                    return Status::Error<SCHEMA_CHANGE_INFO_INVALID>();
-                }
-                VLOG_NOTICE << "_schema_mapping[" << i << 
"].materialized_function : "
-                            << _schema_mapping[i].materialized_function;
-                for (size_t row_index = 0, new_row_index = 0;
-                     row_index < ref_block->row_block_info().row_num; 
++row_index) {
-                    mutable_block->get_row(new_row_index++, &write_helper);
-                    ref_block->get_row(row_index, &read_helper);
-
-                    if (!_do_materialized_transform(&read_helper, 
&write_helper,
-                                                    
ref_block->tablet_schema()->column(ref_column),
-                                                    i, 
_schema_mapping[i].ref_column, mem_pool)) {
-                        return Status::Error<DATA_QUALITY_ERR>();
-                    }
-                }
-                continue;
-            }
-
-            // new column will be assigned as referenced column
-            // check if the type of new column is equal to the older's.
-            FieldType reftype = 
ref_block->tablet_schema()->column(ref_column).type();
-            FieldType newtype = 
mutable_block->tablet_schema()->column(i).type();
-            if (newtype == reftype) {
-                // Low efficiency, you can also directly calculate the 
variable length domain copy, but it will still destroy the package
-                for (size_t row_index = 0, new_row_index = 0;
-                     row_index < ref_block->row_block_info().row_num; 
++row_index) {
-                    // Specify the new row index to be written (different from 
the read row_index)
-                    mutable_block->get_row(new_row_index++, &write_helper);
-                    ref_block->get_row(row_index, &read_helper);
-
-                    if (read_helper.is_null(ref_column)) {
-                        write_helper.set_null(i);
-                    } else {
-                        write_helper.set_not_null(i);
-                        if (newtype == OLAP_FIELD_TYPE_CHAR) {
-                            // if modify length of CHAR type, the size of 
slice should be equal
-                            // to new length.
-                            Slice* src = 
(Slice*)(read_helper.cell_ptr(ref_column));
-                            size_t size = 
mutable_block->tablet_schema()->column(i).length();
-                            char* buf = 
reinterpret_cast<char*>(mem_pool->allocate(size));
-                            memset(buf, 0, size);
-                            size_t copy_size = (size < src->size) ? size : 
src->size;
-                            memcpy(buf, src->data, copy_size);
-                            Slice dst(buf, size);
-                            write_helper.set_field_content(i, 
reinterpret_cast<char*>(&dst),
-                                                           mem_pool);
-                        } else {
-                            char* src = read_helper.cell_ptr(ref_column);
-                            write_helper.set_field_content(i, src, mem_pool);
-                        }
-                    }
-                }
-            } else if 
(ConvertTypeResolver::instance()->get_convert_type_info(reftype, newtype)) {
-                for (size_t row_index = 0, new_row_index = 0;
-                     row_index < ref_block->row_block_info().row_num; 
++row_index) {
-                    mutable_block->get_row(new_row_index++, &write_helper);
-                    ref_block->get_row(row_index, &read_helper);
-                    if (read_helper.is_null(ref_column)) {
-                        write_helper.set_null(i);
-                    } else {
-                        write_helper.set_not_null(i);
-                        const Field* ref_field = 
read_helper.column_schema(ref_column);
-                        char* ref_value = read_helper.cell_ptr(ref_column);
-                        Status st = write_helper.convert_from(i, ref_value, 
ref_field->type_info(),
-                                                              mem_pool);
-                        if (!st) {
-                            LOG(WARNING)
-                                    << "the column type which was altered from 
was unsupported."
-                                    << "status:" << st.to_string() << ", 
from_type=" << reftype
-                                    << ", to_type=" << newtype;
-                            return st;
-                        }
-                    }
-                }
-                // Write column i from ref_column.
-            } else {
-                // copy and alter the field
-                // You can stay here for the time being, the new type does not 
involve type conversion for the time being
-                switch (reftype) {
-                case OLAP_FIELD_TYPE_TINYINT:
-                    CONVERT_FROM_TYPE(int8_t);
-                case OLAP_FIELD_TYPE_UNSIGNED_TINYINT:
-                    CONVERT_FROM_TYPE(uint8_t);
-                case OLAP_FIELD_TYPE_SMALLINT:
-                    CONVERT_FROM_TYPE(int16_t);
-                case OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:
-                    CONVERT_FROM_TYPE(uint16_t);
-                case OLAP_FIELD_TYPE_INT:
-                    CONVERT_FROM_TYPE(int32_t);
-                case OLAP_FIELD_TYPE_UNSIGNED_INT:
-                    CONVERT_FROM_TYPE(uint32_t);
-                case OLAP_FIELD_TYPE_BIGINT:
-                    CONVERT_FROM_TYPE(int64_t);
-                case OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
-                    CONVERT_FROM_TYPE(uint64_t);
-                case OLAP_FIELD_TYPE_LARGEINT:
-                    CONVERT_FROM_TYPE(int128_t);
-                default:
-                    LOG(WARNING) << "the column type which was altered from 
was unsupported."
-                                 << " from_type="
-                                 << 
ref_block->tablet_schema()->column(ref_column).type();
-                    return Status::Error<SCHEMA_CHANGE_INFO_INVALID>();
-                }
-
-                if (newtype < reftype) {
-                    VLOG_NOTICE << "type degraded while altering column. "
-                                << "column=" << 
mutable_block->tablet_schema()->column(i).name()
-                                << ", origin_type="
-                                << 
ref_block->tablet_schema()->column(ref_column).type()
-                                << ", alter_type="
-                                << 
mutable_block->tablet_schema()->column(i).type();
-                }
-            }
-        } else {
-            // New column, write default value
-            for (size_t row_index = 0, new_row_index = 0;
-                 row_index < ref_block->row_block_info().row_num; ++row_index) 
{
-                mutable_block->get_row(new_row_index++, &write_helper);
-
-                if (_schema_mapping[i].default_value->is_null()) {
-                    write_helper.set_null(i);
-                } else {
-                    write_helper.set_not_null(i);
-                    write_helper.set_field_content(i, 
_schema_mapping[i].default_value->ptr(),
-                                                   mem_pool);
-                }
-            }
-        }
-    }
-
-    // NOTE The current row_num of mutable_block is still as much as ref
-    // (Actually, you can re-init into less when init, the new_row_num left by 
the filter)
-    // In split_table, there may be no data due to filtering
-    mutable_block->finalize(new_row_num);
-    return Status::OK();
-}
-
-#undef CONVERT_FROM_TYPE
-#undef TYPE_REINTERPRET_CAST
-#undef ASSIGN_DEFAULT_VALUE
-
 Status RowBlockChanger::change_block(vectorized::Block* ref_block,
                                      vectorized::Block* new_block) const {
     if (new_block->columns() != _schema_mapping.size()) {
@@ -931,250 +369,6 @@ Status 
RowBlockChanger::_check_cast_valid(vectorized::ColumnPtr ref_column,
     return Status::OK();
 }
 
-RowBlockSorter::RowBlockSorter(RowBlockAllocator* row_block_allocator)
-        : _row_block_allocator(row_block_allocator), _swap_row_block(nullptr) 
{}
-
-RowBlockSorter::~RowBlockSorter() {
-    if (_swap_row_block) {
-        _row_block_allocator->release(_swap_row_block);
-        _swap_row_block = nullptr;
-    }
-}
-
-bool RowBlockSorter::sort(RowBlock** row_block) {
-    uint32_t row_num = (*row_block)->row_block_info().row_num;
-    bool null_supported = (*row_block)->row_block_info().null_supported;
-
-    if (_swap_row_block == nullptr || _swap_row_block->capacity() < row_num) {
-        if (_swap_row_block != nullptr) {
-            _row_block_allocator->release(_swap_row_block);
-            _swap_row_block = nullptr;
-        }
-
-        if (!_row_block_allocator->allocate(&_swap_row_block, row_num, 
null_supported)) {
-            LOG(WARNING) << "fail to allocate memory.";
-            return false;
-        }
-    }
-
-    RowCursor helper_row;
-    auto res = helper_row.init(_swap_row_block->tablet_schema());
-    if (!res) {
-        LOG(WARNING) << "row cursor init failed.res:" << res;
-        return false;
-    }
-
-    std::vector<std::unique_ptr<RowCursor>> row_cursor_list;
-    row_cursor_list.reserve((*row_block)->row_block_info().row_num);
-    // create an list of row cursor as long as the number of rows in data 
block.
-    for (size_t i = 0; i < (*row_block)->row_block_info().row_num; ++i) {
-        row_cursor_list.emplace_back(new (nothrow) RowCursor());
-        if (row_cursor_list[i] == nullptr) {
-            LOG(WARNING) << "failed to malloc RowCursor. size=" << 
sizeof(RowCursor);
-            return false;
-        }
-
-        if (row_cursor_list[i]->init((*row_block)->tablet_schema()) != 
Status::OK()) {
-            return false;
-        }
-
-        (*row_block)->get_row(i, row_cursor_list[i].get());
-    }
-
-    // Must use 'std::' because this class has a function whose name is sort 
too
-    std::stable_sort(row_cursor_list.begin(), row_cursor_list.end(), 
_row_cursor_comparator);
-
-    // copy the results sorted to temp row block.
-    _swap_row_block->clear();
-    for (size_t i = 0; i < row_cursor_list.size(); ++i) {
-        _swap_row_block->get_row(i, &helper_row);
-        copy_row(&helper_row, *row_cursor_list[i], 
_swap_row_block->mem_pool());
-    }
-
-    _swap_row_block->finalize(row_cursor_list.size());
-
-    // swap the row block for reducing memory allocating.
-    std::swap(*row_block, _swap_row_block);
-
-    return true;
-}
-
-RowBlockAllocator::RowBlockAllocator(TabletSchemaSPtr tablet_schema, size_t 
memory_limitation)
-        : _tablet_schema(tablet_schema),
-          _tracker(std::make_unique<MemTracker>("RowBlockAllocator")),
-          _row_len(tablet_schema->row_size()),
-          _memory_limitation(memory_limitation) {
-    VLOG_NOTICE << "RowBlockAllocator(). row_len=" << _row_len;
-}
-
-RowBlockAllocator::~RowBlockAllocator() {
-    if (_tracker->consumption() != 0) {
-        LOG(WARNING) << "memory lost in RowBlockAllocator. memory_size=" << 
_tracker->consumption();
-    }
-}
-
-Status RowBlockAllocator::allocate(RowBlock** row_block, size_t num_rows, bool 
null_supported) {
-    size_t row_block_size = _row_len * num_rows;
-
-    if (_memory_limitation > 0 && _tracker->consumption() + row_block_size > 
_memory_limitation) {
-        *row_block = nullptr;
-        return Status::Error<FETCH_MEMORY_EXCEEDED>();
-    }
-
-    // TODO(lijiao) : Why abandon the original m_row_block_buffer
-    *row_block = new (nothrow) RowBlock(_tablet_schema);
-
-    if (*row_block == nullptr) {
-        LOG(WARNING) << "failed to malloc RowBlock. size=" << sizeof(RowBlock);
-        return Status::Error<MEM_ALLOC_FAILED>();
-    }
-
-    RowBlockInfo row_block_info(0U, num_rows);
-    row_block_info.null_supported = null_supported;
-    (*row_block)->init(row_block_info);
-
-    _tracker->consume(row_block_size);
-    VLOG_NOTICE << "RowBlockAllocator::allocate() this=" << this << ", 
num_rows=" << num_rows
-                << ", m_memory_allocated=" << _tracker->consumption()
-                << ", row_block_addr=" << *row_block;
-    return Status::OK();
-}
-
-void RowBlockAllocator::release(RowBlock* row_block) {
-    if (row_block == nullptr) {
-        LOG(INFO) << "null row block released.";
-        return;
-    }
-
-    _tracker->release(row_block->capacity() * _row_len);
-
-    VLOG_NOTICE << "RowBlockAllocator::release() this=" << this
-                << ", num_rows=" << row_block->capacity()
-                << ", m_memory_allocated=" << _tracker->consumption()
-                << ", row_block_addr=" << row_block;
-    delete row_block;
-}
-
-bool RowBlockAllocator::is_memory_enough_for_sorting(size_t num_rows, size_t 
allocated_rows) {
-    if (num_rows <= allocated_rows) {
-        return true;
-    }
-    size_t row_block_size = _row_len * (num_rows - allocated_rows);
-    return _tracker->consumption() + row_block_size < _memory_limitation;
-}
-
-RowBlockMerger::RowBlockMerger(TabletSharedPtr tablet) : _tablet(tablet) {}
-
-RowBlockMerger::~RowBlockMerger() = default;
-
-bool RowBlockMerger::merge(const std::vector<RowBlock*>& row_block_arr, 
RowsetWriter* rowset_writer,
-                           uint64_t* merged_rows) {
-    uint64_t tmp_merged_rows = 0;
-    RowCursor row_cursor;
-    std::unique_ptr<MemPool> mem_pool(new MemPool());
-    std::unique_ptr<ObjectPool> agg_object_pool(new ObjectPool());
-
-    auto merge_error = [&]() -> bool {
-        while (!_heap.empty()) {
-            MergeElement element = _heap.top();
-            _heap.pop();
-            SAFE_DELETE(element.row_cursor);
-        }
-        return false;
-    };
-
-    if (row_cursor.init(_tablet->tablet_schema()) != Status::OK()) {
-        LOG(WARNING) << "fail to init row cursor.";
-        return merge_error();
-    }
-
-    if (!_make_heap(row_block_arr)) {
-        // There is error log in _make_heap, so no need to more log.
-        return merge_error();
-    }
-
-    row_cursor.allocate_memory_for_string_type(_tablet->tablet_schema());
-    while (_heap.size() > 0) {
-        init_row_with_others(&row_cursor, *(_heap.top().row_cursor), 
mem_pool.get(),
-                             agg_object_pool.get());
-
-        _pop_heap();
-
-        if (KeysType::DUP_KEYS == _tablet->keys_type()) {
-            if (rowset_writer->add_row(row_cursor) != Status::OK()) {
-                LOG(WARNING) << "fail to add row to rowset writer.";
-                return merge_error();
-            }
-            continue;
-        }
-
-        while (!_heap.empty() && compare_row(row_cursor, 
*_heap.top().row_cursor) == 0) {
-            // TODO(zc): Currently we keep nullptr to indicate that this is a 
query path,
-            // we should fix this trick ASAP
-            agg_update_row(&row_cursor, *(_heap.top().row_cursor), nullptr);
-            ++tmp_merged_rows;
-            _pop_heap();
-        }
-        agg_finalize_row(&row_cursor, mem_pool.get());
-        if (rowset_writer->add_row(row_cursor) != Status::OK()) {
-            LOG(WARNING) << "fail to add row to rowset writer.";
-            return merge_error();
-        }
-
-        // the memory allocate by mem pool has been copied,
-        // so we should release memory immediately
-        mem_pool->clear();
-        agg_object_pool.reset(new ObjectPool());
-    }
-    if (rowset_writer->flush() != Status::OK()) {
-        LOG(WARNING) << "failed to finalizing writer.";
-        return merge_error();
-    }
-
-    *merged_rows = tmp_merged_rows;
-    return true;
-}
-
-bool RowBlockMerger::_make_heap(const std::vector<RowBlock*>& row_block_arr) {
-    for (auto row_block : row_block_arr) {
-        MergeElement element;
-        element.row_block = row_block;
-        element.row_block_index = 0;
-        element.row_cursor = new (nothrow) RowCursor();
-
-        if (element.row_cursor == nullptr) {
-            LOG(FATAL) << "failed to malloc RowCursor. size=" << 
sizeof(RowCursor);
-            return false;
-        }
-
-        if (element.row_cursor->init(element.row_block->tablet_schema()) != 
Status::OK()) {
-            LOG(WARNING) << "failed to init row cursor.";
-            SAFE_DELETE(element.row_cursor);
-            return false;
-        }
-
-        element.row_block->get_row(element.row_block_index, 
element.row_cursor);
-
-        _heap.push(element);
-    }
-
-    return true;
-}
-
-void RowBlockMerger::_pop_heap() {
-    MergeElement element = _heap.top();
-    _heap.pop();
-
-    if (++element.row_block_index >= 
element.row_block->row_block_info().row_num) {
-        SAFE_DELETE(element.row_cursor);
-        return;
-    }
-
-    element.row_block->get_row(element.row_block_index, element.row_cursor);
-
-    _heap.push(element);
-}
-
 Status LinkedSchemaChange::process(RowsetReaderSharedPtr rowset_reader, 
RowsetWriter* rowset_writer,
                                    TabletSharedPtr new_tablet, TabletSharedPtr 
base_tablet,
                                    TabletSchemaSPtr base_tablet_schema) {
@@ -1218,24 +412,6 @@ Status LinkedSchemaChange::process(RowsetReaderSharedPtr 
rowset_reader, RowsetWr
     }
 }
 
-Status reserve_block(std::unique_ptr<RowBlock, RowBlockDeleter>* 
block_handle_ptr, int row_num,
-                     RowBlockAllocator* allocator) {
-    auto& block_handle = *block_handle_ptr;
-    if (block_handle == nullptr || block_handle->capacity() < row_num) {
-        // release old block and alloc new block
-        if (block_handle != nullptr) {
-            block_handle.reset();
-        }
-        RowBlock* new_row_block = nullptr;
-        auto res = allocator->allocate(&new_row_block, row_num, true);
-        RETURN_NOT_OK_LOG(res, "failed to allocate RowBlock.");
-        block_handle.reset(new_row_block);
-    } else {
-        block_handle->clear();
-    }
-    return Status::OK();
-}
-
 Status VSchemaChangeDirectly::_inner_process(RowsetReaderSharedPtr 
rowset_reader,
                                              RowsetWriter* rowset_writer,
                                              TabletSharedPtr new_tablet,
diff --git a/be/src/olap/schema_change.h b/be/src/olap/schema_change.h
index c9ffd1cdd9..40e4b02270 100644
--- a/be/src/olap/schema_change.h
+++ b/be/src/olap/schema_change.h
@@ -28,14 +28,6 @@
 #include "vec/core/block.h"
 
 namespace doris {
-
-bool to_bitmap(RowCursor* read_helper, RowCursor* write_helper, const 
TabletColumn& ref_column,
-               int field_idx, int ref_field_idx, MemPool* mem_pool);
-bool hll_hash(RowCursor* read_helper, RowCursor* write_helper, const 
TabletColumn& ref_column,
-              int field_idx, int ref_field_idx, MemPool* mem_pool);
-bool count_field(RowCursor* read_helper, RowCursor* write_helper, const 
TabletColumn& ref_column,
-                 int field_idx, int ref_field_idx, MemPool* mem_pool);
-
 class RowBlockChanger {
 public:
     RowBlockChanger(TabletSchemaSPtr tablet_schema, const DeleteHandler* 
delete_handler,
@@ -45,9 +37,6 @@ public:
 
     ColumnMapping* get_mutable_column_mapping(size_t column_index);
 
-    Status change_row_block(const RowBlock* ref_block, int32_t data_version,
-                            RowBlock* mutable_block, const uint64_t* 
filtered_rows) const;
-
     Status change_block(vectorized::Block* ref_block, vectorized::Block* 
new_block) const;
 
 private:
@@ -65,22 +54,6 @@ private:
     DISALLOW_COPY_AND_ASSIGN(RowBlockChanger);
 };
 
-class RowBlockAllocator {
-public:
-    RowBlockAllocator(TabletSchemaSPtr tablet_schema, size_t 
memory_limitation);
-    virtual ~RowBlockAllocator();
-
-    Status allocate(RowBlock** row_block, size_t num_rows, bool 
null_supported);
-    void release(RowBlock* row_block);
-    bool is_memory_enough_for_sorting(size_t num_rows, size_t allocated_rows);
-
-private:
-    TabletSchemaSPtr _tablet_schema;
-    std::unique_ptr<MemTracker> _tracker;
-    size_t _row_len;
-    size_t _memory_limitation;
-};
-
 class SchemaChange {
 public:
     SchemaChange() : _filtered_rows(0), _merged_rows(0) {}
@@ -262,6 +235,4 @@ private:
     static std::unordered_set<int64_t> _tablet_ids_in_converting;
     static std::set<std::string> _supported_functions;
 };
-
-using RowBlockDeleter = std::function<void(RowBlock*)>;
 } // namespace doris
diff --git a/be/src/util/tuple_row_zorder_compare.cpp 
b/be/src/util/tuple_row_zorder_compare.cpp
index 4f66a60ded..25bb270eeb 100644
--- a/be/src/util/tuple_row_zorder_compare.cpp
+++ b/be/src/util/tuple_row_zorder_compare.cpp
@@ -25,208 +25,4 @@ int RowComparator::operator()(const char* left, const char* 
right) const {
     return -1;
 }
 
-TupleRowZOrderComparator::TupleRowZOrderComparator() {
-    _schema = nullptr;
-    _sort_col_num = 0;
-}
-
-TupleRowZOrderComparator::TupleRowZOrderComparator(int sort_col_num) {
-    _schema = nullptr;
-    _sort_col_num = sort_col_num;
-}
-
-TupleRowZOrderComparator::TupleRowZOrderComparator(Schema* schema, int 
sort_col_num)
-        : _schema(schema), _sort_col_num(sort_col_num) {
-    _max_col_size = get_type_byte_size(_schema->column(0)->type());
-    for (size_t i = 1; i < _sort_col_num; ++i) {
-        if (_max_col_size < get_type_byte_size(_schema->column(i)->type())) {
-            _max_col_size = get_type_byte_size(_schema->column(i)->type());
-        }
-    }
-}
-
-int TupleRowZOrderComparator::compare(const char* lhs, const char* rhs) const {
-    ContiguousRow lhs_row(_schema, lhs);
-    ContiguousRow rhs_row(_schema, rhs);
-    if (_max_col_size <= 4) {
-        return compare_based_on_size<uint32_t, ContiguousRow>(lhs_row, 
rhs_row);
-    } else if (_max_col_size <= 8) {
-        return compare_based_on_size<uint64_t, ContiguousRow>(lhs_row, 
rhs_row);
-    } else {
-        return compare_based_on_size<uint128_t, ContiguousRow>(lhs_row, 
rhs_row);
-    }
-}
-
-void TupleRowZOrderComparator::max_col_size(const RowCursor& rc) {
-    _max_col_size = get_type_byte_size(rc.schema()->column(0)->type());
-    for (size_t i = 1; i < _sort_col_num; ++i) {
-        if (_max_col_size < 
get_type_byte_size(rc.schema()->column(i)->type())) {
-            _max_col_size = get_type_byte_size(rc.schema()->column(i)->type());
-        }
-    }
-}
-
-int TupleRowZOrderComparator::compare_row(const RowCursor& lhs, const 
RowCursor& rhs) {
-    max_col_size(lhs);
-    if (_max_col_size <= 4) {
-        return compare_based_on_size<uint32_t, const RowCursor>(lhs, rhs);
-    } else if (_max_col_size <= 8) {
-        return compare_based_on_size<uint64_t, const RowCursor>(lhs, lhs);
-    } else {
-        return compare_based_on_size<uint128_t, const RowCursor>(lhs, lhs);
-    }
-}
-
-template <typename U, typename LhsRowType>
-int TupleRowZOrderComparator::compare_based_on_size(LhsRowType& lhs, 
LhsRowType& rhs) const {
-    auto less_msb = [](U x, U y) { return x < y && x < (x ^ y); };
-    FieldType type = lhs.schema()->column(0)->type();
-    U msd_lhs = get_shared_representation<U>(
-            lhs.cell(0).is_null() ? nullptr : lhs.cell(0).cell_ptr(), type);
-    U msd_rhs = get_shared_representation<U>(
-            rhs.cell(0).is_null() ? nullptr : rhs.cell(0).cell_ptr(), type);
-    for (int i = 1; i < _sort_col_num; ++i) {
-        type = lhs.schema()->column(i)->type();
-        const void* lhs_v = lhs.cell(i).is_null() ? nullptr : 
lhs.cell(i).cell_ptr();
-        const void* rhs_v = rhs.cell(i).is_null() ? nullptr : 
rhs.cell(i).cell_ptr();
-        U lhsi = get_shared_representation<U>(lhs_v, type);
-        U rhsi = get_shared_representation<U>(rhs_v, type);
-        if (less_msb(msd_lhs ^ msd_rhs, lhsi ^ rhsi)) {
-            msd_lhs = lhsi;
-            msd_rhs = rhsi;
-        }
-    }
-    return msd_lhs < msd_rhs ? -1 : (msd_lhs > msd_rhs ? 1 : 0);
-}
-
-template <typename U>
-U TupleRowZOrderComparator::get_shared_representation(const void* val, 
FieldType type) const {
-    // The mask used for setting the sign bit correctly.
-    if (val == NULL) return 0;
-    constexpr U mask = (U)1 << (sizeof(U) * 8 - 1);
-    switch (type) {
-    case FieldType::OLAP_FIELD_TYPE_NONE:
-        return 0;
-    case FieldType::OLAP_FIELD_TYPE_BOOL:
-        return static_cast<U>(*reinterpret_cast<const bool*>(val)) << 
(sizeof(U) * 8 - 1);
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_TINYINT:
-    case FieldType::OLAP_FIELD_TYPE_TINYINT:
-        return get_shared_int_representation<U, 
int8_t>(*reinterpret_cast<const int8_t*>(val),
-                                                        mask);
-    case FieldType::OLAP_FIELD_TYPE_SMALLINT:
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:
-        return get_shared_int_representation<U, 
int16_t>(*reinterpret_cast<const int16_t*>(val),
-                                                         mask);
-    case FieldType::OLAP_FIELD_TYPE_INT:
-        return get_shared_int_representation<U, 
int32_t>(*reinterpret_cast<const int32_t*>(val),
-                                                         mask);
-    case FieldType::OLAP_FIELD_TYPE_DATETIME:
-    case FieldType::OLAP_FIELD_TYPE_DATE:
-    case FieldType::OLAP_FIELD_TYPE_BIGINT:
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
-        return get_shared_int_representation<U, 
int64_t>(*reinterpret_cast<const int64_t*>(val),
-                                                         mask);
-    case FieldType::OLAP_FIELD_TYPE_LARGEINT:
-        return static_cast<U>(*reinterpret_cast<const int128_t*>(val)) ^ mask;
-    case FieldType::OLAP_FIELD_TYPE_FLOAT:
-        return get_shared_float_representation<U, float>(val, mask);
-    case FieldType::OLAP_FIELD_TYPE_DISCRETE_DOUBLE:
-    case FieldType::OLAP_FIELD_TYPE_DOUBLE:
-        return get_shared_float_representation<U, double>(val, mask);
-    case FieldType::OLAP_FIELD_TYPE_CHAR:
-    case FieldType::OLAP_FIELD_TYPE_VARCHAR: {
-        const StringValue* string_value = reinterpret_cast<const 
StringValue*>(val);
-        return get_shared_string_representation<U>(string_value->ptr, 
string_value->len);
-    }
-    case FieldType::OLAP_FIELD_TYPE_DECIMAL: {
-        decimal12_t decimal_val = *reinterpret_cast<const decimal12_t*>(val);
-        int128_t value = decimal_val.integer * DecimalV2Value::ONE_BILLION + 
decimal_val.fraction;
-        return static_cast<U>(value) ^ mask;
-    }
-    default:
-        return 0;
-    }
-}
-
-template <typename U, typename T>
-U TupleRowZOrderComparator::get_shared_int_representation(const T val, U mask) 
const {
-    uint64_t shift_size = static_cast<uint64_t>(
-            std::max(static_cast<int64_t>((sizeof(U) - sizeof(T)) * 8), 
(int64_t)0));
-    return (static_cast<U>(val) << shift_size) ^ mask;
-}
-
-template <typename U, typename T>
-U TupleRowZOrderComparator::get_shared_float_representation(const void* val, U 
mask) const {
-    int64_t tmp;
-    T floating_value = *reinterpret_cast<const T*>(val);
-    memcpy(&tmp, &floating_value, sizeof(T));
-    if (UNLIKELY(std::isnan(floating_value))) return 0;
-    // "int" is enough because U and T are only primitive type
-    int s = (int)((sizeof(U) - sizeof(T)) * 8);
-    if (floating_value < 0.0) {
-        // Flipping all bits for negative values.
-        return static_cast<U>(~tmp) << std::max(s, 0);
-    } else {
-        // Flipping only first bit.
-        return (static_cast<U>(tmp) << std::max(s, 0)) ^ mask;
-    }
-}
-
-template <typename U>
-U TupleRowZOrderComparator::get_shared_string_representation(const char* 
char_ptr,
-                                                             int length) const 
{
-    int len = length < sizeof(U) ? length : sizeof(U);
-    if (len == 0) return 0;
-    U dst = 0;
-    // We copy the bytes from the string but swap the bytes because of integer 
endianness.
-    BitUtil::ByteSwapScalar(&dst, char_ptr, len);
-    return dst << ((sizeof(U) - len) * 8);
-}
-
-int TupleRowZOrderComparator::operator()(const char* lhs, const char* rhs) 
const {
-    int result = compare(lhs, rhs);
-    return result;
-}
-
-int TupleRowZOrderComparator::get_type_byte_size(FieldType type) const {
-    switch (type) {
-    case FieldType::OLAP_FIELD_TYPE_OBJECT:
-    case FieldType::OLAP_FIELD_TYPE_HLL:
-    case FieldType::OLAP_FIELD_TYPE_STRUCT:
-    case FieldType::OLAP_FIELD_TYPE_ARRAY:
-    case FieldType::OLAP_FIELD_TYPE_MAP:
-    case FieldType::OLAP_FIELD_TYPE_CHAR:
-    case FieldType::OLAP_FIELD_TYPE_VARCHAR:
-        return 0;
-    case FieldType::OLAP_FIELD_TYPE_NONE:
-    case FieldType::OLAP_FIELD_TYPE_BOOL:
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_TINYINT:
-    case FieldType::OLAP_FIELD_TYPE_TINYINT:
-        return 1;
-    case FieldType::OLAP_FIELD_TYPE_SMALLINT:
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:
-        return 2;
-    case FieldType::OLAP_FIELD_TYPE_FLOAT:
-    case FieldType::OLAP_FIELD_TYPE_INT:
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT:
-        return 4;
-    case FieldType::OLAP_FIELD_TYPE_DISCRETE_DOUBLE:
-    case FieldType::OLAP_FIELD_TYPE_DOUBLE:
-    case FieldType::OLAP_FIELD_TYPE_BIGINT:
-    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
-        return 8;
-    case FieldType::OLAP_FIELD_TYPE_DECIMAL:
-    case FieldType::OLAP_FIELD_TYPE_LARGEINT:
-    case FieldType::OLAP_FIELD_TYPE_DATETIME:
-    case FieldType::OLAP_FIELD_TYPE_DATE:
-        return 16;
-    case FieldType::OLAP_FIELD_TYPE_UNKNOWN:
-        DCHECK(false);
-        break;
-    default:
-        DCHECK(false);
-    }
-    return -1;
-}
-
 } // namespace doris
diff --git a/be/src/util/tuple_row_zorder_compare.h 
b/be/src/util/tuple_row_zorder_compare.h
index 337345713e..db40ddc283 100644
--- a/be/src/util/tuple_row_zorder_compare.h
+++ b/be/src/util/tuple_row_zorder_compare.h
@@ -35,33 +35,4 @@ public:
     virtual ~RowComparator() = default;
     virtual int operator()(const char* left, const char* right) const;
 };
-
-class TupleRowZOrderComparator : public RowComparator {
-private:
-    typedef __uint128_t uint128_t;
-    int _max_col_size = 0;
-    const Schema* _schema;
-    int _sort_col_num = 0;
-
-public:
-    TupleRowZOrderComparator();
-    TupleRowZOrderComparator(int sort_col_num);
-    TupleRowZOrderComparator(Schema* schema, int sort_col_num);
-    virtual ~TupleRowZOrderComparator() {}
-    int compare(const char* lhs, const char* rhs) const;
-    void max_col_size(const RowCursor& rc);
-    int compare_row(const RowCursor& lhs, const RowCursor& rhs);
-    template <typename U, typename LhsRowType>
-    int compare_based_on_size(LhsRowType& lhs, LhsRowType& rhs) const;
-    template <typename U>
-    U get_shared_representation(const void* val, FieldType type) const;
-    template <typename U, typename T>
-    U get_shared_int_representation(const T val, U mask) const;
-    template <typename U, typename T>
-    U get_shared_float_representation(const void* val, U mask) const;
-    template <typename U>
-    U get_shared_string_representation(const char* char_ptr, int length) const;
-    virtual int operator()(const char* lhs, const char* rhs) const;
-    int get_type_byte_size(FieldType type) const;
-};
 } // namespace doris
diff --git a/be/test/CMakeLists.txt b/be/test/CMakeLists.txt
index 3a93ebd9c7..426ec67fde 100644
--- a/be/test/CMakeLists.txt
+++ b/be/test/CMakeLists.txt
@@ -252,7 +252,6 @@ set(UTIL_TEST_FILES
     util/sort_heap_test.cpp
     util/counts_test.cpp
     util/date_func_test.cpp
-    util/tuple_row_zorder_compare_test.cpp
     util/array_parser_test.cpp
     util/quantile_state_test.cpp
     util/hdfs_storage_backend_test.cpp
diff --git a/be/test/util/tuple_row_zorder_compare_test.cpp 
b/be/test/util/tuple_row_zorder_compare_test.cpp
deleted file mode 100644
index 09cf821348..0000000000
--- a/be/test/util/tuple_row_zorder_compare_test.cpp
+++ /dev/null
@@ -1,1111 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#include "util/tuple_row_zorder_compare.h"
-
-#include <gtest/gtest.h>
-
-#include "common/logging.h"
-#include "exprs/expr.h"
-#include "exprs/expr_context.h"
-#include "olap/memtable.h"
-#include "olap/row.h"
-#include "olap/schema.h"
-#include "runtime/descriptors.h"
-#include "runtime/large_int_value.h"
-#include "runtime/raw_value.h"
-#include "runtime/tuple.h"
-#include "runtime/tuple_row.h"
-#include "util/json_util.h"
-
-namespace doris {
-class TupleRowZOrderCompareTest : public testing::Test {
-public:
-    ObjectPool _agg_buffer_pool;
-    std::unique_ptr<MemPool> _buffer_mem_pool;
-
-    TupleRowZOrderCompareTest() { _buffer_mem_pool.reset(new MemPool()); }
-
-    ~TupleRowZOrderCompareTest() = default;
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareInt8Test(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::TINYINT);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(int8_t) + 1 * i;
-
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(int8_t) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_TINYINT, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_TINYINT, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int8_t),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int8_t));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int8_t),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int8_t));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareInt16Test(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::SMALLINT);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(int16_t) + 1 * i;
-
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(int16_t) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_SMALLINT, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_SMALLINT, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int16_t),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int16_t));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int16_t),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int16_t));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareIntTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::INT);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(int32_t) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(int32_t) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_INT, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_INT, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int32_t),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int32_t));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int32_t),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int32_t));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareInt64Test(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::BIGINT);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(int64_t) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(int64_t) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_BIGINT, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_BIGINT, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int64_t),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int64_t));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int64_t),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int64_t));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareInt128Test(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::LARGEINT);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(int128_t) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(int128_t) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_LARGEINT, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_LARGEINT, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int128_t),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int128_t));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int128_t),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int128_t));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareFloatTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::FLOAT);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(float) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(float) + 1 * (i 
- 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_FLOAT, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_FLOAT, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(float),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(float));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(float),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(float));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareDoubleTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::DOUBLE);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(double) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(double) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_DOUBLE, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_DOUBLE, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(double),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(double));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(double),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(double));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareBoolTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::BOOLEAN);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(bool) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(bool) + 1 * (i 
- 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_BOOL, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_BOOL, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(bool),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(bool));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(bool),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(bool));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareCharTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::VARCHAR);
-                scalar_type.__set_len(65535);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(StringValue) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(StringValue) + 
1 * (i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_VARCHAR, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_VARCHAR, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(StringValue),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(StringValue));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(StringValue),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(StringValue));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareDateTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::DATETIME);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(DateTimeValue) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(DateTimeValue) 
+ 1 * (i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_DATETIME, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_DATETIME, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(DateTimeValue),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1, lval2);
-        uint8_t* lhs_tuple_buf = _buffer_mem_pool->allocate(col_num * 
sizeof(char) +
-                                                            col_num * 
sizeof(DateTimeValue));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(DateTimeValue),
-                                         _buffer_mem_pool.get());
-        FillMem(rhs_tuple, 1, rval1, rval2);
-        uint8_t* rhs_tuple_buf = _buffer_mem_pool->allocate(col_num * 
sizeof(char) +
-                                                            col_num * 
sizeof(DateTimeValue));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    template <typename T, bool IS_FIRST_SLOT_NULL = false>
-    int CompareDecimalTest(T lval1, T lval2, T rval1, T rval2) {
-        int col_num = 2;
-        std::vector<SlotDescriptor> slot_descs;
-        for (int i = 1; i <= col_num; i++) {
-            TSlotDescriptor slot_desc;
-            slot_desc.id = i;
-            slot_desc.parent = 0;
-            TTypeDesc type;
-            {
-                TTypeNode node;
-                node.__set_type(TTypeNodeType::SCALAR);
-                TScalarType scalar_type;
-                scalar_type.__set_type(TPrimitiveType::type::DECIMALV2);
-                scalar_type.__isset.precision = true;
-                scalar_type.__isset.scale = true;
-                scalar_type.__set_precision(-1);
-                scalar_type.__set_scale(-1);
-                node.__set_scalar_type(scalar_type);
-                type.types.push_back(node);
-            }
-            slot_desc.slotType = type;
-            slot_desc.columnPos = i;
-            slot_desc.byteOffset = (i - 1) * sizeof(int128_t) + 1 * i;
-            slot_desc.nullIndicatorByte = 0 + (i - 1) * sizeof(int128_t) + 1 * 
(i - 1);
-            slot_desc.nullIndicatorBit = 1;
-            std::ostringstream ss;
-            ss << "col_" << i;
-            slot_desc.colName = ss.str();
-            slot_desc.slotIdx = i;
-            slot_desc.isMaterialized = true;
-            slot_descs.emplace_back(slot_desc);
-        }
-
-        std::vector<TabletColumn> col_schemas;
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_DECIMAL, true);
-        col_schemas.emplace_back(OLAP_FIELD_AGGREGATION_NONE, 
OLAP_FIELD_TYPE_DECIMAL, true);
-
-        Schema schema = Schema(col_schemas, col_num);
-        TupleRowZOrderComparator comparator(&schema, 2);
-        Tuple* lhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int128_t),
-                                         _buffer_mem_pool.get());
-        if (IS_FIRST_SLOT_NULL) {
-            lhs_tuple->set_null(NullIndicatorOffset(0, 1));
-        }
-        FillMem(lhs_tuple, 1, lval1.value(), lval2.value());
-        uint8_t* lhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int128_t));
-        ContiguousRow lhs_row(&schema, lhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, lhs_tuple, &lhs_row, 
_buffer_mem_pool.get());
-
-        Tuple* rhs_tuple = Tuple::create(col_num * sizeof(char) + col_num * 
sizeof(int128_t),
-                                         _buffer_mem_pool.get());
-
-        FillMem(rhs_tuple, 1, rval1.value(), rval2.value());
-        uint8_t* rhs_tuple_buf =
-                _buffer_mem_pool->allocate(col_num * sizeof(char) + col_num * 
sizeof(int128_t));
-        ContiguousRow rhs_row(&schema, rhs_tuple_buf);
-        tuple_to_row(schema, slot_descs, rhs_tuple, &rhs_row, 
_buffer_mem_pool.get());
-        int result = comparator.compare(reinterpret_cast<const 
char*>(lhs_row.row_ptr()),
-                                        reinterpret_cast<const 
char*>(rhs_row.row_ptr()));
-        return result;
-    }
-
-    void tuple_to_row(const Schema& schema, const vector<SlotDescriptor>& 
slot_descs,
-                      const Tuple* tuple, ContiguousRow* row, MemPool* 
mem_pool) {
-        for (size_t i = 0; i < slot_descs.size(); ++i) {
-            auto cell = row->cell(i);
-            const SlotDescriptor& slot = slot_descs[i];
-            bool is_null = tuple->is_null(slot.null_indicator_offset());
-            const void* value = tuple->get_slot(slot.tuple_offset());
-            schema.column(i)->consume(&cell, (const char*)value, is_null, 
mem_pool,
-                                      &_agg_buffer_pool);
-        }
-    }
-
-    template <typename T>
-    void FillMem(Tuple* tuple_mem, int idx, T val) {
-        memcpy(tuple_mem->get_slot(idx), &val, sizeof(T));
-    }
-
-    template <typename T, typename... Args>
-    void FillMem(Tuple* tuple_mem, int idx, T val, Args... args) {
-        // Use memcpy to avoid gcc generating unaligned instructions like 
movaps
-        // for int128_t. They will raise SegmentFault when addresses are not
-        // aligned to 16 bytes.
-        memcpy(tuple_mem->get_slot(idx), &val, sizeof(T));
-        FillMem(tuple_mem, idx + sizeof(T) + 1, args...);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int Int8Int8Test(int8_t lval1, int8_t lval2, int8_t rval1, int8_t rval2) {
-        return CompareInt8Test<int8_t, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int Int16Int16Test(int16_t lval1, int16_t lval2, int16_t rval1, int16_t 
rval2) {
-        return CompareInt16Test<int16_t, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int IntIntTest(int32_t lval1, int32_t lval2, int32_t rval1, int32_t rval2) 
{
-        return CompareIntTest<int32_t, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int Int64Int64Test(int64_t lval1, int64_t lval2, int64_t rval1, int64_t 
rval2) {
-        return CompareInt64Test<int64_t, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int Int128Int128Test(int128_t lval1, int128_t lval2, int128_t rval1, 
int128_t rval2) {
-        return CompareInt128Test<int128_t, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int FloatFloatTest(float lval1, float lval2, float rval1, float rval2) {
-        return CompareFloatTest<float, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int DoubleDoubleTest(double lval1, double lval2, double rval1, double 
rval2) {
-        return CompareDoubleTest<double, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int BoolBoolTest(bool lval1, bool lval2, bool rval1, bool rval2) {
-        return CompareBoolTest<bool, IS_FIRST_SLOT_NULL>(lval1, lval2, rval1, 
rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int CharCharTest(StringValue lval1, StringValue lval2, StringValue rval1, 
StringValue rval2) {
-        return CompareCharTest<StringValue, IS_FIRST_SLOT_NULL>(lval1, lval2, 
rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int DateDateTest(DateTimeValue lval1, DateTimeValue lval2, DateTimeValue 
rval1,
-                     DateTimeValue rval2) {
-        return CompareDateTest<DateTimeValue, IS_FIRST_SLOT_NULL>(lval1, 
lval2, rval1, rval2);
-    }
-
-    template <bool IS_FIRST_SLOT_NULL = false>
-    int DecimalDecimalTest(DecimalV2Value lval1, DecimalV2Value lval2, 
DecimalV2Value rval1,
-                           DecimalV2Value rval2) {
-        return CompareDecimalTest<DecimalV2Value, IS_FIRST_SLOT_NULL>(lval1, 
lval2, rval1, rval2);
-    }
-};
-
-TEST_F(TupleRowZOrderCompareTest, DecimalTest) {
-    std::string str1 = "1.00";
-    std::string str2 = "1.00";
-    std::string str3 = "1.00";
-    std::string str4 = "1.00";
-    DecimalV2Value val1(str1);
-    DecimalV2Value val2(str2);
-    DecimalV2Value val3(str3);
-    DecimalV2Value val4(str4);
-    EXPECT_EQ(DecimalDecimalTest(val1, val2, val3, val4), 0);
-    str1 = "-5.0";
-    str2 = "3.0";
-    str3 = "-5.0";
-    str4 = "3.0";
-    DecimalV2Value val5(str1);
-    DecimalV2Value val6(str2);
-    DecimalV2Value val7(str3);
-    DecimalV2Value val8(str4);
-    EXPECT_EQ(DecimalDecimalTest(val5, val6, val7, val8), 0);
-    str1 = "1.0";
-    str2 = "0.0";
-    str3 = "0.0";
-    str4 = "1.0";
-    DecimalV2Value val9(str1);
-    DecimalV2Value val10(str2);
-    DecimalV2Value val11(str3);
-    DecimalV2Value val12(str4);
-    EXPECT_EQ(DecimalDecimalTest(val9, val10, val11, val12), 1);
-    str1 = "0";
-    str2 = "1";
-    str3 = "1";
-    str4 = "0";
-    DecimalV2Value val13(str1);
-    DecimalV2Value val14(str2);
-    DecimalV2Value val15(str3);
-    DecimalV2Value val16(str4);
-    EXPECT_EQ(DecimalDecimalTest(val13, val14, val15, val16), -1);
-    str1 = "256";
-    str2 = "10";
-    str3 = "255";
-    str4 = "100";
-    DecimalV2Value val17(str1);
-    DecimalV2Value val18(str2);
-    DecimalV2Value val19(str3);
-    DecimalV2Value val20(str4);
-    EXPECT_EQ(DecimalDecimalTest(val17, val18, val19, val20), -1);
-    str1 = "3";
-    str2 = "1024";
-    str3 = "128";
-    str4 = "1023";
-    DecimalV2Value val21(str1);
-    DecimalV2Value val22(str2);
-    DecimalV2Value val23(str3);
-    DecimalV2Value val24(str4);
-    EXPECT_EQ(DecimalDecimalTest(val21, val22, val23, val24), -1);
-    str1 = "1024";
-    str2 = "511";
-    str3 = "1023";
-    str4 = "0";
-    DecimalV2Value val25(str1);
-    DecimalV2Value val26(str2);
-    DecimalV2Value val27(str3);
-    DecimalV2Value val28(str4);
-    EXPECT_EQ(DecimalDecimalTest(val25, val26, val27, val28), 1);
-    str1 = "5550";
-    str2 = "0";
-    str3 = "5000";
-    str4 = "4097";
-    DecimalV2Value val29(str1);
-    DecimalV2Value val30(str2);
-    DecimalV2Value val31(str3);
-    DecimalV2Value val32(str4);
-    EXPECT_EQ(DecimalDecimalTest(val29, val30, val31, val32), -1);
-}
-
-TEST_F(TupleRowZOrderCompareTest, DateDateTest) {
-    DateTimeValue val1;
-    DateTimeValue val2;
-    DateTimeValue val3;
-    DateTimeValue val4;
-    std::string str1 = "2015-04-09 14:07:46";
-    std::string str2 = "2015-04-09 14:07:46";
-    std::string str3 = "2015-04-09 14:07:46";
-    std::string str4 = "2015-04-09 14:07:46";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), 0);
-    str1 = "1415-12-09 10:07:44";
-    str2 = "2015-04-09 14:07:46";
-    str3 = "1415-12-09 10:07:44";
-    str4 = "2015-04-09 14:07:46";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), 0);
-    str1 = "1400-01-01 00:00:00";
-    str2 = "9999-12-31 14:07:46";
-    str3 = "8000-12-09 10:07:44";
-    str4 = "2015-04-09 14:07:46";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), -1);
-    str1 = "1400-01-01 00:00:01";
-    str2 = "1400-01-01 00:00:00";
-    str3 = "1400-01-01 00:00:00";
-    str4 = "1400-01-01 00:00:01";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), 1);
-    str1 = "1400-01-01 00:00:03";
-    str2 = "1400-01-01 00:00:07";
-    str3 = "1400-01-01 00:00:04";
-    str4 = "1400-01-01 00:00:00";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), -1);
-    str1 = "1400-01-01 00:00:06";
-    str2 = "1400-01-01 00:00:04";
-    str3 = "1400-01-01 00:00:05";
-    str4 = "1400-01-01 00:00:07";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), 1);
-    str1 = "1400-01-01 00:00:05";
-    str2 = "1400-01-01 00:00:05";
-    str3 = "1400-01-01 00:00:06";
-    str4 = "1400-01-01 00:00:04";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), -1);
-    str1 = "1400-01-01 23:59:59";
-    str2 = "1400-01-01 00:00:00";
-    str3 = "1400-01-02 00:00:00";
-    str4 = "1400-01-01 00:00:00";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), -1);
-    str1 = "3541-11-03 23:59:59";
-    str2 = "3541-11-03 00:00:00";
-    str3 = "3541-11-04 00:00:00";
-    str4 = "3541-11-03 00:00:00";
-    val1.from_date_str(str1.c_str(), str1.size());
-    val2.from_date_str(str2.c_str(), str2.size());
-    val3.from_date_str(str3.c_str(), str3.size());
-    val4.from_date_str(str4.c_str(), str4.size());
-    EXPECT_EQ(DateDateTest(val1, val2, val3, val4), -1);
-}
-TEST_F(TupleRowZOrderCompareTest, CharTest) {
-    EXPECT_EQ(CharCharTest(StringValue("a"), StringValue("b"), 
StringValue("a"), StringValue("b")),
-              0);
-    EXPECT_EQ(CharCharTest(StringValue("a"), StringValue("b"), 
StringValue("a"), StringValue("b")),
-              0);
-    EXPECT_EQ(CharCharTest(StringValue("h"), StringValue("0"), 
StringValue("h"), StringValue("0")),
-              0);
-    EXPECT_EQ(CharCharTest(StringValue("h"), StringValue("z"), 
StringValue("z"), StringValue("h")),
-              -1);
-    EXPECT_EQ(CharCharTest(StringValue("a"), StringValue("0"), 
StringValue("h"), StringValue("0")),
-              -1);
-    EXPECT_EQ(CharCharTest(StringValue("!"), StringValue("{"), 
StringValue("0"), StringValue("K")),
-              1);
-    EXPECT_EQ(CharCharTest(StringValue("A"), StringValue("~"), 
StringValue("B"), StringValue("Z")),
-              1);
-    EXPECT_EQ(CharCharTest(StringValue("aaa"), StringValue("bbb"), 
StringValue("aaa"),
-                           StringValue("bbb")),
-              0);
-    EXPECT_EQ(CharCharTest(StringValue("abc"), StringValue("bbc"), 
StringValue("abc"),
-                           StringValue("bbc")),
-              0);
-    EXPECT_EQ(CharCharTest(StringValue("aah"), StringValue("aa0"), 
StringValue("aah"),
-                           StringValue("aa0")),
-              0);
-    EXPECT_EQ(CharCharTest(StringValue("aaa"), StringValue("aa0"), 
StringValue("aah"),
-                           StringValue("aa0")),
-              -1);
-    EXPECT_EQ(CharCharTest(StringValue("aah"), StringValue("aaz"), 
StringValue("aaz"),
-                           StringValue("aah")),
-              -1);
-    EXPECT_EQ(CharCharTest(StringValue("aa!"), StringValue("aa{"), 
StringValue("aa0"),
-                           StringValue("aaK")),
-              1);
-    EXPECT_EQ(CharCharTest(StringValue("aaA"), StringValue("aa~"), 
StringValue("aaB"),
-                           StringValue("aaZ")),
-              1);
-}
-TEST_F(TupleRowZOrderCompareTest, BoolTest) {
-    EXPECT_EQ(BoolBoolTest(true, false, true, false), 0);
-    EXPECT_EQ(BoolBoolTest(false, true, false, true), 0);
-    EXPECT_EQ(BoolBoolTest(true, true, true, false), 1);
-    EXPECT_EQ(BoolBoolTest(false, true, true, true), -1);
-    EXPECT_EQ(BoolBoolTest(false, true, false, false), 1);
-    EXPECT_EQ(BoolBoolTest(false, false, false, true), -1);
-    EXPECT_EQ(BoolBoolTest(true, false, false, false), 1);
-}
-TEST_F(TupleRowZOrderCompareTest, DoubleTest) {
-    EXPECT_EQ(DoubleDoubleTest(1.0, 0.0, 0.0, 1.0f), 1);
-    EXPECT_EQ(DoubleDoubleTest(0.0, 1.0, 1.0, 0.0f), -1);
-    EXPECT_EQ(DoubleDoubleTest(4.0, 3.0, 3.0, 4.0), 1);
-    EXPECT_EQ(DoubleDoubleTest(5.0, 7.0, 4.0, 10.0), -1);
-    EXPECT_EQ(DoubleDoubleTest(6.0, 10.0, 7.0, 3.0), 1);
-    EXPECT_EQ(DoubleDoubleTest(9.0, 7.0, 8.0, 10.0), -1);
-    EXPECT_EQ(DoubleDoubleTest(8.0, 8.0, 9.0, 7.0), 1);
-    EXPECT_EQ(DoubleDoubleTest(9.0, 4.0, 6.0, 10.0), 1);
-    EXPECT_EQ(DoubleDoubleTest(-4.0, -3.0, -3.0, -4.0), -1);
-    EXPECT_EQ(DoubleDoubleTest(-5.0, -7.0, -4.0, -10.0), 1);
-    EXPECT_EQ(DoubleDoubleTest(-6.0, -10.0, -7.0, -3.0), -1);
-    EXPECT_EQ(DoubleDoubleTest(-9.0, -7.0, -8.0, -10.0), 1);
-    EXPECT_EQ(DoubleDoubleTest(-8.0, -8.0, -9.0, -7.0), -1);
-    EXPECT_EQ(DoubleDoubleTest(-9.0, -4.0, -6.0, -10.0), -1);
-    EXPECT_EQ(DoubleDoubleTest(DBL_MAX / 2.0 + 2.0, 1.0, 1.0, DBL_MAX), 1);
-}
-TEST_F(TupleRowZOrderCompareTest, FloatTest) {
-    EXPECT_EQ(FloatFloatTest(1.0f, 0.0f, 0.0f, 1.0f), 1);
-    EXPECT_EQ(FloatFloatTest(0.0f, 1.0f, 1.0f, 0.0f), -1);
-    EXPECT_EQ(FloatFloatTest(4.0f, 3.0f, 3.0f, 4.0f), 1);
-    EXPECT_EQ(FloatFloatTest(5.0f, 7.0f, 4.0f, 10.0f), -1);
-    EXPECT_EQ(FloatFloatTest(6.0f, 10.0f, 7.0f, 3.0f), 1);
-    EXPECT_EQ(FloatFloatTest(9.0f, 7.0f, 8.0f, 10.0f), -1);
-    EXPECT_EQ(FloatFloatTest(8.0f, 8.0f, 9.0f, 7.0f), 1);
-    EXPECT_EQ(FloatFloatTest(9.0f, 4.0f, 6.0f, 10.0f), 1);
-    EXPECT_EQ(FloatFloatTest(-4.0f, -3.0f, -3.0f, -4.0f), -1);
-    EXPECT_EQ(FloatFloatTest(-5.0f, -7.0f, -4.0f, -10.0f), 1);
-    EXPECT_EQ(FloatFloatTest(-6.0f, -10.0f, -7.0f, -3.0f), -1);
-    EXPECT_EQ(FloatFloatTest(-9.0f, -7.0f, -8.0f, -10.0f), 1);
-    EXPECT_EQ(FloatFloatTest(-8.0f, -8.0f, -9.0f, -7.0f), -1);
-    EXPECT_EQ(FloatFloatTest(-9.0f, -4.0f, -6.0f, -10.0f), -1);
-    EXPECT_EQ(FloatFloatTest(FLT_MAX / 2.0f + 2.0f, 1.0f, 1.0f, FLT_MAX), 1);
-}
-TEST_F(TupleRowZOrderCompareTest, Int8Test) {
-    EXPECT_EQ(Int8Int8Test(0, 0, 0, 0), 0);
-    EXPECT_EQ(Int8Int8Test(-5, 3, -5, 3), 0);
-    EXPECT_EQ(Int8Int8Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int8Int8Test(0, 1, 1, 0), -1);
-    EXPECT_EQ(Int8Int8Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int8Int8Test(2, 4, 1, 7), 1);
-    EXPECT_EQ(Int8Int8Test(3, 7, 4, 0), -1);
-    EXPECT_EQ(Int8Int8Test(6, 4, 5, 7), 1);
-    EXPECT_EQ(Int8Int8Test(5, 5, 6, 4), -1);
-    EXPECT_EQ(Int8Int8Test(6, 1, 3, 7), 1);
-    EXPECT_EQ(Int8Int8Test(INT8_MAX / 2 + 2, 1, 1, INT8_MAX), 1);
-    EXPECT_EQ(Int8Int8Test(INT8_MAX / 2, 1, 1, INT8_MAX), -1);
-}
-TEST_F(TupleRowZOrderCompareTest, Int16Test) {
-    EXPECT_EQ(Int16Int16Test(0, 0, 0, 0), 0);
-    EXPECT_EQ(Int16Int16Test(-5, 3, -5, 3), 0);
-    EXPECT_EQ(Int16Int16Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int16Int16Test(0, 1, 1, 0), -1);
-    EXPECT_EQ(Int16Int16Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int16Int16Test(2, 4, 1, 7), 1);
-    EXPECT_EQ(Int16Int16Test(3, 7, 4, 0), -1);
-    EXPECT_EQ(Int16Int16Test(6, 4, 5, 7), 1);
-    EXPECT_EQ(Int16Int16Test(5, 5, 6, 4), -1);
-    EXPECT_EQ(Int16Int16Test(6, 1, 3, 7), 1);
-    EXPECT_EQ(Int16Int16Test(INT16_MAX / 2 + 2, 1, 1, INT16_MAX), 1);
-    EXPECT_EQ(Int16Int16Test(INT16_MAX / 2, 1, 1, INT16_MAX), -1);
-}
-
-TEST_F(TupleRowZOrderCompareTest, Int32Test) {
-    EXPECT_EQ(IntIntTest(0, 2, 1, 1), 1);
-    EXPECT_EQ(IntIntTest(-5, 3, -5, 3), 0);
-
-    EXPECT_EQ(IntIntTest(0, 4, 1, 2), 1);
-    EXPECT_EQ(IntIntTest(0, 1, 1, 0), -1);
-
-    EXPECT_EQ(IntIntTest(1, 0, 0, 1), 1);
-    EXPECT_EQ(IntIntTest(2, 4, 1, 7), 1);
-    EXPECT_EQ(IntIntTest(3, 7, 4, 0), -1);
-    EXPECT_EQ(IntIntTest(6, 4, 5, 7), 1);
-    EXPECT_EQ(IntIntTest(5, 5, 6, 4), -1);
-    EXPECT_EQ(IntIntTest(6, 1, 3, 7), 1);
-
-    EXPECT_EQ(IntIntTest(INT32_MAX / 2 + 2, 1, 1, INT32_MAX), 1);
-    EXPECT_EQ(IntIntTest(INT32_MAX / 2, 1, 1, INT32_MAX), -1);
-
-    EXPECT_EQ(IntIntTest<true>(1, 1, 1, 1), -1);
-    EXPECT_EQ(IntIntTest<true>(4242, 1, 1, 1), -1);
-    EXPECT_EQ(IntIntTest<true>(1, 0, 0, 1), -1);
-    EXPECT_EQ(IntIntTest<true>(1, 0, INT32_MIN, 0), 0);
-}
-
-TEST_F(TupleRowZOrderCompareTest, Int64Test) {
-    EXPECT_EQ(Int64Int64Test(0, 0, 0, 0), 0);
-    EXPECT_EQ(Int64Int64Test(-5, 3, -5, 3), 0);
-    EXPECT_EQ(Int64Int64Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int64Int64Test(0, 1, 1, 0), -1);
-    EXPECT_EQ(Int64Int64Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int64Int64Test(2, 4, 1, 7), 1);
-    EXPECT_EQ(Int64Int64Test(3, 7, 4, 0), -1);
-    EXPECT_EQ(Int64Int64Test(6, 4, 5, 7), 1);
-    EXPECT_EQ(Int64Int64Test(5, 5, 6, 4), -1);
-    EXPECT_EQ(Int64Int64Test(6, 1, 3, 7), 1);
-    EXPECT_EQ(Int64Int64Test(INT64_MAX / 2 + 2, 1, 1, INT64_MAX), 1);
-    EXPECT_EQ(Int64Int64Test(INT64_MAX / 2, 1, 1, INT64_MAX), -1);
-}
-TEST_F(TupleRowZOrderCompareTest, LargeIntTest) {
-    EXPECT_EQ(Int128Int128Test(0, 0, 0, 0), 0);
-    EXPECT_EQ(Int128Int128Test(-5, 3, -5, 3), 0);
-    EXPECT_EQ(Int128Int128Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int128Int128Test(0, 1, 1, 0), -1);
-    EXPECT_EQ(Int128Int128Test(1, 0, 0, 1), 1);
-    EXPECT_EQ(Int128Int128Test(2, 4, 1, 7), 1);
-    EXPECT_EQ(Int128Int128Test(3, 7, 4, 0), -1);
-    EXPECT_EQ(Int128Int128Test(6, 4, 5, 7), 1);
-    EXPECT_EQ(Int128Int128Test(5, 5, 6, 4), -1);
-    EXPECT_EQ(Int128Int128Test(6, 1, 3, 7), 1);
-    EXPECT_EQ(Int128Int128Test(MAX_INT128 / 2 + 2, 1, 1, MAX_INT128), 1);
-    Int128Int128Test(MAX_INT128 / 2, 1, 1, MAX_INT128);
-}
-
-} // namespace doris


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

Reply via email to