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

panxiaolei 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 3bd6c2b51a7 [Chore](type) remove duplicate uint128/int128/uint256 
defines (#35841)
3bd6c2b51a7 is described below

commit 3bd6c2b51a7d9986eb5f5b6bdbe87a18650a0006
Author: Pxl <[email protected]>
AuthorDate: Thu Jun 6 17:29:50 2024 +0800

    [Chore](type) remove duplicate uint128/int128/uint256 defines (#35841)
    
    ## Proposed changes
    remove duplicate uint128/int128 defines
---
 be/src/gutil/CMakeLists.txt                        |   2 -
 be/src/gutil/endian.h                              |  50 ----
 be/src/gutil/hash/city.cc                          | 119 +-------
 be/src/gutil/hash/city.h                           |  10 +-
 be/src/gutil/hash/hash.cc                          | 188 ------------
 be/src/gutil/hash/hash.h                           | 276 -----------------
 be/src/gutil/hash/hash128to64.h                    |  21 --
 be/src/gutil/hash/legacy_hash.h                    |  80 -----
 be/src/gutil/hash/string_hash.h                    |  77 -----
 be/src/gutil/int128.cc                             |  17 --
 be/src/gutil/int128.h                              | 328 ---------------------
 be/src/gutil/strings/numbers.cc                    |  10 -
 be/src/gutil/strings/numbers.h                     |   4 -
 be/src/gutil/strings/stringpiece.cc                |   5 -
 be/src/gutil/strings/stringpiece.h                 |  34 +--
 be/src/io/cache/file_cache_common.h                |   7 +-
 be/src/io/fs/hdfs_file_system.cpp                  |   1 -
 be/src/io/hdfs_util.cpp                            |  26 +-
 be/src/olap/rowset/segment_v2/binary_dict_page.h   |   6 +-
 .../segment_v2/bloom_filter_index_writer.cpp       |   6 +-
 be/src/olap/rowset/segment_v2/page_io.h            |   2 +-
 be/src/olap/rowset/segment_v2/page_pointer.h       |   2 +-
 be/src/olap/schema_change.cpp                      |   1 -
 be/src/olap/single_replica_compaction.cpp          |   4 +-
 be/src/olap/tablet.cpp                             |   1 -
 be/src/olap/task/engine_clone_task.cpp             |   4 +-
 be/src/service/point_query_executor.h              |   1 -
 be/src/util/hash_util.hpp                          |  21 +-
 be/src/util/lru_multi_cache.h                      |   1 -
 be/src/util/lru_multi_cache.inline.h               |   1 +
 be/src/util/path_util.cpp                          |  26 --
 be/src/util/path_util.h                            |   9 -
 be/src/util/s3_util.h                              |  20 +-
 be/src/util/trace.h                                |   1 -
 be/src/vec/common/hash_table/hash.h                |  11 +-
 be/src/vec/common/hash_table/string_hash_map.h     |   6 +-
 be/src/vec/common/hash_table/string_hash_table.h   |   8 +-
 be/src/vec/common/string_ref.h                     |  63 ++--
 be/src/vec/common/uint128.h                        | 123 +-------
 be/src/vec/core/wide_integer.h                     |  22 ++
 be/src/vec/data_types/convert_field_to_type.cpp    |   7 -
 be/src/vec/json/path_in_data.cpp                   |   2 +-
 be/test/util/path_util_test.cpp                    |  11 -
 .../nereids_function_p0/scalar_function/Array.out  | 259 ++++++++--------
 .../scalar_function/Array.groovy                   | 124 ++++----
 45 files changed, 318 insertions(+), 1679 deletions(-)

diff --git a/be/src/gutil/CMakeLists.txt b/be/src/gutil/CMakeLists.txt
index bac9aec3037..0ed2dd1de3d 100644
--- a/be/src/gutil/CMakeLists.txt
+++ b/be/src/gutil/CMakeLists.txt
@@ -27,9 +27,7 @@ SET(SOURCE_FILES
         bits.cc
         dynamic_annotations.c
         hash/city.cc
-        hash/hash.cc
         hash/jenkins.cc
-        int128.cc
         ref_counted.cc
         stringprintf.cc
         strings/ascii_ctype.cc
diff --git a/be/src/gutil/endian.h b/be/src/gutil/endian.h
index f1a9cf2a1a2..4bc04e1e303 100644
--- a/be/src/gutil/endian.h
+++ b/be/src/gutil/endian.h
@@ -32,7 +32,6 @@
 
 #include <assert.h>
 
-#include "gutil/int128.h"
 #include "gutil/integral_types.h"
 #include "gutil/port.h"
 #include "vec/core/wide_integer.h"
@@ -197,29 +196,6 @@ public:
 
     static void Store64(void* p, uint64 v) { UNALIGNED_STORE64(p, 
FromHost64(v)); }
 
-    static uint128 Load128(const void* p) {
-        return uint128(ToHost64(UNALIGNED_LOAD64(reinterpret_cast<const 
uint64*>(p) + 1)),
-                       ToHost64(UNALIGNED_LOAD64(p)));
-    }
-
-    static void Store128(void* p, const uint128 v) {
-        UNALIGNED_STORE64(p, FromHost64(Uint128Low64(v)));
-        UNALIGNED_STORE64(reinterpret_cast<uint64*>(p) + 1, 
FromHost64(Uint128High64(v)));
-    }
-
-    // Build a uint128 from 1-16 bytes.
-    // 8 * len least significant bits are loaded from the memory with
-    // LittleEndian order. The 128 - 8 * len most significant bits are
-    // set all to 0.
-    static uint128 Load128VariableLength(const void* p, int len) {
-        if (len <= 8) {
-            return uint128(Load64VariableLength(p, len));
-        } else {
-            return uint128(Load64VariableLength(static_cast<const char*>(p) + 
8, len - 8),
-                           Load64(p));
-        }
-    }
-
     // Load & Store in machine's word size.
     static uword_t LoadUnsignedWord(const void* p) {
         if (sizeof(uword_t) == 8)
@@ -278,9 +254,6 @@ public:
     static uint64 FromHost64(uint64 x) { return x; }
     static uint64 ToHost64(uint64 x) { return x; }
 
-    static uint128 FromHost128(uint128 x) { return x; }
-    static uint128 ToHost128(uint128 x) { return x; }
-
     static wide::UInt256 FromHost256(wide::UInt256 x) { return x; }
     static wide::UInt256 ToHost256(wide::UInt256 x) { return x; }
 
@@ -328,29 +301,6 @@ public:
 
     static void Store64(void* p, uint64 v) { UNALIGNED_STORE64(p, 
FromHost64(v)); }
 
-    static uint128 Load128(const void* p) {
-        return uint128(ToHost64(UNALIGNED_LOAD64(p)),
-                       ToHost64(UNALIGNED_LOAD64(reinterpret_cast<const 
uint64*>(p) + 1)));
-    }
-
-    static void Store128(void* p, const uint128 v) {
-        UNALIGNED_STORE64(p, FromHost64(Uint128High64(v)));
-        UNALIGNED_STORE64(reinterpret_cast<uint64*>(p) + 1, 
FromHost64(Uint128Low64(v)));
-    }
-
-    // Build a uint128 from 1-16 bytes.
-    // 8 * len least significant bits are loaded from the memory with
-    // BigEndian order. The 128 - 8 * len most significant bits are
-    // set all to 0.
-    static uint128 Load128VariableLength(const void* p, int len) {
-        if (len <= 8) {
-            return uint128(Load64VariableLength(static_cast<const char*>(p) + 
8, len));
-        } else {
-            return uint128(Load64VariableLength(p, len - 8),
-                           Load64(static_cast<const char*>(p) + 8));
-        }
-    }
-
     // Load & Store in machine's word size.
     static uword_t LoadUnsignedWord(const void* p) {
         if (sizeof(uword_t) == 8)
diff --git a/be/src/gutil/hash/city.cc b/be/src/gutil/hash/city.cc
index a8163a0e68e..d4d53ab2f6b 100644
--- a/be/src/gutil/hash/city.cc
+++ b/be/src/gutil/hash/city.cc
@@ -19,6 +19,7 @@
 // IWYU pragma: no_include <pstl/glue_algorithm_defs.h>
 
 #include <sys/types.h>
+
 #include <algorithm>
 #include <iterator>
 
@@ -34,10 +35,7 @@ using std::make_pair;
 using std::pair;
 
 #include "common/logging.h"
-
 #include "gutil/endian.h"
-#include "gutil/hash/hash128to64.h"
-#include "gutil/int128.h"
 #include "gutil/integral_types.h"
 #include "gutil/port.h"
 
@@ -71,8 +69,14 @@ static uint64 ShiftMix(uint64 val) {
     return val ^ (val >> 47);
 }
 
-static uint64 HashLen16(uint64 u, uint64 v) {
-    return Hash128to64(uint128(u, v));
+uint64 HashLen16(uint64 u, uint64 v) {
+    const uint64 kMul = 0xc6a4a7935bd1e995ULL;
+    uint64 a = (u ^ v) * kMul;
+    a ^= (a >> 47);
+    uint64 b = (v ^ a) * kMul;
+    b ^= (b >> 47);
+    b *= kMul;
+    return b;
 }
 
 static uint64 HashLen0to16(const char* s, size_t len) {
@@ -202,109 +206,4 @@ uint64 CityHash64WithSeed(const char* s, size_t len, 
uint64 seed) {
 uint64 CityHash64WithSeeds(const char* s, size_t len, uint64 seed0, uint64 
seed1) {
     return HashLen16(CityHash64(s, len) - seed0, seed1);
 }
-
-// A subroutine for CityHash128().  Returns a decent 128-bit hash for strings
-// of any length representable in ssize_t.  Based on City and Murmur128.
-static uint128 CityMurmur(const char* s, size_t len, uint128 seed) {
-    uint64 a = Uint128Low64(seed);
-    uint64 b = Uint128High64(seed);
-    uint64 c = 0;
-    uint64 d = 0;
-    ssize_t l = len - 16;
-    if (l <= 0) { // len <= 16
-        c = b * k1 + HashLen0to16(s, len);
-        d = Rotate(a + (len >= 8 ? LittleEndian::Load64(s) : c), 32);
-    } else { // len > 16
-        c = HashLen16(LittleEndian::Load64(s + len - 8) + k1, a);
-        d = HashLen16(b + len, c + LittleEndian::Load64(s + len - 16));
-        a += d;
-        do {
-            a ^= ShiftMix(LittleEndian::Load64(s) * k1) * k1;
-            a *= k1;
-            b ^= a;
-            c ^= ShiftMix(LittleEndian::Load64(s + 8) * k1) * k1;
-            c *= k1;
-            d ^= c;
-            s += 16;
-            l -= 16;
-        } while (l > 0);
-    }
-    a = HashLen16(a, c);
-    b = HashLen16(d, b);
-    return uint128(a ^ b, HashLen16(b, a));
-}
-
-uint128 CityHash128WithSeed(const char* s, size_t len, uint128 seed) {
-    // TODO(user): As of February 2011, there's a beta of Murmur3 that would
-    // most likely be useful here.  E.g., if (len < 900) return Murmur3(...)
-    if (len < 128) {
-        return CityMurmur(s, len, seed);
-    }
-
-    // We expect len >= 128 to be the common case.  Keep 56 bytes of state:
-    // v, w, x, y, and z.
-    pair<uint64, uint64> v, w;
-    uint64 x = Uint128Low64(seed);
-    uint64 y = Uint128High64(seed);
-    uint64 z = len * k1;
-    v.first = Rotate(y ^ k1, 49) * k1 + LittleEndian::Load64(s);
-    v.second = Rotate(v.first, 42) * k1 + LittleEndian::Load64(s + 8);
-    w.first = Rotate(y + z, 35) * k1 + x;
-    w.second = Rotate(x + LittleEndian::Load64(s + 88), 53) * k1;
-
-    // This is similar to the inner loop of CityHash64(), manually unrolled.
-    do {
-        x = Rotate(x + y + v.first + LittleEndian::Load64(s + 16), 37) * k1;
-        y = Rotate(y + v.second + LittleEndian::Load64(s + 48), 42) * k1;
-        x ^= w.second;
-        y ^= v.first;
-        z = Rotate(z ^ w.first, 33);
-        v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
-        w = WeakHashLen32WithSeeds(s + 32, z + w.second, y);
-        std::swap(z, x);
-        s += 64;
-        x = Rotate(x + y + v.first + LittleEndian::Load64(s + 16), 37) * k1;
-        y = Rotate(y + v.second + LittleEndian::Load64(s + 48), 42) * k1;
-        x ^= w.second;
-        y ^= v.first;
-        z = Rotate(z ^ w.first, 33);
-        v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
-        w = WeakHashLen32WithSeeds(s + 32, z + w.second, y);
-        std::swap(z, x);
-        s += 64;
-        len -= 128;
-    } while (PREDICT_TRUE(len >= 128));
-    y += Rotate(w.first, 37) * k0 + z;
-    x += Rotate(v.first + z, 49) * k0;
-    // If 0 < len < 128, hash up to 4 chunks of 32 bytes each from the end of 
s.
-    for (size_t tail_done = 0; tail_done < len;) {
-        tail_done += 32;
-        y = Rotate(y - x, 42) * k0 + v.second;
-        w.first += LittleEndian::Load64(s + len - tail_done + 16);
-        x = Rotate(x, 49) * k0 + w.first;
-        w.first += v.first;
-        v = WeakHashLen32WithSeeds(s + len - tail_done, v.first, v.second);
-    }
-    // At this point our 48 bytes of state should contain more than
-    // enough information for a strong 128-bit hash.  We use two
-    // different 48-byte-to-8-byte hashes to get a 16-byte final result.
-    x = HashLen16(x, v.first);
-    y = HashLen16(y, w.first);
-    return uint128(HashLen16(x + v.second, w.second) + y, HashLen16(x + 
w.second, y + v.second));
-}
-
-uint128 CityHash128(const char* s, size_t len) {
-    if (len >= 16) {
-        return CityHash128WithSeed(
-                s + 16, len - 16,
-                uint128(LittleEndian::Load64(s) ^ k3, LittleEndian::Load64(s + 
8)));
-    } else if (len >= 8) {
-        return CityHash128WithSeed(nullptr, 0,
-                                   uint128(LittleEndian::Load64(s) ^ (len * 
k0),
-                                           LittleEndian::Load64(s + len - 8) ^ 
k1));
-    } else {
-        return CityHash128WithSeed(s, len, uint128(k0, k1));
-    }
-}
-
 } // namespace util_hash
diff --git a/be/src/gutil/hash/city.h b/be/src/gutil/hash/city.h
index bcacaa91474..8e6042b61a8 100644
--- a/be/src/gutil/hash/city.h
+++ b/be/src/gutil/hash/city.h
@@ -22,11 +22,12 @@
 
 #include <stddef.h> // for size_t.
 
-#include "gutil/int128.h"
 #include "gutil/integral_types.h"
 
 namespace util_hash {
 
+uint64 HashLen16(uint64 u, uint64 v);
+
 // Hash function for a byte array.
 // The mapping may change from time to time.
 uint64 CityHash64(const char* buf, size_t len);
@@ -39,11 +40,4 @@ uint64 CityHash64WithSeed(const char* buf, size_t len, 
uint64 seed);
 // hashed into the result.  The mapping may change from time to time.
 uint64 CityHash64WithSeeds(const char* buf, size_t len, uint64 seed0, uint64 
seed1);
 
-// Hash function for a byte array.  The mapping will never change.
-uint128 CityHash128(const char* s, size_t len);
-
-// Hash function for a byte array.  For convenience, a 128-bit seed is also
-// hashed into the result.  The mapping will never change.
-uint128 CityHash128WithSeed(const char* s, size_t len, uint128 seed);
-
 } // namespace util_hash
diff --git a/be/src/gutil/hash/hash.cc b/be/src/gutil/hash/hash.cc
deleted file mode 100644
index b16bea5dfea..00000000000
--- a/be/src/gutil/hash/hash.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-//
-// This is the legacy unified hash library implementation. Its components are
-// being split up into smaller, dedicated libraries. What remains here are
-// things still being migrated.
-//
-// To find the implementation of the core Bob Jenkins lookup2 hash, look in
-// jenkins.cc.
-
-#include "gutil/hash/hash.h"
-
-#include "common/logging.h"
-
-#include "gutil/hash/jenkins.h"
-#include "gutil/hash/jenkins_lookup2.h"
-#include "gutil/integral_types.h"
-
-// For components that ship code externally (notably the Google Search
-// Appliance) we want to change the fingerprint function so that
-// attackers cannot mount offline attacks to find collisions with
-// google.com internal fingerprints (most importantly, for URL
-// fingerprints).
-#ifdef GOOGLECLIENT
-#error Do not compile this into binaries that we deliver to users!
-#error Instead, use
-#endif
-#ifdef EXTERNAL_FP
-static const uint32 kFingerprintSeed0 = 0xabc;
-static const uint32 kFingerprintSeed1 = 0xdef;
-#else
-static const uint32 kFingerprintSeed0 = 0;
-static const uint32 kFingerprintSeed1 = 102072;
-#endif
-
-static inline uint32 char2unsigned(char c) {
-    return static_cast<uint32>(static_cast<unsigned char>(c));
-}
-
-uint64 FingerprintReferenceImplementation(const char* s, uint32 len) {
-    uint32 hi = Hash32StringWithSeed(s, len, kFingerprintSeed0);
-    uint32 lo = Hash32StringWithSeed(s, len, kFingerprintSeed1);
-    return CombineFingerprintHalves(hi, lo);
-}
-
-// This is a faster version of FingerprintReferenceImplementation(),
-// making use of the fact that we're hashing the same string twice.
-// The code is tedious to read, but it's just two interleaved copies of
-// Hash32StringWithSeed().
-uint64 FingerprintInterleavedImplementation(const char* s, uint32 len) {
-    uint32 a, b, c = kFingerprintSeed0, d, e, f = kFingerprintSeed1;
-    uint32 keylen;
-
-    a = b = d = e = 0x9e3779b9UL; // the golden ratio; an arbitrary value
-
-    keylen = len;
-    if (keylen >= 4 * sizeof(a)) {
-        uint32 word32AtOffset0 = Google1At(s);
-        do {
-            a += word32AtOffset0;
-            d += word32AtOffset0;
-            b += Google1At(s + sizeof(a));
-            e += Google1At(s + sizeof(a));
-            c += Google1At(s + sizeof(a) * 2);
-            f += Google1At(s + sizeof(a) * 2);
-            s += 3 * sizeof(a);
-            word32AtOffset0 = Google1At(s);
-            mix(a, b, c);
-            mix(d, e, f);
-            keylen -= 3 * static_cast<uint32>(sizeof(a));
-        } while (keylen >= 4 * sizeof(a));
-        if (keylen >= 3 * sizeof(a)) {
-            a += word32AtOffset0;
-            d += word32AtOffset0;
-            b += Google1At(s + sizeof(a));
-            e += Google1At(s + sizeof(a));
-            c += Google1At(s + sizeof(a) * 2);
-            f += Google1At(s + sizeof(a) * 2);
-            s += 3 * sizeof(a);
-            mix(a, b, c);
-            mix(d, e, f);
-            keylen -= 3 * static_cast<uint32>(sizeof(a));
-            DCHECK_LT(keylen, sizeof(a));
-            c += len;
-            f += len;
-            switch (keylen) { // deal with rest.  Cases fall through
-            case 3:
-                a += char2unsigned(s[2]) << 16;
-                d += char2unsigned(s[2]) << 16;
-            case 2:
-                a += char2unsigned(s[1]) << 8;
-                d += char2unsigned(s[1]) << 8;
-            case 1:
-                a += char2unsigned(s[0]);
-                d += char2unsigned(s[0]);
-            }
-        } else {
-            DCHECK(sizeof(a) <= keylen && keylen < 3 * sizeof(a));
-            c += len;
-            f += len;
-            switch (keylen) { // deal with rest.  Cases fall through
-            case 11:
-                c += char2unsigned(s[10]) << 24;
-                f += char2unsigned(s[10]) << 24;
-            case 10:
-                c += char2unsigned(s[9]) << 16;
-                f += char2unsigned(s[9]) << 16;
-            case 9:
-                c += char2unsigned(s[8]) << 8;
-                f += char2unsigned(s[8]) << 8;
-            case 8:
-                b += Google1At(s + 4);
-                a += word32AtOffset0;
-                e += Google1At(s + 4);
-                d += word32AtOffset0;
-                break;
-            case 7:
-                b += char2unsigned(s[6]) << 16;
-                e += char2unsigned(s[6]) << 16;
-            case 6:
-                b += char2unsigned(s[5]) << 8;
-                e += char2unsigned(s[5]) << 8;
-            case 5:
-                b += char2unsigned(s[4]);
-                e += char2unsigned(s[4]);
-            case 4:
-                a += word32AtOffset0;
-                d += word32AtOffset0;
-            }
-        }
-    } else {
-        if (keylen >= 3 * sizeof(a)) {
-            a += Google1At(s);
-            d += Google1At(s);
-            b += Google1At(s + sizeof(a));
-            e += Google1At(s + sizeof(a));
-            c += Google1At(s + sizeof(a) * 2);
-            f += Google1At(s + sizeof(a) * 2);
-            s += 3 * sizeof(a);
-            mix(a, b, c);
-            mix(d, e, f);
-            keylen -= 3 * static_cast<uint32>(sizeof(a));
-        }
-        c += len;
-        f += len;
-        switch (keylen) { // deal with rest.  Cases fall through
-        case 11:
-            c += char2unsigned(s[10]) << 24;
-            f += char2unsigned(s[10]) << 24;
-        case 10:
-            c += char2unsigned(s[9]) << 16;
-            f += char2unsigned(s[9]) << 16;
-        case 9:
-            c += char2unsigned(s[8]) << 8;
-            f += char2unsigned(s[8]) << 8;
-        case 8:
-            b += Google1At(s + 4);
-            a += Google1At(s);
-            e += Google1At(s + 4);
-            d += Google1At(s);
-            break;
-        case 7:
-            b += char2unsigned(s[6]) << 16;
-            e += char2unsigned(s[6]) << 16;
-        case 6:
-            b += char2unsigned(s[5]) << 8;
-            e += char2unsigned(s[5]) << 8;
-        case 5:
-            b += char2unsigned(s[4]);
-            e += char2unsigned(s[4]);
-        case 4:
-            a += Google1At(s);
-            d += Google1At(s);
-            break;
-        case 3:
-            a += char2unsigned(s[2]) << 16;
-            d += char2unsigned(s[2]) << 16;
-        case 2:
-            a += char2unsigned(s[1]) << 8;
-            d += char2unsigned(s[1]) << 8;
-        case 1:
-            a += char2unsigned(s[0]);
-            d += char2unsigned(s[0]);
-        }
-    }
-    mix(a, b, c);
-    mix(d, e, f);
-    return CombineFingerprintHalves(c, f);
-}
diff --git a/be/src/gutil/hash/hash.h b/be/src/gutil/hash/hash.h
deleted file mode 100644
index 18eedceeb94..00000000000
--- a/be/src/gutil/hash/hash.h
+++ /dev/null
@@ -1,276 +0,0 @@
-//
-// Copyright (C) 1999 and onwards Google, Inc.
-//
-//
-// This file contains routines for hashing and fingerprinting.
-//
-// A hash function takes an arbitrary input bitstring (string, char*,
-// number) and turns it into a hash value (a fixed-size number) such
-// that unequal input values have a high likelihood of generating
-// unequal hash values.  A fingerprint is a hash whose design is
-// biased towards avoiding hash collisions, possibly at the expense of
-// other characteristics such as execution speed.
-//
-// In general, if you are only using the hash values inside a single
-// executable -- you're not writing the values to disk, and you don't
-// depend on another instance of your program, running on another
-// machine, generating the same hash values as you -- you want to use
-// a HASH.  Otherwise, you want to use a FINGERPRINT.
-//
-// RECOMMENDED HASH FOR STRINGS:    GoodFastHash
-//
-// It is a functor, so you can use it like this:
-//     hash_map<string, xxx, GoodFastHash<string> >
-//     hash_set<char *, GoodFastHash<char*> >
-//
-// RECOMMENDED HASH FOR NUMBERS:    hash<>
-//
-// Note that this is likely the identity hash, so if your
-// numbers are "non-random" (especially in the low bits), another
-// choice is better.  You can use it like this:
-//     hash_map<int, xxx>
-//     hash_set<uint64>
-//
-// RECOMMENDED HASH FOR POINTERS:    hash<>
-//
-// This is also likely the identity hash.
-//
-// RECOMMENDED HASH FOR STRUCTS:    hash<some_fingerprint(struct)>
-//
-// Take a fingerprint of the struct, and use that as the key.
-// For instance: const uint64 hash_data[] = { s.foo, bit_cast<uint64>(s.bar) };
-//    uint64 fprint = <fingerprint fn>(reinterpret_cast<const 
char*>(hash_data),
-//                                     sizeof(hash_data));
-//    hash_map[fprint] = whatever;
-//
-// RECOMMENDED FINGERPRINT:         Fingerprint2011
-//
-// (In util/hash/fingerprint2011.h)
-// In particular, do *not* use Fingerprint in new code; it has
-// problems with excess collisions.
-//
-// OTHER HASHES AND FINGERPRINTS:
-//
-//
-// The wiki page also has good advice for when to use a fingerprint vs
-// a hash.
-//
-//
-// Note: if your file declares hash_map<string, ...> or
-// hash_set<string>, it will use the default hash function,
-// hash<string>.  This is not a great choice.  Always provide an
-// explicit functor, such as GoodFastHash, as a template argument.
-// (Either way, you will need to #include this file to get the
-// necessary definition.)
-//
-// Some of the hash functions below are documented to be fixed
-// forever; the rest (whether they're documented as so or not) may
-// change over time.  If you require a hash function that does not
-// change over time, you should have unittests enforcing this
-// property.  We already have several such functions; see
-// hash_unittest.cc for the details and unittests.
-
-#pragma once
-
-#include <stddef.h>
-#include <string.h>
-#include <string>
-#include <cstddef>
-#include <functional>
-#include <iterator>
-#include <string_view>
-
-#include "gutil/hash/hash128to64.h"
-#include "gutil/hash/jenkins.h"
-#include "gutil/hash/jenkins_lookup2.h"
-#include "gutil/hash/legacy_hash.h"
-#include "gutil/hash/string_hash.h"
-#include "gutil/int128.h"
-#include "gutil/integral_types.h"
-#include "gutil/hash/builtin_type_hash.h"
-
-// ----------------------------------------------------------------------
-// Fingerprint()
-//   Not recommended for new code.  Instead, use Fingerprint2011(),
-//   a higher-quality and faster hash function.  See fingerprint2011.h.
-//
-//   Fingerprinting a string (or char*) will never return 0 or 1,
-//   in case you want a couple of special values.  However,
-//   fingerprinting a numeric type may produce 0 or 1.
-//
-//   The hash mapping of Fingerprint() will never change.
-//
-//   Note: AVOID USING FINGERPRINT if at all possible.  Use
-//   Fingerprint2011 (in fingerprint2011.h) instead.
-//   Fingerprint() is susceptible to collisions for even short
-//   strings with low edit distance; see
-//   Example collisions:
-//     "01056/02" vs. "11057/02"
-//     "LTA 02" vs. "MTA 12"
-//   The same study found only one collision each for CityHash64() and
-//   MurmurHash64(), from more than 2^32 inputs, and on medium-length
-//   strings with large edit distances.These issues, among others,
-//   led to the recommendation that new code should avoid Fingerprint().
-// ----------------------------------------------------------------------
-extern uint64 FingerprintReferenceImplementation(const char* s, uint32 len);
-extern uint64 FingerprintInterleavedImplementation(const char* s, uint32 len);
-inline uint64 Fingerprint(const char* s, uint32 len) {
-    if constexpr (sizeof(s) == 8) { // 64-bit systems have 8-byte pointers.
-        // The better choice when we have a decent number of registers.
-        return FingerprintInterleavedImplementation(s, len);
-    } else {
-        return FingerprintReferenceImplementation(s, len);
-    }
-}
-
-// Routine that combines the hi/lo part of a fingerprint
-// and changes the result appropriately to avoid returning 0/1.
-inline uint64 CombineFingerprintHalves(uint32 hi, uint32 lo) {
-    uint64 result = (static_cast<uint64>(hi) << 32) | static_cast<uint64>(lo);
-    if ((hi == 0) && (lo < 2)) {
-        result ^= GG_ULONGLONG(0x130f9bef94a0a928);
-    }
-    return result;
-}
-
-inline uint64 Fingerprint(const std::string& s) {
-    return Fingerprint(s.data(), static_cast<uint32>(s.size()));
-}
-inline uint64 Hash64StringWithSeed(const std::string& s, uint64 c) {
-    return Hash64StringWithSeed(s.data(), static_cast<uint32>(s.size()), c);
-}
-inline uint64 Fingerprint(schar c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(char c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(uint16 c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(int16 c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(uint32 c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(int32 c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(uint64 c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-inline uint64 Fingerprint(int64 c) {
-    return Hash64NumWithSeed(static_cast<uint64>(c), MIX64);
-}
-
-// This concatenates two 64-bit fingerprints. It is a convenience function to
-// get a fingerprint for a combination of already fingerprinted components.
-// It assumes that each input is already a good fingerprint itself.
-// Note that this is legacy code and new code should use its replacement
-// FingerprintCat2011().
-//
-// Note that in general it's impossible to construct Fingerprint(str)
-// from the fingerprints of substrings of str.  One shouldn't expect
-// FingerprintCat(Fingerprint(x), Fingerprint(y)) to indicate
-// anything about Fingerprint(StrCat(x, y)).
-inline uint64 FingerprintCat(uint64 fp1, uint64 fp2) {
-    return Hash64NumWithSeed(fp1, fp2);
-}
-
-// This intended to be a "good" hash function.  It may change from time to 
time.
-template <>
-struct std::hash<uint128> {
-    size_t operator()(const uint128& x) const {
-        if (sizeof(&x) == 8) { // 64-bit systems have 8-byte pointers.
-            return Hash128to64(x);
-        } else {
-            uint32 a = static_cast<uint32>(Uint128Low64(x)) + 
static_cast<uint32>(0x9e3779b9UL);
-            uint32 b =
-                    static_cast<uint32>(Uint128Low64(x) >> 32) + 
static_cast<uint32>(0x9e3779b9UL);
-            uint32 c = static_cast<uint32>(Uint128High64(x)) + MIX32;
-            mix(a, b, c);
-            a += static_cast<uint32>(Uint128High64(x) >> 32);
-            mix(a, b, c);
-            return c;
-        }
-    }
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
-
-// Hasher for STL pairs. Requires hashers for both members to be defined
-template <class First, class Second>
-struct std::hash<std::pair<First, Second> > {
-    size_t operator()(const pair<First, Second>& p) const {
-        size_t h1 = std::hash<First>()(p.first);
-        size_t h2 = std::hash<Second>()(p.second);
-        // The decision below is at compile time
-        return (sizeof(h1) <= sizeof(uint32)) ? Hash32NumWithSeed(h1, h2)
-                                              : Hash64NumWithSeed(h1, h2);
-    }
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
-
-// If you want an excellent string hash function, and you don't mind if it
-// might change when you sync and recompile, please use GoodFastHash<>.
-// For most applications, GoodFastHash<> is a good choice, better than
-// hash<string> or hash<char*> or similar.  GoodFastHash<> can change
-// from time to time and may differ across platforms, and we'll strive
-// to keep improving it.
-//
-// By the way, when deleting the contents of a hash_set of pointers, it is
-// unsafe to delete *iterator because the hash function may be called on
-// the next iterator advance.  Use STLDeleteContainerPointers().
-
-template <class X>
-struct GoodFastHash;
-
-// This intended to be a "good" hash function.  It may change from time to 
time.
-template <>
-struct GoodFastHash<char*> {
-    size_t operator()(const char* s) const { return HashStringThoroughly(s, 
strlen(s)); }
-    // Less than operator for MSVC.
-    bool operator()(const char* a, const char* b) const { return strcmp(a, b) 
< 0; }
-    static const size_t bucket_size = 4; // These are required by MSVC
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
-
-// This intended to be a "good" hash function.  It may change from time to 
time.
-template <>
-struct GoodFastHash<const char*> {
-    size_t operator()(const char* s) const { return HashStringThoroughly(s, 
strlen(s)); }
-    // Less than operator for MSVC.
-    bool operator()(const char* a, const char* b) const { return strcmp(a, b) 
< 0; }
-    static const size_t bucket_size = 4; // These are required by MSVC
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
-
-// This intended to be a "good" hash function.  It may change from time to 
time.
-template <class _CharT, class _Traits, class _Alloc>
-struct GoodFastHash<std::basic_string<_CharT, _Traits, _Alloc> > {
-    size_t operator()(const std::basic_string<_CharT, _Traits, _Alloc>& k) 
const {
-        return HashStringThoroughly(k.data(), k.length() * sizeof(k[0]));
-    }
-    // Less than operator for MSVC.
-    bool operator()(const std::basic_string<_CharT, _Traits, _Alloc>& a,
-                    const std::basic_string<_CharT, _Traits, _Alloc>& b) const 
{
-        return a < b;
-    }
-    static const size_t bucket_size = 4; // These are required by MSVC
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
-
-// This intended to be a "good" hash function.  It may change from time to 
time.
-template <class _CharT, class _Traits, class _Alloc>
-struct GoodFastHash<const std::basic_string<_CharT, _Traits, _Alloc> > {
-    size_t operator()(const std::basic_string<_CharT, _Traits, _Alloc>& k) 
const {
-        return HashStringThoroughly(k.data(), k.length() * sizeof(k[0]));
-    }
-    // Less than operator for MSVC.
-    bool operator()(const std::basic_string<_CharT, _Traits, _Alloc>& a,
-                    const std::basic_string<_CharT, _Traits, _Alloc>& b) const 
{
-        return a < b;
-    }
-    static const size_t bucket_size = 4; // These are required by MSVC
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
diff --git a/be/src/gutil/hash/hash128to64.h b/be/src/gutil/hash/hash128to64.h
deleted file mode 100644
index 1bf870a6d69..00000000000
--- a/be/src/gutil/hash/hash128to64.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2010 Google Inc. All Rights Reserved.
-// Authors: [email protected] (Jyrki Alakuijala), [email protected] (Geoff Pike)
-
-#pragma once
-
-#include "gutil/int128.h"
-#include "gutil/integral_types.h"
-
-// Hash 128 input bits down to 64 bits of output.
-// This is intended to be a reasonably good hash function.
-// It may change from time to time.
-inline uint64 Hash128to64(const uint128& x) {
-    // Murmur-inspired hashing.
-    const uint64 kMul = 0xc6a4a7935bd1e995ULL;
-    uint64 a = (Uint128Low64(x) ^ Uint128High64(x)) * kMul;
-    a ^= (a >> 47);
-    uint64 b = (Uint128High64(x) ^ a) * kMul;
-    b ^= (b >> 47);
-    b *= kMul;
-    return b;
-}
diff --git a/be/src/gutil/hash/legacy_hash.h b/be/src/gutil/hash/legacy_hash.h
deleted file mode 100644
index 9dff097031a..00000000000
--- a/be/src/gutil/hash/legacy_hash.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-//
-// This is a library of legacy hashing routines. These routines are still in
-// use, but are not encouraged for any new code, and may be removed at some
-// point in the future.
-//
-// New code should use one of the targeted libraries that provide hash
-// interfaces for the types needed. See //util/hash/README for details.
-
-#pragma once
-
-#include "gutil/hash/builtin_type_hash.h"
-#include "gutil/hash/string_hash.h"
-#include "gutil/integral_types.h"
-
-// Hash8, Hash16 and Hash32 are for legacy use only.
-typedef uint32 Hash32;
-typedef uint16 Hash16;
-typedef uint8 Hash8;
-
-const Hash32 kIllegalHash32 = static_cast<Hash32>(0xffffffffUL);
-const Hash16 kIllegalHash16 = static_cast<Hash16>(0xffff);
-
-static const uint32 MIX32 = 0x12b9b0a1UL;                     // pi; an 
arbitrary number
-static const uint64 MIX64 = GG_ULONGLONG(0x2b992ddfa23249d6); // more of pi
-
-// ----------------------------------------------------------------------
-// HashTo32()
-// HashTo16()
-//    These functions take various types of input (through operator
-//    overloading) and return 32 or 16 bit quantities, respectively.
-//    The basic rule of our hashing is: always mix().  Thus, even for
-//    char outputs we cast to a uint32 and mix with two arbitrary numbers.
-//    HashTo32 never returns kIllegalHash32, and similarity,
-//    HashTo16 never returns kIllegalHash16.
-//
-// Note that these methods avoid returning certain reserved values, while
-// the corresponding HashXXStringWithSeed() methods may return any value.
-// ----------------------------------------------------------------------
-
-// This macro defines the HashTo32 and HashTo16 versions all in one go.
-// It takes the argument list and a command that hashes your number.
-// (For 16 we just mod retval before returning it.)  Example:
-//    HASH_TO((char c), Hash32NumWithSeed(c, MIX32_1))
-// evaluates to
-//    uint32 retval;
-//    retval = Hash32NumWithSeed(c, MIX32_1);
-//    return retval == kIllegalHash32 ? retval-1 : retval;
-//
-
-#define HASH_TO(arglist, command)                              \
-    inline uint32 HashTo32 arglist {                           \
-        uint32 retval = command;                               \
-        return retval == kIllegalHash32 ? retval - 1 : retval; \
-    }
-
-// This defines:
-// HashToXX(char *s, int slen);
-// HashToXX(char c);
-// etc
-
-HASH_TO((const char* s, uint32 slen), Hash32StringWithSeed(s, slen, MIX32))
-HASH_TO((const wchar_t* s, uint32 slen),
-        Hash32StringWithSeed(reinterpret_cast<const char*>(s),
-                             static_cast<uint32>(sizeof(wchar_t) * slen), 
MIX32))
-HASH_TO((char c), Hash32NumWithSeed(static_cast<uint32>(c), MIX32))
-HASH_TO((schar c), Hash32NumWithSeed(static_cast<uint32>(c), MIX32))
-HASH_TO((uint16 c), Hash32NumWithSeed(static_cast<uint32>(c), MIX32))
-HASH_TO((int16 c), Hash32NumWithSeed(static_cast<uint32>(c), MIX32))
-HASH_TO((uint32 c), Hash32NumWithSeed(static_cast<uint32>(c), MIX32))
-HASH_TO((int32 c), Hash32NumWithSeed(static_cast<uint32>(c), MIX32))
-HASH_TO((uint64 c), static_cast<uint32>(Hash64NumWithSeed(c, MIX64) >> 32))
-HASH_TO((int64 c), static_cast<uint32>(Hash64NumWithSeed(c, MIX64) >> 32))
-
-#undef HASH_TO // clean up the macro space
-
-inline uint16 HashTo16(const char* s, uint32 slen) {
-    uint16 retval = Hash32StringWithSeed(s, slen, MIX32) >> 16;
-    return retval == kIllegalHash16 ? static_cast<uint16>(retval - 1) : retval;
-}
diff --git a/be/src/gutil/hash/string_hash.h b/be/src/gutil/hash/string_hash.h
deleted file mode 100644
index 70f78d06172..00000000000
--- a/be/src/gutil/hash/string_hash.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-//
-// These are the core hashing routines which operate on strings. We define
-// strings loosely as a sequence of bytes, and these routines are designed to
-// work with the most fundamental representations of a string of bytes.
-//
-// These routines provide "good" hash functions in terms of both quality and
-// speed. Their values can and will change as their implementations change and
-// evolve.
-
-#pragma once
-
-#include <stddef.h>
-
-#include "gutil/hash/city.h"
-#include "gutil/hash/jenkins.h"
-#include "gutil/hash/jenkins_lookup2.h"
-#include "gutil/integral_types.h"
-#include "gutil/port.h"
-
-namespace hash_internal {
-
-// We have some special cases for 64-bit hardware and x86-64 in particular.
-// Instead of sprinkling ifdefs through the file, we have one ugly ifdef here.
-// Later code can then use "if" instead of "ifdef".
-#if defined(__x86_64__)
-enum { x86_64 = true, sixty_four_bit = true };
-#elif defined(_LP64)
-enum { x86_64 = false, sixty_four_bit = true };
-#else
-enum { x86_64 = false, sixty_four_bit = false };
-#endif
-
-// Arbitrary mix constants (pi).
-static const uint32 kMix32 = 0x12b9b0a1UL;
-static const uint64 kMix64 = GG_ULONGLONG(0x2b992ddfa23249d6);
-
-} // namespace hash_internal
-
-inline size_t HashStringThoroughlyWithSeed(const char* s, size_t len, size_t 
seed) {
-    if (hash_internal::x86_64)
-        return static_cast<size_t>(util_hash::CityHash64WithSeed(s, len, 
seed));
-
-    if (hash_internal::sixty_four_bit)
-        return Hash64StringWithSeed(s, static_cast<uint32>(len), seed);
-
-    return static_cast<size_t>(
-            Hash32StringWithSeed(s, static_cast<uint32>(len), 
static_cast<uint32>(seed)));
-}
-
-inline size_t HashStringThoroughly(const char* s, size_t len) {
-    if (hash_internal::x86_64) return 
static_cast<size_t>(util_hash::CityHash64(s, len));
-
-    if (hash_internal::sixty_four_bit)
-        return Hash64StringWithSeed(s, static_cast<uint32>(len), 
hash_internal::kMix64);
-
-    return static_cast<size_t>(
-            Hash32StringWithSeed(s, static_cast<uint32>(len), 
hash_internal::kMix32));
-}
-
-inline size_t HashStringThoroughlyWithSeeds(const char* s, size_t len, size_t 
seed0, size_t seed1) {
-    if (hash_internal::x86_64) return util_hash::CityHash64WithSeeds(s, len, 
seed0, seed1);
-
-    if (hash_internal::sixty_four_bit) {
-        uint64 a = seed0;
-        uint64 b = seed1;
-        uint64 c = HashStringThoroughly(s, len);
-        mix(a, b, c);
-        return c;
-    }
-
-    uint32 a = static_cast<uint32>(seed0);
-    uint32 b = static_cast<uint32>(seed1);
-    uint32 c = static_cast<uint32>(HashStringThoroughly(s, len));
-    mix(a, b, c);
-    return c;
-}
diff --git a/be/src/gutil/int128.cc b/be/src/gutil/int128.cc
deleted file mode 100644
index cd2964a08ca..00000000000
--- a/be/src/gutil/int128.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2004 Google Inc.
-// All Rights Reserved.
-//
-//
-
-#include <iostream>
-using std::cout;
-using std::endl;
-#include "gutil/int128.h"
-#include "gutil/integral_types.h"
-
-const uint128_pod kuint128max = 
{static_cast<uint64>(GG_LONGLONG(0xFFFFFFFFFFFFFFFF)),
-                                 
static_cast<uint64>(GG_LONGLONG(0xFFFFFFFFFFFFFFFF))};
-
-std::ostream& operator<<(std::ostream& o, const uint128& b) {
-    return (o << b.hi_ << "::" << b.lo_);
-}
diff --git a/be/src/gutil/int128.h b/be/src/gutil/int128.h
deleted file mode 100644
index 62f15813255..00000000000
--- a/be/src/gutil/int128.h
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2004 Google Inc.
-// All Rights Reserved.
-//
-
-#pragma once
-
-#include <iosfwd>
-using std::ostream;
-#include "gutil/integral_types.h"
-
-struct uint128_pod;
-
-// An unsigned 128-bit integer type. Thread-compatible.
-class uint128 {
-public:
-    uint128(); // Sets to 0, but don't trust on this behavior.
-    uint128(uint64 top, uint64 bottom);
-#ifndef SWIG
-    uint128(int bottom);
-    uint128(uint32 bottom); // Top 96 bits = 0
-#endif
-    uint128(uint64 bottom); // hi_ = 0
-    uint128(const uint128& val);
-    uint128(const uint128_pod& val);
-
-    void Initialize(uint64 top, uint64 bottom);
-
-    uint128& operator=(const uint128& b);
-
-    // Arithmetic operators.
-    // TODO: division, etc.
-    uint128& operator+=(const uint128& b);
-    uint128& operator-=(const uint128& b);
-    uint128& operator*=(const uint128& b);
-    uint128 operator++(int);
-    uint128 operator--(int);
-    uint128& operator<<=(int);
-    uint128& operator>>=(int);
-    uint128& operator&=(const uint128& b);
-    uint128& operator|=(const uint128& b);
-    uint128& operator^=(const uint128& b);
-    uint128& operator++();
-    uint128& operator--();
-
-    friend uint64 Uint128Low64(const uint128& v);
-    friend uint64 Uint128High64(const uint128& v);
-
-    // We add "std::" to avoid including all of port.h.
-    friend std::ostream& operator<<(std::ostream& o, const uint128& b);
-
-private:
-    // Little-endian memory order optimizations can benefit from
-    // having lo_ first, hi_ last.
-    // See util/endian/endian.h and Load128/Store128 for storing a uint128.
-    uint64 lo_;
-    uint64 hi_;
-
-    // Not implemented, just declared for catching automatic type conversions.
-    uint128(uint8);
-    uint128(uint16);
-    uint128(float v);
-    uint128(double v);
-};
-
-// This is a POD form of uint128 which can be used for static variables which
-// need to be operated on as uint128.
-struct uint128_pod {
-    // Note: The ordering of fields is different than 'class uint128' but the
-    // same as its 2-arg constructor.  This enables more obvious initialization
-    // of static instances, which is the primary reason for this struct in the
-    // first place.  This does not seem to defeat any optimizations wrt
-    // operations involving this struct.
-    uint64 hi;
-    uint64 lo;
-};
-
-extern const uint128_pod kuint128max;
-
-// allow uint128 to be logged
-extern std::ostream& operator<<(std::ostream& o, const uint128& b);
-
-// Methods to access low and high pieces of 128-bit value.
-// Defined externally from uint128 to facilitate conversion
-// to native 128-bit types when compilers support them.
-inline uint64 Uint128Low64(const uint128& v) {
-    return v.lo_;
-}
-inline uint64 Uint128High64(const uint128& v) {
-    return v.hi_;
-}
-
-// TODO: perhaps it would be nice to have int128, a signed 128-bit type?
-
-// --------------------------------------------------------------------------
-//                      Implementation details follow
-// --------------------------------------------------------------------------
-inline bool operator==(const uint128& lhs, const uint128& rhs) {
-    return (Uint128Low64(lhs) == Uint128Low64(rhs) && Uint128High64(lhs) == 
Uint128High64(rhs));
-}
-inline bool operator!=(const uint128& lhs, const uint128& rhs) {
-    return !(lhs == rhs);
-}
-inline uint128& uint128::operator=(const uint128& b) {
-    lo_ = b.lo_;
-    hi_ = b.hi_;
-    return *this;
-}
-
-inline uint128::uint128() : lo_(0), hi_(0) {}
-inline uint128::uint128(uint64 top, uint64 bottom) : lo_(bottom), hi_(top) {}
-inline uint128::uint128(const uint128& v) : lo_(v.lo_), hi_(v.hi_) {}
-inline uint128::uint128(const uint128_pod& v) : lo_(v.lo), hi_(v.hi) {}
-inline uint128::uint128(uint64 bottom) : lo_(bottom), hi_(0) {}
-#ifndef SWIG
-inline uint128::uint128(uint32 bottom) : lo_(bottom), hi_(0) {}
-inline uint128::uint128(int bottom) : lo_(bottom), hi_(0) {
-    if (bottom < 0) {
-        --hi_;
-    }
-}
-#endif
-inline void uint128::Initialize(uint64 top, uint64 bottom) {
-    hi_ = top;
-    lo_ = bottom;
-}
-
-// Comparison operators.
-
-#define CMP128(op)                                                    \
-    inline bool operator op(const uint128& lhs, const uint128& rhs) { \
-        return (Uint128High64(lhs) == Uint128High64(rhs))             \
-                       ? (Uint128Low64(lhs) op Uint128Low64(rhs))     \
-                       : (Uint128High64(lhs) op Uint128High64(rhs));  \
-    }
-
-CMP128(<)
-CMP128(>)
-CMP128(>=)
-CMP128(<=)
-
-#undef CMP128
-
-// Unary operators
-
-inline uint128 operator-(const uint128& val) {
-    const uint64 hi_flip = ~Uint128High64(val);
-    const uint64 lo_flip = ~Uint128Low64(val);
-    const uint64 lo_add = lo_flip + 1;
-    if (lo_add < lo_flip) {
-        return uint128(hi_flip + 1, lo_add);
-    }
-    return uint128(hi_flip, lo_add);
-}
-
-inline bool operator!(const uint128& val) {
-    return !Uint128High64(val) && !Uint128Low64(val);
-}
-
-// Logical operators.
-
-inline uint128 operator~(const uint128& val) {
-    return uint128(~Uint128High64(val), ~Uint128Low64(val));
-}
-
-#define LOGIC128(op)                                                     \
-    inline uint128 operator op(const uint128& lhs, const uint128& rhs) { \
-        return uint128(Uint128High64(lhs) op Uint128High64(rhs),         \
-                       Uint128Low64(lhs) op Uint128Low64(rhs));          \
-    }
-
-LOGIC128(|)
-LOGIC128(&)
-LOGIC128(^)
-
-#undef LOGIC128
-
-#define LOGICASSIGN128(op)                                       \
-    inline uint128& uint128::operator op(const uint128& other) { \
-        hi_ op other.hi_;                                        \
-        lo_ op other.lo_;                                        \
-        return *this;                                            \
-    }
-
-LOGICASSIGN128(|=)
-LOGICASSIGN128(&=)
-LOGICASSIGN128(^=)
-
-#undef LOGICASSIGN128
-
-// Shift operators.
-
-inline uint128 operator<<(const uint128& val, int amount) {
-    // uint64 shifts of >= 64 are undefined, so we will need some 
special-casing.
-    if (amount < 64) {
-        if (amount == 0) {
-            return val;
-        }
-        uint64 new_hi = (Uint128High64(val) << amount) | (Uint128Low64(val) >> 
(64 - amount));
-        uint64 new_lo = Uint128Low64(val) << amount;
-        return uint128(new_hi, new_lo);
-    } else if (amount < 128) {
-        return uint128(Uint128Low64(val) << (amount - 64), 0);
-    } else {
-        return uint128(0, 0);
-    }
-}
-
-inline uint128 operator>>(const uint128& val, int amount) {
-    // uint64 shifts of >= 64 are undefined, so we will need some 
special-casing.
-    if (amount < 64) {
-        if (amount == 0) {
-            return val;
-        }
-        uint64 new_hi = Uint128High64(val) >> amount;
-        uint64 new_lo = (Uint128Low64(val) >> amount) | (Uint128High64(val) << 
(64 - amount));
-        return uint128(new_hi, new_lo);
-    } else if (amount < 128) {
-        return uint128(0, Uint128High64(val) >> (amount - 64));
-    } else {
-        return uint128(0, 0);
-    }
-}
-
-inline uint128& uint128::operator<<=(int amount) {
-    // uint64 shifts of >= 64 are undefined, so we will need some 
special-casing.
-    if (amount < 64) {
-        if (amount != 0) {
-            hi_ = (hi_ << amount) | (lo_ >> (64 - amount));
-            lo_ = lo_ << amount;
-        }
-    } else if (amount < 128) {
-        hi_ = lo_ << (amount - 64);
-        lo_ = 0;
-    } else {
-        hi_ = 0;
-        lo_ = 0;
-    }
-    return *this;
-}
-
-inline uint128& uint128::operator>>=(int amount) {
-    // uint64 shifts of >= 64 are undefined, so we will need some 
special-casing.
-    if (amount < 64) {
-        if (amount != 0) {
-            lo_ = (lo_ >> amount) | (hi_ << (64 - amount));
-            hi_ = hi_ >> amount;
-        }
-    } else if (amount < 128) {
-        hi_ = 0;
-        lo_ = hi_ >> (amount - 64);
-    } else {
-        hi_ = 0;
-        lo_ = 0;
-    }
-    return *this;
-}
-
-inline uint128 operator+(const uint128& lhs, const uint128& rhs) {
-    return uint128(lhs) += rhs;
-}
-
-inline uint128 operator-(const uint128& lhs, const uint128& rhs) {
-    return uint128(lhs) -= rhs;
-}
-
-inline uint128 operator*(const uint128& lhs, const uint128& rhs) {
-    return uint128(lhs) *= rhs;
-}
-
-inline uint128& uint128::operator+=(const uint128& b) {
-    hi_ += b.hi_;
-    uint64 lolo = lo_ + b.lo_;
-    if (lolo < lo_) ++hi_;
-    lo_ = lolo;
-    return *this;
-}
-
-inline uint128& uint128::operator-=(const uint128& b) {
-    hi_ -= b.hi_;
-    if (b.lo_ > lo_) --hi_;
-    lo_ -= b.lo_;
-    return *this;
-}
-
-inline uint128& uint128::operator*=(const uint128& b) {
-    uint64 a96 = hi_ >> 32;
-    uint64 a64 = hi_ & 0xffffffffu;
-    uint64 a32 = lo_ >> 32;
-    uint64 a00 = lo_ & 0xffffffffu;
-    uint64 b96 = b.hi_ >> 32;
-    uint64 b64 = b.hi_ & 0xffffffffu;
-    uint64 b32 = b.lo_ >> 32;
-    uint64 b00 = b.lo_ & 0xffffffffu;
-    // multiply [a96 .. a00] x [b96 .. b00]
-    // terms higher than c96 disappear off the high side
-    // terms c96 and c64 are safe to ignore carry bit
-    uint64 c96 = a96 * b00 + a64 * b32 + a32 * b64 + a00 * b96;
-    uint64 c64 = a64 * b00 + a32 * b32 + a00 * b64;
-    this->hi_ = (c96 << 32) + c64;
-    this->lo_ = 0;
-    // add terms after this one at a time to capture carry
-    *this += uint128(a32 * b00) << 32;
-    *this += uint128(a00 * b32) << 32;
-    *this += a00 * b00;
-    return *this;
-}
-
-inline uint128 uint128::operator++(int) {
-    uint128 tmp(*this);
-    *this += 1;
-    return tmp;
-}
-
-inline uint128 uint128::operator--(int) {
-    uint128 tmp(*this);
-    *this -= 1;
-    return tmp;
-}
-
-inline uint128& uint128::operator++() {
-    *this += 1;
-    return *this;
-}
-
-inline uint128& uint128::operator--() {
-    *this -= 1;
-    return *this;
-}
diff --git a/be/src/gutil/strings/numbers.cc b/be/src/gutil/strings/numbers.cc
index d6b7295f413..f471bf31bd0 100644
--- a/be/src/gutil/strings/numbers.cc
+++ b/be/src/gutil/strings/numbers.cc
@@ -30,7 +30,6 @@ using std::string;
 #include "common/logging.h"
 
 #include "gutil/gscoped_ptr.h"
-#include "gutil/int128.h"
 #include "gutil/integral_types.h"
 #include "gutil/stringprintf.h"
 #include "gutil/strings/ascii_ctype.h"
@@ -468,15 +467,6 @@ string Uint64ToString(uint64 fp) {
     snprintf(buf, sizeof(buf), "%016" PRIx64, fp);
     return string(buf);
 }
-
-// Default arguments
-string Uint128ToHexString(uint128 ui128) {
-    char buf[33];
-    snprintf(buf, sizeof(buf), "%016" PRIx64, Uint128High64(ui128));
-    snprintf(buf + 16, sizeof(buf) - 16, "%016" PRIx64, Uint128Low64(ui128));
-    return string(buf);
-}
-
 namespace {
 
 // Represents integer values of digits.
diff --git a/be/src/gutil/strings/numbers.h b/be/src/gutil/strings/numbers.h
index 291634133c4..64f3d86daaa 100644
--- a/be/src/gutil/strings/numbers.h
+++ b/be/src/gutil/strings/numbers.h
@@ -21,7 +21,6 @@ using std::string;
 
 using std::vector;
 
-#include "gutil/int128.h"
 #include "gutil/integral_types.h"
 // IWYU pragma: no_include <butil/macros.h>
 #include "gutil/macros.h" // IWYU pragma: keep
@@ -35,9 +34,6 @@ using std::vector;
 // Convert a fingerprint to 16 hex digits.
 string Uint64ToString(uint64 fp);
 
-// Formats a uint128 as a 32-digit hex string.
-string Uint128ToHexString(uint128 ui128);
-
 // Convert strings to numeric values, with strict error checking.
 // Leading and trailing spaces are allowed.
 // Negative inputs are not allowed for unsigned ints (unlike strtoul).
diff --git a/be/src/gutil/strings/stringpiece.cc 
b/be/src/gutil/strings/stringpiece.cc
index d4f2b554f01..c3d59fb994a 100644
--- a/be/src/gutil/strings/stringpiece.cc
+++ b/be/src/gutil/strings/stringpiece.cc
@@ -16,7 +16,6 @@
 
 #include "gutil/stl_util.h"
 #include "gutil/strings/memutil.h"
-#include "gutil/hash/legacy_hash.h"
 
 using std::copy;
 using std::max;
@@ -26,10 +25,6 @@ using std::sort;
 using std::swap;
 using std::string;
 
-size_t std::hash<StringPiece>::operator()(StringPiece s) const {
-    return HashTo32(s.data(), s.size());
-}
-
 std::ostream& operator<<(std::ostream& o, StringPiece piece) {
     o.write(piece.data(), piece.size());
     return o;
diff --git a/be/src/gutil/strings/stringpiece.h 
b/be/src/gutil/strings/stringpiece.h
index 0ee2bcc47eb..38e36a27099 100644
--- a/be/src/gutil/strings/stringpiece.h
+++ b/be/src/gutil/strings/stringpiece.h
@@ -122,9 +122,6 @@
 #include <string>
 #include <string_view>
 
-#include "gutil/hash/string_hash.h"
-#include "gutil/int128.h"
-
 class StringPiece {
 private:
     const char* ptr_ = nullptr;
@@ -320,35 +317,6 @@ inline bool operator<=(StringPiece x, StringPiece y) {
 inline bool operator>=(StringPiece x, StringPiece y) {
     return !(x < y);
 }
-template <class X>
-struct GoodFastHash;
-
-// ------------------------------------------------------------------
-// Functions used to create STL containers that use StringPiece
-//  Remember that a StringPiece's lifetime had better be less than
-//  that of the underlying string or char*.  If it is not, then you
-//  cannot safely store a StringPiece into an STL container
-// ------------------------------------------------------------------
-
-// SWIG doesn't know how to parse this stuff properly. Omit it.
-#ifndef SWIG
-
-template <>
-struct std::hash<StringPiece> {
-    size_t operator()(StringPiece s) const;
-};
-
-// An implementation of GoodFastHash for StringPiece.  See
-// GoodFastHash values.
-template <>
-struct GoodFastHash<StringPiece> {
-    size_t operator()(StringPiece s) const { return 
HashStringThoroughly(s.data(), s.size()); }
-    // Less than operator, for MSVC.
-    bool operator()(const StringPiece& s1, const StringPiece& s2) const { 
return s1 < s2; }
-    static const size_t bucket_size = 4; // These are required by MSVC
-    static const size_t min_buckets = 8; // 4 and 8 are defaults.
-};
-#endif
 
 // allow StringPiece to be logged
-extern ostream& operator<<(ostream& o, StringPiece piece);
+extern std::ostream& operator<<(std::ostream& o, StringPiece piece);
diff --git a/be/src/io/cache/file_cache_common.h 
b/be/src/io/cache/file_cache_common.h
index 21ee4dfc8b0..e660a38e03f 100644
--- a/be/src/io/cache/file_cache_common.h
+++ b/be/src/io/cache/file_cache_common.h
@@ -31,7 +31,6 @@ inline static constexpr size_t DEFAULT_DISPOSABLE_PERCENT = 
10;
 inline static constexpr size_t DEFAULT_INDEX_PERCENT = 5;
 
 using uint128_t = vectorized::UInt128;
-using UInt128Hash = vectorized::UInt128Hash;
 
 enum class FileCacheType {
     INDEX,
@@ -63,13 +62,15 @@ struct FileCacheAllocatorBuilder {
 };
 
 struct KeyHash {
-    std::size_t operator()(const UInt128Wrapper& w) const { return 
UInt128Hash()(w.value_); }
+    std::size_t operator()(const UInt128Wrapper& w) const {
+        return util_hash::HashLen16(w.value_.low(), w.value_.high());
+    }
 };
 
 using AccessKeyAndOffset = std::pair<UInt128Wrapper, size_t>;
 struct KeyAndOffsetHash {
     std::size_t operator()(const AccessKeyAndOffset& key) const {
-        return UInt128Hash()(key.first.value_) ^ 
std::hash<uint64_t>()(key.second);
+        return KeyHash()(key.first) ^ std::hash<uint64_t>()(key.second);
     }
 };
 
diff --git a/be/src/io/fs/hdfs_file_system.cpp 
b/be/src/io/fs/hdfs_file_system.cpp
index 24976f11941..0d7cea5091a 100644
--- a/be/src/io/fs/hdfs_file_system.cpp
+++ b/be/src/io/fs/hdfs_file_system.cpp
@@ -31,7 +31,6 @@
 
 #include "common/config.h"
 #include "common/status.h"
-#include "gutil/hash/hash.h"
 #include "gutil/integral_types.h"
 #include "io/fs/err_utils.h"
 #include "io/fs/hdfs_file_reader.h"
diff --git a/be/src/io/hdfs_util.cpp b/be/src/io/hdfs_util.cpp
index 5e5998e9ea7..6c1bbf80a15 100644
--- a/be/src/io/hdfs_util.cpp
+++ b/be/src/io/hdfs_util.cpp
@@ -23,9 +23,9 @@
 #include <ostream>
 
 #include "common/logging.h"
-#include "gutil/hash/hash.h"
 #include "io/fs/err_utils.h"
 #include "io/hdfs_builder.h"
+#include "vec/common/string_ref.h"
 
 namespace doris::io {
 namespace {
@@ -41,24 +41,24 @@ Status create_hdfs_fs(const THdfsParams& hdfs_params, const 
std::string& fs_name
     return Status::OK();
 }
 
-uint64 hdfs_hash_code(const THdfsParams& hdfs_params, const std::string& 
fs_name) {
-    uint64 hash_code = 0;
+uint64_t hdfs_hash_code(const THdfsParams& hdfs_params, const std::string& 
fs_name) {
+    uint64_t hash_code = 0;
     // The specified fsname is used first.
     // If there is no specified fsname, the default fsname is used
     if (!fs_name.empty()) {
-        hash_code ^= Fingerprint(fs_name);
+        hash_code ^= crc32_hash(fs_name);
     } else if (hdfs_params.__isset.fs_name) {
-        hash_code ^= Fingerprint(hdfs_params.fs_name);
+        hash_code ^= crc32_hash(hdfs_params.fs_name);
     }
 
     if (hdfs_params.__isset.user) {
-        hash_code ^= Fingerprint(hdfs_params.user);
+        hash_code ^= crc32_hash(hdfs_params.user);
     }
     if (hdfs_params.__isset.hdfs_kerberos_principal) {
-        hash_code ^= Fingerprint(hdfs_params.hdfs_kerberos_principal);
+        hash_code ^= crc32_hash(hdfs_params.hdfs_kerberos_principal);
     }
     if (hdfs_params.__isset.hdfs_kerberos_keytab) {
-        hash_code ^= Fingerprint(hdfs_params.hdfs_kerberos_keytab);
+        hash_code ^= crc32_hash(hdfs_params.hdfs_kerberos_keytab);
     }
     if (hdfs_params.__isset.hdfs_conf) {
         std::map<std::string, std::string> conf_map;
@@ -66,8 +66,8 @@ uint64 hdfs_hash_code(const THdfsParams& hdfs_params, const 
std::string& fs_name
             conf_map[conf.key] = conf.value;
         }
         for (auto& conf : conf_map) {
-            hash_code ^= Fingerprint(conf.first);
-            hash_code ^= Fingerprint(conf.second);
+            hash_code ^= crc32_hash(conf.first);
+            hash_code ^= crc32_hash(conf.second);
         }
     }
     return hash_code;
@@ -87,7 +87,7 @@ bvar::LatencyRecorder hdfs_hsync_latency("hdfs_hsync");
 }; // namespace hdfs_bvar
 
 void HdfsHandlerCache::_clean_invalid() {
-    std::vector<uint64> removed_handle;
+    std::vector<uint64_t> removed_handle;
     for (auto& item : _cache) {
         if (item.second.use_count() == 1 && item.second->invalid()) {
             removed_handle.emplace_back(item.first);
@@ -100,7 +100,7 @@ void HdfsHandlerCache::_clean_invalid() {
 
 void HdfsHandlerCache::_clean_oldest() {
     uint64_t oldest_time = ULONG_MAX;
-    uint64 oldest = 0;
+    uint64_t oldest = 0;
     for (auto& item : _cache) {
         if (item.second.use_count() == 1 && item.second->last_access_time() < 
oldest_time) {
             oldest_time = item.second->last_access_time();
@@ -112,7 +112,7 @@ void HdfsHandlerCache::_clean_oldest() {
 
 Status HdfsHandlerCache::get_connection(const THdfsParams& hdfs_params, const 
std::string& fs_name,
                                         std::shared_ptr<HdfsHandler>* 
fs_handle) {
-    uint64 hash_code = hdfs_hash_code(hdfs_params, fs_name);
+    uint64_t hash_code = hdfs_hash_code(hdfs_params, fs_name);
     {
         std::lock_guard<std::mutex> l(_lock);
         auto it = _cache.find(hash_code);
diff --git a/be/src/olap/rowset/segment_v2/binary_dict_page.h 
b/be/src/olap/rowset/segment_v2/binary_dict_page.h
index 037b5504709..b098d76b0c0 100644
--- a/be/src/olap/rowset/segment_v2/binary_dict_page.h
+++ b/be/src/olap/rowset/segment_v2/binary_dict_page.h
@@ -25,7 +25,6 @@
 #include <vector>
 
 #include "common/status.h"
-#include "gutil/hash/string_hash.h"
 #include "olap/olap_common.h"
 #include "olap/rowset/segment_v2/binary_plain_page.h"
 #include "olap/rowset/segment_v2/common.h"
@@ -35,6 +34,7 @@
 #include "util/faststring.h"
 #include "util/slice.h"
 #include "vec/common/arena.h"
+#include "vec/common/string_ref.h"
 #include "vec/data_types/data_type.h"
 
 namespace doris {
@@ -95,9 +95,7 @@ private:
 
     EncodingTypePB _encoding_type;
     struct HashOfSlice {
-        size_t operator()(const Slice& slice) const {
-            return HashStringThoroughly(slice.data, slice.size);
-        }
+        size_t operator()(const Slice& slice) const { return 
crc32_hash(slice.data, slice.size); }
     };
     // query for dict item -> dict id
     phmap::flat_hash_map<Slice, uint32_t, HashOfSlice> _dictionary;
diff --git a/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp 
b/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
index 74882a0e1a6..3e80d2c6e61 100644
--- a/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
@@ -49,13 +49,9 @@ struct BloomFilterTraits<Slice> {
     using ValueDict = std::set<Slice, Slice::Comparator>;
 };
 
-struct Int128Comparator {
-    bool operator()(const int128_t& a, const int128_t& b) const { return a < 
b; }
-};
-
 template <>
 struct BloomFilterTraits<int128_t> {
-    using ValueDict = std::set<int128_t, Int128Comparator>;
+    using ValueDict = std::set<int128_t>;
 };
 
 // Builder for bloom filter. In doris, bloom filter index is used in
diff --git a/be/src/olap/rowset/segment_v2/page_io.h 
b/be/src/olap/rowset/segment_v2/page_io.h
index 31c81880dac..736b3e521f6 100644
--- a/be/src/olap/rowset/segment_v2/page_io.h
+++ b/be/src/olap/rowset/segment_v2/page_io.h
@@ -74,7 +74,7 @@ struct PageReadOptions {
     }
 };
 
-inline ostream& operator<<(ostream& os, const PageReadOptions& opt) {
+inline std::ostream& operator<<(std::ostream& os, const PageReadOptions& opt) {
     return os << "PageReadOptions { verify_checksum=" << opt.verify_checksum
               << " use_page_cache=" << opt.use_page_cache
               << " kept_in_memory=" << opt.kept_in_memory << " pre_decode=" << 
opt.pre_decode
diff --git a/be/src/olap/rowset/segment_v2/page_pointer.h 
b/be/src/olap/rowset/segment_v2/page_pointer.h
index 32ef318aeba..1a5448d667e 100644
--- a/be/src/olap/rowset/segment_v2/page_pointer.h
+++ b/be/src/olap/rowset/segment_v2/page_pointer.h
@@ -73,7 +73,7 @@ struct PagePointer {
     bool operator!=(const PagePointer& other) const { return !(*this == 
other); }
 };
 
-inline ostream& operator<<(ostream& os, const PagePointer& pp) {
+inline std::ostream& operator<<(std::ostream& os, const PagePointer& pp) {
     os << "PagePointer { offset=" << pp.offset << " size=" << pp.size << " }";
     return os;
 }
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index 0ce2048e3be..08bc150067e 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -32,7 +32,6 @@
 #include "common/signal_handler.h"
 #include "common/status.h"
 #include "exec/schema_scanner/schema_metadata_name_ids_scanner.h"
-#include "gutil/hash/hash.h"
 #include "gutil/integral_types.h"
 #include "gutil/strings/numbers.h"
 #include "io/fs/file_system.h"
diff --git a/be/src/olap/single_replica_compaction.cpp 
b/be/src/olap/single_replica_compaction.cpp
index 536761f3351..2b1726f1def 100644
--- a/be/src/olap/single_replica_compaction.cpp
+++ b/be/src/olap/single_replica_compaction.cpp
@@ -21,7 +21,6 @@
 #include "gen_cpp/Types_constants.h"
 #include "gen_cpp/internal_service.pb.h"
 #include "gutil/strings/split.h"
-#include "gutil/strings/stringpiece.h"
 #include "http/http_client.h"
 #include "io/fs/file_system.h"
 #include "io/fs/local_file_system.h"
@@ -387,8 +386,7 @@ Status SingleReplicaCompaction::_download_files(DataDir* 
data_dir,
     // Avoid of data is not complete, we copy the header file at last.
     // The header file's name is end of .hdr.
     for (int i = 0; i < file_name_list.size() - 1; ++i) {
-        StringPiece sp(file_name_list[i]);
-        if (sp.ends_with(".hdr")) {
+        if (file_name_list[i].ends_with(".hdr")) {
             std::swap(file_name_list[i], file_name_list[file_name_list.size() 
- 1]);
             break;
         }
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index edfa55a89be..08ff77fdfa3 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -61,7 +61,6 @@
 #include "common/signal_handler.h"
 #include "common/status.h"
 #include "gutil/ref_counted.h"
-#include "gutil/strings/stringpiece.h"
 #include "gutil/strings/substitute.h"
 #include "io/fs/file_reader.h"
 #include "io/fs/file_reader_writer_fwd.h"
diff --git a/be/src/olap/task/engine_clone_task.cpp 
b/be/src/olap/task/engine_clone_task.cpp
index 30bff9cbf07..eabb1e162cd 100644
--- a/be/src/olap/task/engine_clone_task.cpp
+++ b/be/src/olap/task/engine_clone_task.cpp
@@ -42,7 +42,6 @@
 #include "common/config.h"
 #include "common/logging.h"
 #include "gutil/strings/split.h"
-#include "gutil/strings/stringpiece.h"
 #include "gutil/strings/strip.h"
 #include "http/http_client.h"
 #include "io/fs/file_system.h"
@@ -512,8 +511,7 @@ Status EngineCloneTask::_download_files(DataDir* data_dir, 
const std::string& re
     // Avoid of data is not complete, we copy the header file at last.
     // The header file's name is end of .hdr.
     for (int i = 0; i < file_name_list.size() - 1; ++i) {
-        StringPiece sp(file_name_list[i]);
-        if (sp.ends_with(".hdr")) {
+        if (file_name_list[i].ends_with(".hdr")) {
             std::swap(file_name_list[i], file_name_list[file_name_list.size() 
- 1]);
             break;
         }
diff --git a/be/src/service/point_query_executor.h 
b/be/src/service/point_query_executor.h
index 37345d80f68..61b597c5da8 100644
--- a/be/src/service/point_query_executor.h
+++ b/be/src/service/point_query_executor.h
@@ -39,7 +39,6 @@
 #include "common/config.h"
 #include "common/logging.h"
 #include "common/status.h"
-#include "gutil/int128.h"
 #include "olap/lru_cache.h"
 #include "olap/olap_common.h"
 #include "olap/rowset/rowset.h"
diff --git a/be/src/util/hash_util.hpp b/be/src/util/hash_util.hpp
index 8cb1bc2754a..dc70b1c9f9c 100644
--- a/be/src/util/hash_util.hpp
+++ b/be/src/util/hash_util.hpp
@@ -27,7 +27,7 @@
 #include <functional>
 
 #include "common/compiler_util.h" // IWYU pragma: keep
-#include "gutil/hash/hash.h"      // IWYU pragma: keep
+#include "gutil/hash/city.h"
 #include "runtime/define_primitive_type.h"
 #include "util/cpu_info.h"
 #include "util/murmur_hash3.h"
@@ -382,16 +382,6 @@ struct std::hash<doris::TNetworkAddress> {
     }
 };
 
-#if __GNUC__ < 6 && !defined(__clang__)
-// Cause this is builtin function
-template <>
-struct std::hash<__int128> {
-    std::size_t operator()(const __int128& val) const {
-        return doris::HashUtil::hash(&val, sizeof(val), 0);
-    }
-};
-#endif
-
 template <>
 struct std::hash<std::pair<doris::TUniqueId, int64_t>> {
     size_t operator()(const std::pair<doris::TUniqueId, int64_t>& pair) const {
@@ -402,3 +392,12 @@ struct std::hash<std::pair<doris::TUniqueId, int64_t>> {
         return seed;
     }
 };
+
+template <class First, class Second>
+struct std::hash<std::pair<First, Second>> {
+    size_t operator()(const pair<First, Second>& p) const {
+        size_t h1 = std::hash<First>()(p.first);
+        size_t h2 = std::hash<Second>()(p.second);
+        return util_hash::HashLen16(h1, h2);
+    }
+};
\ No newline at end of file
diff --git a/be/src/util/lru_multi_cache.h b/be/src/util/lru_multi_cache.h
index e1ff32fbe56..8c810a06ee2 100644
--- a/be/src/util/lru_multi_cache.h
+++ b/be/src/util/lru_multi_cache.h
@@ -29,7 +29,6 @@
 #include <tuple>
 #include <unordered_map>
 
-#include "gutil/hash/hash.h"
 #include "gutil/macros.h"
 #include "util/spinlock.h"
 
diff --git a/be/src/util/lru_multi_cache.inline.h 
b/be/src/util/lru_multi_cache.inline.h
index 8af288bff6f..87d09891342 100644
--- a/be/src/util/lru_multi_cache.inline.h
+++ b/be/src/util/lru_multi_cache.inline.h
@@ -23,6 +23,7 @@
 
 #include <glog/logging.h>
 
+#include "util/hash_util.hpp"
 #include "util/lru_multi_cache.h"
 #include "util/time.h"
 
diff --git a/be/src/util/path_util.cpp b/be/src/util/path_util.cpp
index f1c96a0fc00..e05b9371e49 100644
--- a/be/src/util/path_util.cpp
+++ b/be/src/util/path_util.cpp
@@ -21,7 +21,6 @@
 #include <libgen.h>
 
 #include "gutil/strings/split.h"
-#include "gutil/strings/stringpiece.h"
 #include "gutil/strings/strip.h"
 
 using std::string;
@@ -32,8 +31,6 @@ using strings::Split;
 namespace doris {
 namespace path_util {
 
-const string kTmpInfix = ".doristmp";
-
 std::string join_path_segments(const string& a, const string& b) {
     if (a.empty()) {
         return b;
@@ -44,29 +41,6 @@ std::string join_path_segments(const string& a, const 
string& b) {
     }
 }
 
-std::vector<string> join_path_segments_v(const std::vector<string>& v, const 
string& s) {
-    std::vector<string> out;
-    for (const string& path : v) {
-        out.emplace_back(join_path_segments(path, s));
-    }
-    return out;
-}
-
-std::vector<string> split_path(const string& path) {
-    if (path.empty()) {
-        return {};
-    }
-    std::vector<string> segments;
-    if (path[0] == '/') {
-        segments.emplace_back("/");
-    }
-    std::vector<StringPiece> pieces = Split(path, "/", SkipEmpty());
-    for (const StringPiece& piece : pieces) {
-        segments.emplace_back(piece.data(), piece.size());
-    }
-    return segments;
-}
-
 // strdup use malloc to obtain memory for the new string, it should be freed 
with free.
 // but std::unique_ptr use delete to free memory by default, so it should 
specify free memory using free
 
diff --git a/be/src/util/path_util.h b/be/src/util/path_util.h
index 1376d2c32ff..ee68122f4fa 100644
--- a/be/src/util/path_util.h
+++ b/be/src/util/path_util.h
@@ -27,18 +27,9 @@ namespace path_util {
 // NOTE: The methods here are only related to path processing, do not involve
 // any file and IO operations.
 
-extern const std::string kTmpInfix;
-
 // Join two path segments with the appropriate path separator, if necessary.
 std::string join_path_segments(const std::string& a, const std::string& b);
 
-// Join each path segment in a list with a common suffix segment.
-std::vector<std::string> join_path_segments_v(const std::vector<std::string>& 
v,
-                                              const std::string& s);
-
-// Split a path into segments with the appropriate path separator.
-std::vector<std::string> split_path(const std::string& path);
-
 // Return the enclosing directory of path.
 // This is like dirname(3) but for C++ strings.
 // The following list of examples shows the strings returned by dirname() and 
basename():
diff --git a/be/src/util/s3_util.h b/be/src/util/s3_util.h
index 46226b79359..5dd68069759 100644
--- a/be/src/util/s3_util.h
+++ b/be/src/util/s3_util.h
@@ -32,8 +32,8 @@
 #include <unordered_map>
 
 #include "common/status.h"
-#include "gutil/hash/hash.h"
 #include "util/s3_rate_limiter.h"
+#include "vec/common/string_ref.h"
 
 namespace Aws {
 namespace S3 {
@@ -102,15 +102,15 @@ struct S3ClientConf {
 
     uint64_t get_hash() const {
         uint64_t hash_code = 0;
-        hash_code ^= Fingerprint(ak);
-        hash_code ^= Fingerprint(sk);
-        hash_code ^= Fingerprint(token);
-        hash_code ^= Fingerprint(endpoint);
-        hash_code ^= Fingerprint(region);
-        hash_code ^= Fingerprint(max_connections);
-        hash_code ^= Fingerprint(request_timeout_ms);
-        hash_code ^= Fingerprint(connect_timeout_ms);
-        hash_code ^= Fingerprint(use_virtual_addressing);
+        hash_code ^= crc32_hash(ak);
+        hash_code ^= crc32_hash(sk);
+        hash_code ^= crc32_hash(token);
+        hash_code ^= crc32_hash(endpoint);
+        hash_code ^= crc32_hash(region);
+        hash_code ^= max_connections;
+        hash_code ^= request_timeout_ms;
+        hash_code ^= connect_timeout_ms;
+        hash_code ^= use_virtual_addressing;
         return hash_code;
     }
 
diff --git a/be/src/util/trace.h b/be/src/util/trace.h
index 30da779624a..7a876fd3c3c 100644
--- a/be/src/util/trace.h
+++ b/be/src/util/trace.h
@@ -19,7 +19,6 @@
 #include <butil/macros.h>
 
 #include "gutil/ref_counted.h"
-#include "gutil/strings/stringpiece.h"
 #include "gutil/strings/substitute.h"
 #include "gutil/threading/thread_collision_warner.h"
 #include "util/scoped_cleanup.h"
diff --git a/be/src/vec/common/hash_table/hash.h 
b/be/src/vec/common/hash_table/hash.h
index 9556bf87a07..ddc8b2a7547 100644
--- a/be/src/vec/common/hash_table/hash.h
+++ b/be/src/vec/common/hash_table/hash.h
@@ -119,8 +119,7 @@ inline size_t hash_crc32(doris::vectorized::UInt128 u) {
 
 template <>
 inline size_t hash_crc32(doris::vectorized::Int128 u) {
-    return doris::vectorized::UInt128HashCRC32()(
-            doris::vectorized::UInt128((u >> 64) & int64_t(-1), u & 
int64_t(-1)));
+    return doris::vectorized::UInt128HashCRC32()({(u >> 64) & int64_t(-1), u & 
int64_t(-1)});
 }
 
 #define DEFINE_HASH(T)                   \
@@ -156,10 +155,10 @@ struct HashCRC32<doris::vectorized::UInt256> {
     size_t operator()(const doris::vectorized::UInt256& x) const {
 #if defined(__SSE4_2__) || defined(__aarch64__)
         doris::vectorized::UInt64 crc = -1ULL;
-        crc = _mm_crc32_u64(crc, x.a);
-        crc = _mm_crc32_u64(crc, x.b);
-        crc = _mm_crc32_u64(crc, x.c);
-        crc = _mm_crc32_u64(crc, x.d);
+        crc = _mm_crc32_u64(crc, x.items[0]);
+        crc = _mm_crc32_u64(crc, x.items[1]);
+        crc = _mm_crc32_u64(crc, x.items[2]);
+        crc = _mm_crc32_u64(crc, x.items[3]);
         return crc;
 #else
         return Hash128to64({Hash128to64({x.a, x.b}), Hash128to64({x.c, x.d})});
diff --git a/be/src/vec/common/hash_table/string_hash_map.h 
b/be/src/vec/common/hash_table/string_hash_map.h
index 61d304cf7d8..6c7a9e74dca 100644
--- a/be/src/vec/common/hash_table/string_hash_map.h
+++ b/be/src/vec/common/hash_table/string_hash_map.h
@@ -47,8 +47,10 @@ struct StringHashMapCell<StringKey16, TMapped>
 
     // Zero means unoccupied cells in hash table. Use key with last word = 0 as
     // zero keys, because such keys are unrepresentable (no way to encode 
length).
-    static bool is_zero(const StringKey16& key, const HashTableNoState&) { 
return key.high == 0; }
-    void set_zero() { this->value.first.high = 0; }
+    static bool is_zero(const StringKey16& key, const HashTableNoState&) {
+        return key.items[1] == 0;
+    }
+    void set_zero() { this->value.first.items[1] = 0; }
 
     // external
     const doris::StringRef get_key() const { return 
to_string_ref(this->value.first); } /// NOLINT
diff --git a/be/src/vec/common/hash_table/string_hash_table.h 
b/be/src/vec/common/hash_table/string_hash_table.h
index 5d98ff0b720..74be1e85e1e 100644
--- a/be/src/vec/common/hash_table/string_hash_table.h
+++ b/be/src/vec/common/hash_table/string_hash_table.h
@@ -53,8 +53,8 @@ inline doris::StringRef ALWAYS_INLINE to_string_ref(const T& 
n) {
     return {reinterpret_cast<const char*>(&n), sizeof(T) - (__builtin_clzll(n) 
>> 3)};
 }
 inline doris::StringRef ALWAYS_INLINE to_string_ref(const StringKey16& n) {
-    assert(n.high != 0);
-    return {reinterpret_cast<const char*>(&n), 16ul - (__builtin_clzll(n.high) 
>> 3)};
+    assert(n.items[1] != 0);
+    return {reinterpret_cast<const char*>(&n), 16UL - 
(__builtin_clzll(n.items[1]) >> 3)};
 }
 
 struct StringHashTableHash {
@@ -67,8 +67,8 @@ struct StringHashTableHash {
     }
     size_t ALWAYS_INLINE operator()(StringKey16 key) const {
         size_t res = -1ULL;
-        res = _mm_crc32_u64(res, key.low);
-        res = _mm_crc32_u64(res, key.high);
+        res = _mm_crc32_u64(res, key.low());
+        res = _mm_crc32_u64(res, key.high());
         return res;
     }
 #else
diff --git a/be/src/vec/common/string_ref.h b/be/src/vec/common/string_ref.h
index 9851bf8f3bf..e2094ca8f39 100644
--- a/be/src/vec/common/string_ref.h
+++ b/be/src/vec/common/string_ref.h
@@ -33,8 +33,6 @@
 #include <vector>
 
 #include "gutil/hash/city.h"
-#include "gutil/hash/hash128to64.h"
-#include "gutil/int128.h"
 #include "util/hash_util.hpp"
 #include "util/slice.h"
 #include "util/sse_util.hpp"
@@ -307,25 +305,13 @@ inline std::size_t hash_value(const StringRef& v) {
 
 using StringRefs = std::vector<StringRef>;
 
-/** Hash functions.
-  * You can use either CityHash64,
-  *  or a function based on the crc32 statement,
-  *  which is obviously less qualitative, but on real data sets,
-  *  when used in a hash table, works much faster.
-  * For more information, see hash_map_string_3.cpp
-  */
-
-struct StringRefHash64 {
-    size_t operator()(StringRef x) const { return 
util_hash::CityHash64(x.data, x.size); }
-};
-
 #if defined(__SSE4_2__) || defined(__aarch64__)
 
 /// Parts are taken from CityHash.
 
 inline doris::vectorized::UInt64 hash_len16(doris::vectorized::UInt64 u,
                                             doris::vectorized::UInt64 v) {
-    return Hash128to64(uint128(u, v));
+    return util_hash::HashLen16(u, v);
 }
 
 inline doris::vectorized::UInt64 shift_mix(doris::vectorized::UInt64 val) {
@@ -367,35 +353,38 @@ inline size_t hash_less_than16(const char* data, size_t 
size) {
     return hash_less_than8(data, size);
 }
 
-struct CRC32Hash {
-    size_t operator()(const StringRef& x) const {
-        const char* pos = x.data;
-        size_t size = x.size;
+inline size_t crc32_hash(const char* pos, size_t size) {
+    if (size == 0) {
+        return 0;
+    }
 
-        if (size == 0) {
-            return 0;
-        }
+    if (size < 8) {
+        return hash_less_than8(pos, size);
+    }
 
-        if (size < 8) {
-            return hash_less_than8(x.data, x.size);
-        }
+    const char* end = pos + size;
+    size_t res = -1ULL;
 
-        const char* end = pos + size;
-        size_t res = -1ULL;
+    do {
+        auto word = unaligned_load<doris::vectorized::UInt64>(pos);
+        res = _mm_crc32_u64(res, word);
 
-        do {
-            auto word = unaligned_load<doris::vectorized::UInt64>(pos);
-            res = _mm_crc32_u64(res, word);
+        pos += 8;
+    } while (pos + 8 < end);
 
-            pos += 8;
-        } while (pos + 8 < end);
+    auto word =
+            unaligned_load<doris::vectorized::UInt64>(end - 8); /// I'm not 
sure if this is normal.
+    res = _mm_crc32_u64(res, word);
 
-        auto word = unaligned_load<doris::vectorized::UInt64>(
-                end - 8); /// I'm not sure if this is normal.
-        res = _mm_crc32_u64(res, word);
+    return res;
+}
 
-        return res;
-    }
+inline size_t crc32_hash(const std::string str) {
+    return crc32_hash(str.data(), str.size());
+}
+
+struct CRC32Hash {
+    size_t operator()(const StringRef& x) const { return crc32_hash(x.data, 
x.size); }
 };
 
 struct StringRefHash : CRC32Hash {};
diff --git a/be/src/vec/common/uint128.h b/be/src/vec/common/uint128.h
index 28b1f62dc72..61e7410a236 100644
--- a/be/src/vec/common/uint128.h
+++ b/be/src/vec/common/uint128.h
@@ -26,97 +26,13 @@
 #include <tuple>
 
 #include "gutil/hash/city.h"
-#include "gutil/hash/hash128to64.h"
 #include "util/sse_util.hpp"
 #include "vec/core/types.h"
+#include "vec/core/wide_integer.h"
 
 namespace doris::vectorized {
 
-/// For aggregation by SipHash, UUID type or concatenation of several fields.
-struct UInt128 {
-    /// This naming assumes little endian.
-    UInt64 low;
-    UInt64 high;
-
-    UInt128() = default;
-    explicit UInt128(const UInt64 low_, const UInt64 high_) : low(low_), 
high(high_) {}
-    explicit UInt128(const Int128 rhs) : low(rhs % UINT64_MAX), high(rhs / 
UINT64_MAX) {}
-    explicit UInt128(const UInt64 rhs) : low(rhs), high() {}
-    explicit UInt128(const int rhs) : low(rhs), high() {}
-    explicit UInt128(const int64_t rhs) : low(rhs), high() {}
-    explicit UInt128(const uint32_t rhs) : low(rhs), high() {}
-    explicit UInt128(const double rhs)
-            : low((UInt64)rhs % UINT64_MAX), high(UInt64(rhs / 
double(INT64_MAX))) {}
-
-    auto tuple() const { return std::tie(high, low); }
-
-    String to_hex_string() const {
-        std::ostringstream os;
-        os << std::setw(16) << std::setfill('0') << std::hex << high << low;
-        return String(os.str());
-    }
-
-    bool operator==(const UInt128 rhs) const { return tuple() == rhs.tuple(); }
-    auto operator<=>(const UInt128 rhs) const { return tuple() <=> 
rhs.tuple(); }
-
-    UInt128 operator<<(const UInt128& rhs) const {
-        const uint64_t shift = rhs.low;
-        if (((bool)rhs.high) || (shift >= 128)) {
-            return UInt128(0);
-        } else if (shift == 64) {
-            return UInt128(0, low);
-        } else if (shift == 0) {
-            return *this;
-        } else if (shift < 64) {
-            return UInt128(low << shift, (high << shift) + (low >> (64 - 
shift)));
-        } else if ((128 > shift) && (shift > 64)) {
-            return UInt128(0, low << (shift - 64));
-        } else {
-            return UInt128(0);
-        }
-    }
-
-    UInt128& operator<<=(const UInt128& rhs) {
-        *this = *this << rhs;
-        return *this;
-    }
-
-    UInt128 operator+(const UInt128& rhs) const {
-        return UInt128(low + rhs.low, high + rhs.high + ((low + rhs.low) < 
low));
-    }
-
-    UInt128& operator+=(const UInt128& rhs) {
-        high += rhs.high + ((low + rhs.low) < low);
-        low += rhs.low;
-        return *this;
-    }
-
-    template <typename T>
-    bool operator==(const T rhs) const {
-        return *this == UInt128(rhs);
-    }
-    template <typename T>
-    auto operator<=>(const T rhs) const {
-        return *this <=> UInt128(rhs);
-    }
-
-    template <typename T>
-    explicit operator T() const {
-        return static_cast<T>(low);
-    }
-
-    UInt128& operator=(const UInt64 rhs) {
-        low = rhs;
-        high = 0;
-        return *this;
-    }
-
-    operator uint128_t() const {
-        uint128_t value = static_cast<uint128_t>(high) << 64;
-        value |= low;
-        return value;
-    }
-};
+using UInt128 = wide::UInt128;
 
 template <>
 inline constexpr bool IsNumber<UInt128> = true;
@@ -129,17 +45,13 @@ struct TypeId<UInt128> {
     static constexpr const TypeIndex value = TypeIndex::UInt128;
 };
 
-struct UInt128Hash {
-    size_t operator()(UInt128 x) const { return Hash128to64({x.low, x.high}); }
-};
-
 #if defined(__SSE4_2__) || defined(__aarch64__)
 
 struct UInt128HashCRC32 {
     size_t operator()(const UInt128& x) const {
         UInt64 crc = -1ULL;
-        crc = _mm_crc32_u64(crc, x.low);
-        crc = _mm_crc32_u64(crc, x.high);
+        crc = _mm_crc32_u64(crc, x.low());
+        crc = _mm_crc32_u64(crc, x.high());
         return crc;
     }
 };
@@ -152,31 +64,10 @@ struct UInt128HashCRC32 : public UInt128Hash {};
 #endif
 
 struct UInt128TrivialHash {
-    size_t operator()(UInt128 x) const { return x.low; }
+    size_t operator()(UInt128 x) const { return x.low(); }
 };
 
-/** Used for aggregation, for putting a large number of constant-length keys 
in a hash table.
-  */
-struct UInt256 {
-    UInt64 a;
-    UInt64 b;
-    UInt64 c;
-    UInt64 d;
-
-    bool operator==(const UInt256 rhs) const {
-        return a == rhs.a && b == rhs.b && c == rhs.c && d == rhs.d;
-    }
-
-    bool operator==(const UInt64 rhs) const { return a == rhs && b == 0 && c 
== 0 && d == 0; }
-
-    UInt256& operator=(const UInt64 rhs) {
-        a = rhs;
-        b = 0;
-        c = 0;
-        d = 0;
-        return *this;
-    }
-};
+using UInt256 = wide::UInt256;
 
 #pragma pack(1)
 struct UInt136 {
@@ -194,7 +85,7 @@ struct UInt136 {
 template <>
 struct std::hash<doris::vectorized::UInt128> {
     size_t operator()(const doris::vectorized::UInt128& u) const {
-        return Hash128to64({u.low, u.high});
+        return util_hash::HashLen16(u.low(), u.high());
     }
 };
 
diff --git a/be/src/vec/core/wide_integer.h b/be/src/vec/core/wide_integer.h
index e7902e414a8..d74aef27a49 100644
--- a/be/src/vec/core/wide_integer.h
+++ b/be/src/vec/core/wide_integer.h
@@ -42,7 +42,10 @@
 
 #include <cstdint>
 #include <initializer_list>
+#include <iomanip>
+#include <iostream>
 #include <limits>
+#include <string>
 #include <type_traits>
 
 // NOLINTBEGIN(*)
@@ -134,10 +137,28 @@ public:
     constexpr operator double() const noexcept;
     constexpr operator float() const noexcept;
 
+    std::string to_hex_string() const {
+        std::ostringstream os;
+        os << std::setw(16) << std::setfill('0') << std::hex;
+        for (size_t i = 0; i < _impl::item_count; i++) {
+            os << items[i];
+        }
+        return os.str();
+    }
+
     struct _impl;
 
     base_type items[_impl::item_count];
 
+    uint64_t low() const {
+        static_assert(_impl::item_count == 2);
+        return items[0];
+    }
+    uint64_t high() const {
+        static_assert(_impl::item_count == 2);
+        return items[1];
+    }
+
 private:
     template <size_t Bits2, typename Signed2>
     friend class integer;
@@ -146,6 +167,7 @@ private:
     friend class std::numeric_limits<integer<Bits, unsigned>>;
 };
 
+using UInt128 = integer<128, unsigned>;
 using Int256 = integer<256, signed>;
 using UInt256 = integer<256, unsigned>;
 
diff --git a/be/src/vec/data_types/convert_field_to_type.cpp 
b/be/src/vec/data_types/convert_field_to_type.cpp
index 3717abc74e1..f69e6a9dc81 100644
--- a/be/src/vec/data_types/convert_field_to_type.cpp
+++ b/be/src/vec/data_types/convert_field_to_type.cpp
@@ -43,13 +43,6 @@
 #include "vec/data_types/data_type_array.h"
 #include "vec/data_types/data_type_nullable.h"
 
-namespace doris {
-namespace vectorized {
-struct UInt128;
-} // namespace vectorized
-} // namespace doris
-
-// #include "vec/data_types/data_type_tuple.h"
 namespace doris::vectorized {
 /** Checking for a `Field from` of `From` type falls to a range of values of 
type `To`.
   * `From` and `To` - numeric types. They can be floating-point types.
diff --git a/be/src/vec/json/path_in_data.cpp b/be/src/vec/json/path_in_data.cpp
index d5128d2b32e..74e5dade0fc 100644
--- a/be/src/vec/json/path_in_data.cpp
+++ b/be/src/vec/json/path_in_data.cpp
@@ -163,7 +163,7 @@ void PathInData::to_protobuf(segment_v2::ColumnPathInfo* 
pb, int32_t parent_col_
 
 size_t PathInData::Hash::operator()(const PathInData& value) const {
     auto hash = get_parts_hash(value.parts);
-    return hash.low ^ hash.high;
+    return hash.low() ^ hash.high();
 }
 
 PathInData PathInData::copy_pop_front() const {
diff --git a/be/test/util/path_util_test.cpp b/be/test/util/path_util_test.cpp
index 63149d9ddaa..8806febb133 100644
--- a/be/test/util/path_util_test.cpp
+++ b/be/test/util/path_util_test.cpp
@@ -73,17 +73,6 @@ TEST(TestPathUtil, DirNameTest) {
     EXPECT_EQ("/ab", path_util::dir_name("/ab/cd"));
 }
 
-TEST(TestPathUtil, SplitPathTest) {
-    using Vec = std::vector<string>;
-    EXPECT_EQ(Vec({"/"}), path_util::split_path("/"));
-    EXPECT_EQ(Vec({"/", "a", "b"}), path_util::split_path("/a/b"));
-    EXPECT_EQ(Vec({"/", "a", "b"}), path_util::split_path("/a/b/"));
-    EXPECT_EQ(Vec({"/", "a", "b"}), path_util::split_path("/a//b/"));
-    EXPECT_EQ(Vec({"a", "b"}), path_util::split_path("a/b"));
-    EXPECT_EQ(Vec({"."}), path_util::split_path("."));
-    EXPECT_EQ(Vec(), path_util::split_path(""));
-}
-
 TEST(TestPathUtil, file_extension_test) {
     EXPECT_EQ("", path_util::file_extension(""));
     EXPECT_EQ("", path_util::file_extension("."));
diff --git a/regression-test/data/nereids_function_p0/scalar_function/Array.out 
b/regression-test/data/nereids_function_p0/scalar_function/Array.out
index c6c32bf9b15..bf55a289ced 100644
--- a/regression-test/data/nereids_function_p0/scalar_function/Array.out
+++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out
@@ -2524,90 +2524,90 @@
 
 -- !sql_array_intersect_Char --
 \N
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
 
 -- !sql_array_intersect_Char_notnull --
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
 
 -- !sql_array_intersect_Varchar --
 \N
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_intersect_Varchar_notnull --
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_intersect_String --
 \N
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_intersect_String_notnull --
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_intersect_DatetimeV2 --
 \N
@@ -9803,90 +9803,90 @@ true
 
 -- !sql_array_union_Char --
 \N
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
 
 -- !sql_array_union_Char_notnull --
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
-["char12", "char32", "char22"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char11", "char21", "char31"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
+["char12", "char22", "char32"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
-["char21", "char11", "char31"]
 
 -- !sql_array_union_Varchar --
 \N
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_union_Varchar_notnull --
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
-["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_union_String --
 \N
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_union_String_notnull --
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
-["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char21", "char31", "string1", "varchar11", "varchar21", "varchar31"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char22", "char32", "string2", "varchar12", "varchar22", "varchar32"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
+["char23", "char33", "string3", "varchar13", "varchar23", "varchar33"]
 
 -- !sql_array_union_DatetimeV2 --
 \N
@@ -14443,4 +14443,5 @@ true
 ["2012-03-09 09:08:09", "2012-03-09 09:08:17"]
 ["2012-03-10 10:09:10", "2012-03-10 10:09:19"]
 ["2012-03-11 11:10:11", "2012-03-11 11:10:21"]
-["2012-03-12 12:11:12", "2012-03-12 12:11:23"]
\ No newline at end of file
+["2012-03-12 12:11:12", "2012-03-12 12:11:23"]
+
diff --git 
a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy 
b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy
index 5b13ed4590b..a786b930438 100644
--- a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy
+++ b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy
@@ -204,37 +204,37 @@ suite("nereids_scalar_fn_Array") {
     order_qt_sql_array_except_DateV2_notnull "select array_except(kadtv2, 
kadtv2) from fn_test_not_nullable"
 
     // array_intersect
-    order_qt_sql_array_intersect_Double "select array_intersect(kadbl, kadbl) 
from fn_test"
-    order_qt_sql_array_intersect_Double_notnull "select array_intersect(kadbl, 
kadbl) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_Float "select array_intersect(kafloat, 
kafloat) from fn_test"
-    order_qt_sql_array_intersect_Float_notnull "select 
array_intersect(kafloat, kafloat) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_LargeInt "select array_intersect(kalint, 
kalint) from fn_test"
-    order_qt_sql_array_intersect_LargeInt_notnull "select 
array_intersect(kalint, kalint) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_BigInt "select array_intersect(kabint, 
kabint) from fn_test"
-    order_qt_sql_array_intersect_BigInt_notnull "select 
array_intersect(kabint, kabint) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_SmallInt "select array_intersect(kasint, 
kasint) from fn_test"
-    order_qt_sql_array_intersect_SmallInt_notnull "select 
array_intersect(kasint, kasint) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_Integer "select array_intersect(kaint, kaint) 
from fn_test"
-    order_qt_sql_array_intersect_Integer_notnull "select 
array_intersect(kaint, kaint) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_TinyInt "select array_intersect(katint, 
katint) from fn_test"
-    order_qt_sql_array_intersect_TinyInt_notnull "select 
array_intersect(katint, katint) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_DecimalV3 "select array_intersect(kadcml, 
kadcml) from fn_test"
-    order_qt_sql_array_intersect_DecimalV3_notnull "select 
array_intersect(kadcml, kadcml) from fn_test_not_nullable"
-
-    order_qt_sql_array_intersect_Boolean "select array_intersect(kabool, 
kabool) from fn_test"
-    order_qt_sql_array_intersect_Boolean_notnull "select 
array_intersect(kabool, kabool) from fn_test_not_nullable"
-
-    order_qt_sql_array_intersect_Char "select array_intersect(kachr, kachr) 
from fn_test"
-    order_qt_sql_array_intersect_Char_notnull "select array_intersect(kachr, 
kachr) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_Varchar "select array_intersect(kavchr, 
kavchr) from fn_test"
-    order_qt_sql_array_intersect_Varchar_notnull "select 
array_intersect(kavchr, kavchr) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_String "select array_intersect(kastr, kastr) 
from fn_test"
-    order_qt_sql_array_intersect_String_notnull "select array_intersect(kastr, 
kastr) from fn_test_not_nullable"
-
-    order_qt_sql_array_intersect_DatetimeV2 "select array_intersect(kadtmv2, 
kadtmv2) from fn_test"
-    order_qt_sql_array_intersect_DatetimeV2_notnull "select 
array_intersect(kadtmv2, kadtmv2) from fn_test_not_nullable"
-    order_qt_sql_array_intersect_DateV2 "select array_intersect(kadtv2, 
kadtv2) from fn_test"
-    order_qt_sql_array_intersect_DateV2_notnull "select 
array_intersect(kadtv2, kadtv2) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_Double "select 
array_sort(array_intersect(kadbl, kadbl)) from fn_test"
+    order_qt_sql_array_intersect_Double_notnull "select 
array_sort(array_intersect(kadbl, kadbl)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_Float "select 
array_sort(array_intersect(kafloat, kafloat)) from fn_test"
+    order_qt_sql_array_intersect_Float_notnull "select 
array_sort(array_intersect(kafloat, kafloat)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_LargeInt "select 
array_sort(array_intersect(kalint, kalint)) from fn_test"
+    order_qt_sql_array_intersect_LargeInt_notnull "select 
array_sort(array_intersect(kalint, kalint)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_BigInt "select 
array_sort(array_intersect(kabint, kabint)) from fn_test"
+    order_qt_sql_array_intersect_BigInt_notnull "select 
array_sort(array_intersect(kabint, kabint)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_SmallInt "select 
array_sort(array_intersect(kasint, kasint)) from fn_test"
+    order_qt_sql_array_intersect_SmallInt_notnull "select 
array_sort(array_intersect(kasint, kasint)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_Integer "select 
array_sort(array_intersect(kaint, kaint)) from fn_test"
+    order_qt_sql_array_intersect_Integer_notnull "select 
array_sort(array_intersect(kaint, kaint)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_TinyInt "select 
array_sort(array_intersect(katint, katint)) from fn_test"
+    order_qt_sql_array_intersect_TinyInt_notnull "select 
array_sort(array_intersect(katint, katint)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_DecimalV3 "select 
array_sort(array_intersect(kadcml, kadcml)) from fn_test"
+    order_qt_sql_array_intersect_DecimalV3_notnull "select 
array_sort(array_intersect(kadcml, kadcml)) from fn_test_not_nullable"
+
+    order_qt_sql_array_intersect_Boolean "select 
array_sort(array_intersect(kabool, kabool)) from fn_test"
+    order_qt_sql_array_intersect_Boolean_notnull "select 
array_sort(array_intersect(kabool, kabool)) from fn_test_not_nullable"
+
+    order_qt_sql_array_intersect_Char "select 
array_sort(array_intersect(kachr, kachr)) from fn_test"
+    order_qt_sql_array_intersect_Char_notnull "select 
array_sort(array_intersect(kachr, kachr)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_Varchar "select 
array_sort(array_intersect(kavchr, kavchr)) from fn_test"
+    order_qt_sql_array_intersect_Varchar_notnull "select 
array_sort(array_intersect(kavchr, kavchr)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_String "select 
array_sort(array_intersect(kastr, kastr)) from fn_test"
+    order_qt_sql_array_intersect_String_notnull "select 
array_sort(array_intersect(kastr, kastr)) from fn_test_not_nullable"
+
+    order_qt_sql_array_intersect_DatetimeV2 "select 
array_sort(array_intersect(kadtmv2, kadtmv2)) from fn_test"
+    order_qt_sql_array_intersect_DatetimeV2_notnull "select 
array_sort(array_intersect(kadtmv2, kadtmv2)) from fn_test_not_nullable"
+    order_qt_sql_array_intersect_DateV2 "select 
array_sort(array_intersect(kadtv2, kadtv2)) from fn_test"
+    order_qt_sql_array_intersect_DateV2_notnull "select 
array_sort(array_intersect(kadtv2, kadtv2)) from fn_test_not_nullable"
 
     // array_join
     order_qt_sql_array_join_Double "select array_join(kadbl, ',', 'null') from 
fn_test"
@@ -808,37 +808,37 @@ suite("nereids_scalar_fn_Array") {
     order_qt_sql_array_sum_DecimalV3_notnull "select array_sum(kadcml) from 
fn_test_not_nullable"
 
     // array_union
-    order_qt_sql_array_union_Double "select array_union(kadbl, kadbl) from 
fn_test"
-    order_qt_sql_array_union_Double_notnull "select array_union(kadbl, kadbl) 
from fn_test_not_nullable"
-    order_qt_sql_array_union_Float "select array_union(kafloat, kafloat) from 
fn_test"
-    order_qt_sql_array_union_Float_notnull "select array_union(kafloat, 
kafloat) from fn_test_not_nullable"
-    order_qt_sql_array_union_LargeInt "select array_union(kalint, kalint) from 
fn_test"
-    order_qt_sql_array_union_LargeInt_notnull "select array_union(kalint, 
kalint) from fn_test_not_nullable"
-    order_qt_sql_array_union_BigInt "select array_union(kabint, kabint) from 
fn_test"
-    order_qt_sql_array_union_BigInt_notnull "select array_union(kabint, 
kabint) from fn_test_not_nullable"
-    order_qt_sql_array_union_SmallInt "select array_union(kasint, kasint) from 
fn_test"
-    order_qt_sql_array_union_SmallInt_notnull "select array_union(kasint, 
kasint) from fn_test_not_nullable"
-    order_qt_sql_array_union_Integer "select array_union(kaint, kaint) from 
fn_test"
-    order_qt_sql_array_union_Integer_notnull "select array_union(kaint, kaint) 
from fn_test_not_nullable"
-    order_qt_sql_array_union_TinyInt "select array_union(katint, katint) from 
fn_test"
-    order_qt_sql_array_union_TinyInt_notnull "select array_union(katint, 
katint) from fn_test_not_nullable"
-    order_qt_sql_array_union_DecimalV3 "select array_union(kadcml, kadcml) 
from fn_test"
-    order_qt_sql_array_union_DecimalV3_notnull "select array_union(kadcml, 
kadcml) from fn_test_not_nullable"
-
-    order_qt_sql_array_union_Boolean "select array_union(kabool, kabool) from 
fn_test"
-    order_qt_sql_array_union_Boolean_notnull "select array_union(kabool, 
kabool) from fn_test_not_nullable"
-
-    order_qt_sql_array_union_Char "select array_union(kachr, kachr) from 
fn_test"
-    order_qt_sql_array_union_Char_notnull "select array_union(kachr, kachr) 
from fn_test_not_nullable"
-    order_qt_sql_array_union_Varchar "select array_union(kavchr, kavchr) from 
fn_test"
-    order_qt_sql_array_union_Varchar_notnull "select array_union(kavchr, 
kavchr) from fn_test_not_nullable"
-    order_qt_sql_array_union_String "select array_union(kastr, kastr) from 
fn_test"
-    order_qt_sql_array_union_String_notnull "select array_union(kastr, kastr) 
from fn_test_not_nullable"
-
-    order_qt_sql_array_union_DatetimeV2 "select array_union(kadtmv2, kadtmv2) 
from fn_test"
-    order_qt_sql_array_union_DatetimeV2_notnull "select array_union(kadtmv2, 
kadtmv2) from fn_test_not_nullable"
-    order_qt_sql_array_union_DateV2 "select array_union(kadtv2, kadtv2) from 
fn_test"
-    order_qt_sql_array_union_DateV2_notnull "select array_union(kadtv2, 
kadtv2) from fn_test_not_nullable"
+    order_qt_sql_array_union_Double "select array_sort(array_union(kadbl, 
kadbl)) from fn_test"
+    order_qt_sql_array_union_Double_notnull "select 
array_sort(array_union(kadbl, kadbl)) from fn_test_not_nullable"
+    order_qt_sql_array_union_Float "select array_sort(array_union(kafloat, 
kafloat)) from fn_test"
+    order_qt_sql_array_union_Float_notnull "select 
array_sort(array_union(kafloat, kafloat)) from fn_test_not_nullable"
+    order_qt_sql_array_union_LargeInt "select array_sort(array_union(kalint, 
kalint)) from fn_test"
+    order_qt_sql_array_union_LargeInt_notnull "select 
array_sort(array_union(kalint, kalint)) from fn_test_not_nullable"
+    order_qt_sql_array_union_BigInt "select array_sort(array_union(kabint, 
kabint)) from fn_test"
+    order_qt_sql_array_union_BigInt_notnull "select 
array_sort(array_union(kabint, kabint)) from fn_test_not_nullable"
+    order_qt_sql_array_union_SmallInt "select array_sort(array_union(kasint, 
kasint)) from fn_test"
+    order_qt_sql_array_union_SmallInt_notnull "select 
array_sort(array_union(kasint, kasint)) from fn_test_not_nullable"
+    order_qt_sql_array_union_Integer "select array_sort(array_union(kaint, 
kaint)) from fn_test"
+    order_qt_sql_array_union_Integer_notnull "select 
array_sort(array_union(kaint, kaint)) from fn_test_not_nullable"
+    order_qt_sql_array_union_TinyInt "select array_sort(array_union(katint, 
katint)) from fn_test"
+    order_qt_sql_array_union_TinyInt_notnull "select 
array_sort(array_union(katint, katint)) from fn_test_not_nullable"
+    order_qt_sql_array_union_DecimalV3 "select array_sort(array_union(kadcml, 
kadcml)) from fn_test"
+    order_qt_sql_array_union_DecimalV3_notnull "select 
array_sort(array_union(kadcml, kadcml)) from fn_test_not_nullable"
+
+    order_qt_sql_array_union_Boolean "select array_sort(array_union(kabool, 
kabool)) from fn_test"
+    order_qt_sql_array_union_Boolean_notnull "select 
array_sort(array_union(kabool, kabool)) from fn_test_not_nullable"
+
+    order_qt_sql_array_union_Char "select array_sort(array_union(kachr, 
kachr)) from fn_test"
+    order_qt_sql_array_union_Char_notnull "select 
array_sort(array_union(kachr, kachr)) from fn_test_not_nullable"
+    order_qt_sql_array_union_Varchar "select array_sort(array_union(kavchr, 
kavchr)) from fn_test"
+    order_qt_sql_array_union_Varchar_notnull "select 
array_sort(array_union(kavchr, kavchr)) from fn_test_not_nullable"
+    order_qt_sql_array_union_String "select array_sort(array_union(kastr, 
kastr)) from fn_test"
+    order_qt_sql_array_union_String_notnull "select 
array_sort(array_union(kastr, kastr)) from fn_test_not_nullable"
+
+    order_qt_sql_array_union_DatetimeV2 "select 
array_sort(array_union(kadtmv2, kadtmv2)) from fn_test"
+    order_qt_sql_array_union_DatetimeV2_notnull "select 
array_sort(array_union(kadtmv2, kadtmv2)) from fn_test_not_nullable"
+    order_qt_sql_array_union_DateV2 "select array_sort(array_union(kadtv2, 
kadtv2)) from fn_test"
+    order_qt_sql_array_union_DateV2_notnull "select 
array_sort(array_union(kadtv2, kadtv2)) from fn_test_not_nullable"
 
     // array_with_constant
     order_qt_sql_array_with_constant_Double "select array_with_constant(kint, 
kdbl) from fn_test"


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

Reply via email to