This is an automated email from the ASF dual-hosted git repository.
zclll 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 226576b1de6 [Feature](func) Support function mmh64_v2 (#57180)
226576b1de6 is described below
commit 226576b1de64dea566fca8a8c12f2d74cfb008dc
Author: linrrarity <[email protected]>
AuthorDate: Mon Oct 27 10:52:40 2025 +0800
[Feature](func) Support function mmh64_v2 (#57180)
1. alias `xxhash3_64` for `xxhash_64`
2. Support function `murmur_hash3_64_v2`
Before:
```text
mysql> SELECT MURMUR_HASH3_64('1000209601_1756808272');
+------------------------------------------+
| MURMUR_HASH3_64('1000209601_1756808272') |
+------------------------------------------+
| 1680830166030441144 |
+------------------------------------------+
```
This result differs from the return value of directly calling
mmh3.hash64 in other languages, because external APIs all use mmh3_128
for calculation and then truncate the first 64 bits. The 64-bit version
inside Doris compared to the 128-bit version lacks an h2 register (the
64-bit version only has h1), which will affect the final mixing
calculation of h1 and h2 in the algorithm, leading to issues in the
result.
After support:
```text
mysql> SELECT MURMUR_HASH3_64_V2('1000209601_1756808272');
+---------------------------------------------+
| MURMUR_HASH3_64_V2('1000209601_1756808272') |
+---------------------------------------------+
| 4038800892574899471 |
+---------------------------------------------+
```
The result now is completely the same as the API call.
---
be/src/util/hash_util.hpp | 11 ++++
be/src/util/murmur_hash3.cpp | 34 ++++++++--
be/src/util/murmur_hash3.h | 4 ++
be/src/vec/functions/function_hash.cpp | 41 ++++++++++--
be/src/vec/functions/function_hash.h | 10 ++-
be/test/vec/function/function_hash_test.cpp | 63 ++++++++++++++++++
.../doris/catalog/BuiltinScalarFunctions.java | 4 +-
.../functions/scalar/MurmurHash364V2.java | 75 ++++++++++++++++++++++
.../expressions/visitor/ScalarFunctionVisitor.java | 5 ++
.../hash_functions/test_hash_function.out | 12 ++++
.../hash_functions/test_hash_function.groovy | 19 ++++++
11 files changed, 265 insertions(+), 13 deletions(-)
diff --git a/be/src/util/hash_util.hpp b/be/src/util/hash_util.hpp
index c5dce6c7292..8f799a18a46 100644
--- a/be/src/util/hash_util.hpp
+++ b/be/src/util/hash_util.hpp
@@ -132,6 +132,17 @@ public:
return out;
}
+ template <bool is_mmh64_v2>
+ static uint64_t murmur_hash3_64(const void* key, int64_t len, uint64_t
seed) {
+ uint64_t out = 0;
+ if constexpr (is_mmh64_v2) {
+ murmur_hash3_x64_64_shared(key, len, seed, &out);
+ } else {
+ murmur_hash3_x64_64(key, len, seed, &out);
+ }
+ return out;
+ }
+
static const int MURMUR_R = 47;
// Murmur2 hash implementation returning 64-bit hashes.
diff --git a/be/src/util/murmur_hash3.cpp b/be/src/util/murmur_hash3.cpp
index 23069862967..1dcff80404d 100644
--- a/be/src/util/murmur_hash3.cpp
+++ b/be/src/util/murmur_hash3.cpp
@@ -315,13 +315,11 @@ void murmur_hash3_x86_128(const void* key, const int len,
uint32_t seed, void* o
//-----------------------------------------------------------------------------
-void murmur_hash3_x64_128(const void* key, const int len, const uint32_t seed,
void* out) {
+// Helper function that implements the core MurmurHash3 128-bit hashing
algorithm
+void murmur_hash3_x64_process(const void* key, const int len, uint64_t& h1,
uint64_t& h2) {
const uint8_t* data = (const uint8_t*)key;
const int nblocks = len / 16;
- uint64_t h1 = seed;
- uint64_t h2 = seed;
-
const uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5);
const uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f);
@@ -430,11 +428,39 @@ void murmur_hash3_x64_128(const void* key, const int len,
const uint32_t seed, v
h1 += h2;
h2 += h1;
+}
+//-----------------------------------------------------------------------------
+
+// The origin function `murmur_hash3_x64_128` is copied from:
https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
+// And Doris modified it into function `murmur_hash3_x64_process`
+// For this reason, this function is still retained even though it has no
calls.
+void murmur_hash3_x64_128(const void* key, const int len, const uint32_t seed,
void* out) {
+ uint64_t h1 = seed;
+ uint64_t h2 = seed;
+ murmur_hash3_x64_process(key, len, h1, h2);
((uint64_t*)out)[0] = h1;
((uint64_t*)out)[1] = h2;
}
+//-----------------------------------------------------------------------------
+
+// MurmurHash3 x64 64-bit variant using shared 128-bit processing function
+// This implementation reuses the murmur_hash3_x64_process function and only
outputs the first hash value
+// Used for function mmh3_64_v2
+void murmur_hash3_x64_64_shared(const void* key, const int64_t len, const
uint64_t seed,
+ void* out) {
+ uint64_t h1 = seed;
+ uint64_t h2 = seed;
+ murmur_hash3_x64_process(key, static_cast<int>(len), h1, h2);
+ ((uint64_t*)out)[0] = h1;
+}
+
+//-----------------------------------------------------------------------------
+
+// MurmurHash3 x64 64-bit variant with optimized standalone implementation
+// This implementation is specifically optimized for 64-bit output
+// Used for function mmh3_64
void murmur_hash3_x64_64(const void* key, const int64_t len, const uint64_t
seed, void* out) {
const uint8_t* data = (const uint8_t*)key;
const int nblocks = (int)len / 8;
diff --git a/be/src/util/murmur_hash3.h b/be/src/util/murmur_hash3.h
index 93e7ef13018..072cf9b12bd 100644
--- a/be/src/util/murmur_hash3.h
+++ b/be/src/util/murmur_hash3.h
@@ -11,8 +11,12 @@ void murmur_hash3_x86_32(const void* key, int64_t len,
uint32_t seed, void* out)
void murmur_hash3_x86_128(const void* key, int len, uint32_t seed, void* out);
+void murmur_hash3_x64_process(const void* key, const int len, uint64_t& h1,
uint64_t& h2);
+
void murmur_hash3_x64_128(const void* key, int len, uint32_t seed, void* out);
+void murmur_hash3_x64_64_shared(const void* key, const int64_t len, const
uint64_t seed, void* out);
+
void murmur_hash3_x64_64(const void* key, int64_t len, uint64_t seed, void*
out);
} // namespace doris
\ No newline at end of file
diff --git a/be/src/vec/functions/function_hash.cpp
b/be/src/vec/functions/function_hash.cpp
index 6bc38ddfcaf..332a3a2344f 100644
--- a/be/src/vec/functions/function_hash.cpp
+++ b/be/src/vec/functions/function_hash.cpp
@@ -41,9 +41,18 @@ namespace doris::vectorized {
#include "common/compile_check_begin.h"
constexpr uint64_t emtpy_value = 0xe28dbde7fe22e41c;
-template <PrimitiveType ReturnType>
+template <PrimitiveType ReturnType, bool is_mmh64_v2 = false>
struct MurmurHash3Impl {
- static constexpr auto name = ReturnType == TYPE_INT ? "murmur_hash3_32" :
"murmur_hash3_64";
+ static constexpr auto get_name() {
+ if constexpr (ReturnType == TYPE_INT) {
+ return "murmur_hash3_32";
+ } else if constexpr (is_mmh64_v2) {
+ return "murmur_hash3_64_v2";
+ } else {
+ return "murmur_hash3_64";
+ }
+ }
+ static constexpr auto name = get_name();
static Status empty_apply(IColumn& icolumn, size_t input_rows_count) {
ColumnVector<ReturnType>& vec_to =
assert_cast<ColumnVector<ReturnType>&>(icolumn);
@@ -87,9 +96,9 @@ struct MurmurHash3Impl {
reinterpret_cast<const
char*>(&data[current_offset]),
offsets[i] - current_offset, col_to_data[i]);
} else {
- murmur_hash3_x64_64(reinterpret_cast<const
char*>(&data[current_offset]),
- offsets[i] - current_offset,
col_to_data[i],
- col_to_data.data() + i);
+ col_to_data[i] = HashUtil::murmur_hash3_64<is_mmh64_v2>(
+ reinterpret_cast<const
char*>(&data[current_offset]),
+ offsets[i] - current_offset, col_to_data[i]);
}
current_offset = offsets[i];
}
@@ -101,8 +110,8 @@ struct MurmurHash3Impl {
col_to_data[i] =
HashUtil::murmur_hash3_32(value.data(),
value.size(), col_to_data[i]);
} else {
- murmur_hash3_x64_64(value.data(), value.size(),
col_to_data[i],
- col_to_data.data() + i);
+ col_to_data[i] = HashUtil::murmur_hash3_64<is_mmh64_v2>(
+ value.data(), value.size(), col_to_data[i]);
}
}
} else {
@@ -118,6 +127,22 @@ using FunctionMurmurHash3_32 =
FunctionVariadicArgumentsBase<DataTypeInt32,
MurmurHash3Impl<TYPE_INT>>;
using FunctionMurmurHash3_64 =
FunctionVariadicArgumentsBase<DataTypeInt64,
MurmurHash3Impl<TYPE_BIGINT>>;
+using FunctionMurmurHash3_64_V2 =
+ FunctionVariadicArgumentsBase<DataTypeInt64,
MurmurHash3Impl<TYPE_BIGINT, true>>;
+
+#ifdef BE_TEST
+const char* murmur_hash3_get_name_type_int_for_test() {
+ return MurmurHash3Impl<TYPE_INT>::get_name();
+}
+
+const char* murmur_hash3_get_name_type_bigint_for_test() {
+ return MurmurHash3Impl<TYPE_BIGINT>::get_name();
+}
+
+const char* murmur_hash3_get_name_type_bigint_v2_for_test() {
+ return MurmurHash3Impl<TYPE_BIGINT, true>::get_name();
+}
+#endif
template <PrimitiveType ReturnType>
struct XxHashImpl {
@@ -204,7 +229,9 @@ using FunctionXxHash_64 =
FunctionVariadicArgumentsBase<DataTypeInt64, XxHashImp
void register_function_hash(SimpleFunctionFactory& factory) {
factory.register_function<FunctionMurmurHash3_32>();
factory.register_function<FunctionMurmurHash3_64>();
+ factory.register_function<FunctionMurmurHash3_64_V2>();
factory.register_function<FunctionXxHash_32>();
factory.register_function<FunctionXxHash_64>();
+ factory.register_alias("xxhash_64", "xxhash3_64");
}
} // namespace doris::vectorized
\ No newline at end of file
diff --git a/be/src/vec/functions/function_hash.h
b/be/src/vec/functions/function_hash.h
index 0516dd85c4c..7da4a75dc3a 100644
--- a/be/src/vec/functions/function_hash.h
+++ b/be/src/vec/functions/function_hash.h
@@ -22,4 +22,12 @@
#include "vec/core/types.h"
-namespace doris::vectorized {} // namespace doris::vectorized
+namespace doris::vectorized {
+
+#ifdef BE_TEST
+const char* murmur_hash3_get_name_type_int_for_test();
+const char* murmur_hash3_get_name_type_bigint_for_test();
+const char* murmur_hash3_get_name_type_bigint_v2_for_test();
+#endif
+
+} // namespace doris::vectorized
diff --git a/be/test/vec/function/function_hash_test.cpp
b/be/test/vec/function/function_hash_test.cpp
index 3333fa72e9b..3e866cd1fd4 100644
--- a/be/test/vec/function/function_hash_test.cpp
+++ b/be/test/vec/function/function_hash_test.cpp
@@ -15,6 +15,8 @@
// specific language governing permissions and limitations
// under the License.
+#include "vec/functions/function_hash.h"
+
#include <stdint.h>
#include <string>
@@ -24,6 +26,7 @@
#include "function_test_util.h"
#include "gtest/gtest_pred_impl.h"
#include "testutil/any_type.h"
+#include "util/murmur_hash3.h"
#include "vec/core/types.h"
#include "vec/data_types/data_type_nullable.h"
#include "vec/data_types/data_type_number.h"
@@ -97,6 +100,26 @@ TEST(HashFunctionTest, murmur_hash_3_64_test) {
};
}
+TEST(HashFunctionTest, murmur_hash_3_64_v2_test) {
+ std::string func_name = "murmur_hash3_64_v2";
+
+ {
+ InputTypeSet input_types = {PrimitiveType::TYPE_VARCHAR};
+
+ DataSet data_set = {{{std::string("1000209601_1756808272")},
(int64_t)4038800892574899471},
+ {{std::string("hello world")},
(int64_t)5998619086395760910},
+ {{std::string("apache doris")},
(int64_t)3669213779466221743}};
+
+ static_cast<void>(check_function<DataTypeInt64, true>(func_name,
input_types, data_set));
+ };
+}
+
+TEST(HashFunctionTest, murmur_hash_get_name_test) {
+ EXPECT_STREQ(murmur_hash3_get_name_type_int_for_test(), "murmur_hash3_32");
+ EXPECT_STREQ(murmur_hash3_get_name_type_bigint_for_test(),
"murmur_hash3_64");
+ EXPECT_STREQ(murmur_hash3_get_name_type_bigint_v2_for_test(),
"murmur_hash3_64_v2");
+}
+
TEST(HashFunctionTest, xxhash_32_test) {
std::string func_name = "xxhash_32";
@@ -221,4 +244,44 @@ TEST(HashFunctionTest, xxhash_64_test) {
};
}
+TEST(HashFunctionTest, murmur_hash3_helper_functions_test) {
+ {
+ std::string input = "hello world";
+ uint64_t h1 = 0;
+ uint64_t h2 = 0;
+ murmur_hash3_x64_process(input.data(), input.size(), h1, h2);
+ EXPECT_EQ(h1, 5998619086395760910ULL);
+ EXPECT_EQ(h2, 12364428806279881649ULL);
+ }
+
+ {
+ std::string input = "hello world";
+ uint64_t out[2] = {0, 0};
+ murmur_hash3_x64_128(input.data(), input.size(), 0, out);
+ EXPECT_TRUE(out[0] == 5998619086395760910ULL && out[1] ==
12364428806279881649ULL);
+ }
+
+ {
+ std::string input = "hello world";
+ uint64_t out = 0;
+ murmur_hash3_x64_64_shared(input.data(), input.size(), 0, &out);
+ EXPECT_EQ(out, 5998619086395760910ULL);
+ }
+
+ {
+ std::string input = "hello";
+ uint64_t out = 0;
+ murmur_hash3_x64_64(input.data(), input.size(), 0, &out);
+ EXPECT_EQ(out, static_cast<uint64_t>(-3215607508166160593LL));
+ }
+
+ {
+ std::string input = "";
+ uint64_t h1 = 0, h2 = 0;
+ murmur_hash3_x64_process(input.data(), input.size(), h1, h2);
+ EXPECT_EQ(h1, 0ULL);
+ EXPECT_EQ(h2, 0ULL);
+ }
+}
+
} // namespace doris::vectorized
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
index 54d40c546e5..1d290dc283e 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
@@ -353,6 +353,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.MultiMatchAny
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MultiSearchAllPositions;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash332;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364V2;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Negative;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NextDay;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NgramSearch;
@@ -882,6 +883,7 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(MultiSearchAllPositions.class,
"multi_search_all_positions"),
scalar(MurmurHash332.class, "murmur_hash3_32"),
scalar(MurmurHash364.class, "murmur_hash3_64"),
+ scalar(MurmurHash364V2.class, "murmur_hash3_64_v2"),
scalar(Negative.class, "negative"),
scalar(NextDay.class, "next_day"),
scalar(NonNullable.class, "non_nullable"),
@@ -1062,7 +1064,7 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(WeeksSub.class, "weeks_sub"),
scalar(WidthBucket.class, "width_bucket"),
scalar(XxHash32.class, "xxhash_32"),
- scalar(XxHash64.class, "xxhash_64"),
+ scalar(XxHash64.class, "xxhash_64", "xxhash3_64"),
scalar(Xor.class, "xor"),
scalar(XpathString.class, "xpath_string"),
scalar(Year.class, "year"),
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MurmurHash364V2.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MurmurHash364V2.java
new file mode 100644
index 00000000000..61b30bf8f30
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MurmurHash364V2.java
@@ -0,0 +1,75 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.functions.scalar;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.BigIntType;
+import org.apache.doris.nereids.types.StringType;
+import org.apache.doris.nereids.types.VarcharType;
+import org.apache.doris.nereids.util.ExpressionUtils;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'murmur_hash3_64_v2'. This class is generated by
GenerateFunction.
+ */
+public class MurmurHash364V2 extends ScalarFunction
+ implements ExplicitlyCastableSignature, PropagateNullable {
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(VarcharType.SYSTEM_DEFAULT),
+
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(StringType.INSTANCE)
+ );
+
+ /**
+ * constructor with 1 or more arguments.
+ */
+ public MurmurHash364V2(Expression arg, Expression... varArgs) {
+ super("murmur_hash3_64_v2", ExpressionUtils.mergeArguments(arg,
varArgs));
+ }
+
+ /** constructor for withChildren and reuse signature */
+ private MurmurHash364V2(ScalarFunctionParams functionParams) {
+ super(functionParams);
+ }
+
+ /**
+ * withChildren.
+ */
+ @Override
+ public MurmurHash364V2 withChildren(List<Expression> children) {
+ Preconditions.checkArgument(!children.isEmpty());
+ return new MurmurHash364V2(getFunctionParams(children));
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitMurmurHash364V2(this, context);
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
index 7f823c53fad..8e7943fd71a 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java
@@ -356,6 +356,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.MultiMatchAny
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MultiSearchAllPositions;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash332;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash364V2;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Negative;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NextDay;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NgramSearch;
@@ -1781,6 +1782,10 @@ public interface ScalarFunctionVisitor<R, C> {
return visitScalarFunction(murmurHash364, context);
}
+ default R visitMurmurHash364V2(MurmurHash364V2 murmurHash364V2, C context)
{
+ return visitScalarFunction(murmurHash364V2, context);
+ }
+
default R visitXxHash32(XxHash32 xxHash32, C context) {
return visitScalarFunction(xxHash32, context);
}
diff --git
a/regression-test/data/query_p0/sql_functions/hash_functions/test_hash_function.out
b/regression-test/data/query_p0/sql_functions/hash_functions/test_hash_function.out
index 984075ddeff..e4d755e029e 100644
---
a/regression-test/data/query_p0/sql_functions/hash_functions/test_hash_function.out
+++
b/regression-test/data/query_p0/sql_functions/hash_functions/test_hash_function.out
@@ -17,6 +17,18 @@
-- !sql --
3583109472027628045
+-- !mmh3_64_v2_1 --
+\N
+
+-- !mmh3_64_v2_2 --
+4038800892574899471
+
+-- !mmh3_64_v2_3 --
+5998619086395760910
+
+-- !mmh3_64_v2_4 --
+3669213779466221743
+
-- !sql --
\N
diff --git
a/regression-test/suites/query_p0/sql_functions/hash_functions/test_hash_function.groovy
b/regression-test/suites/query_p0/sql_functions/hash_functions/test_hash_function.groovy
index d547e9fb287..74acd20a998 100644
---
a/regression-test/suites/query_p0/sql_functions/hash_functions/test_hash_function.groovy
+++
b/regression-test/suites/query_p0/sql_functions/hash_functions/test_hash_function.groovy
@@ -26,6 +26,13 @@ suite("test_hash_function", "arrow_flight_sql") {
qt_sql "SELECT murmur_hash3_64(\"hello\");"
qt_sql "SELECT murmur_hash3_64(\"hello\", \"world\");"
+ // Keep the results same with `mmh3.hash64` in python or `murmur3.Sum64`
in go
+ // Please dont auto genOut for this test
+ qt_mmh3_64_v2_1 "SELECT MURMUR_HASH3_64_V2(NULL);"
+ qt_mmh3_64_v2_2 "SELECT MURMUR_HASH3_64_V2('1000209601_1756808272');"
+ qt_mmh3_64_v2_3 "SELECT MURMUR_HASH3_64_V2('hello world');"
+ qt_mmh3_64_v2_4 "SELECT MURMUR_HASH3_64_V2('apache doris');"
+
qt_sql "SELECT xxhash_32(null);"
qt_sql "SELECT xxhash_32(\"hello\");"
qt_sql "SELECT xxhash_32(\"hello\", \"world\");"
@@ -33,4 +40,16 @@ suite("test_hash_function", "arrow_flight_sql") {
qt_sql "SELECT xxhash_64(null);"
qt_sql "SELECT xxhash_64(\"hello\");"
qt_sql "SELECT xxhash_64(\"hello\", \"world\");"
+
+ def xxhash_res = sql "SELECT xxhash_64(null);"
+ def xxhash3_res = sql "SELECT xxhash3_64(null);"
+ assertEquals(xxhash_res, xxhash3_res);
+
+ xxhash_res = sql "SELECT xxhash_64(\"hello\");"
+ xxhash3_res = sql "SELECT xxhash3_64(\"hello\");"
+ assertEquals(xxhash_res, xxhash3_res);
+
+ xxhash_res = sql "SELECT xxhash_64(\"hello\", \"world\");"
+ xxhash3_res = sql "SELECT xxhash3_64(\"hello\", \"world\");"
+ assertEquals(xxhash_res, xxhash3_res);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]