| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| #include "olap/key_coder.h" |
| |
| #include <gtest/gtest-message.h> |
| #include <gtest/gtest-test-part.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include <fstream> |
| #include <limits> |
| |
| #include "gtest/gtest_pred_impl.h" |
| #include "olap/uint24.h" |
| #include "testutil/test_util.h" |
| #include "util/debug_util.h" |
| |
| namespace doris { |
| |
| class KeyCoderTest : public testing::Test { |
| public: |
| KeyCoderTest() = default; |
| virtual ~KeyCoderTest() = default; |
| }; |
| |
| template <FieldType type> |
| void test_integer_encode() { |
| using CppType = typename CppTypeTraits<type>::CppType; |
| |
| auto key_coder = get_key_coder(type); |
| |
| { |
| std::string buf; |
| CppType val = std::numeric_limits<CppType>::min(); |
| key_coder->encode_ascending(&val, 1, &buf); |
| |
| std::string result; |
| for (int i = 0; i < sizeof(CppType); ++i) { |
| result.append("00"); |
| } |
| |
| EXPECT_STREQ(result.c_str(), hexdump(buf.data(), buf.size()).c_str()); |
| |
| { |
| Slice slice(buf); |
| CppType check_val; |
| static_cast<void>( |
| key_coder->decode_ascending(&slice, sizeof(CppType), (uint8_t*)&check_val)); |
| EXPECT_EQ(val, check_val); |
| } |
| } |
| |
| { |
| std::string buf; |
| CppType val = std::numeric_limits<CppType>::max(); |
| key_coder->encode_ascending(&val, sizeof(CppType), &buf); |
| |
| std::string result; |
| for (int i = 0; i < sizeof(CppType); ++i) { |
| result.append("FF"); |
| } |
| |
| EXPECT_STREQ(result.c_str(), hexdump(buf.data(), buf.size()).c_str()); |
| { |
| Slice slice(buf); |
| CppType check_val; |
| static_cast<void>( |
| key_coder->decode_ascending(&slice, sizeof(CppType), (uint8_t*)&check_val)); |
| EXPECT_EQ(val, check_val); |
| } |
| } |
| |
| for (auto i = 0; i < 100; ++i) { |
| CppType val1 = random(); |
| CppType val2 = random(); |
| |
| std::string buf1; |
| std::string buf2; |
| |
| key_coder->encode_ascending(&val1, sizeof(CppType), &buf1); |
| key_coder->encode_ascending(&val2, sizeof(CppType), &buf2); |
| |
| if (val1 < val2) { |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) < 0); |
| } else if (val1 > val2) { |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) > 0); |
| } else { |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) == 0); |
| } |
| } |
| } |
| |
| template <FieldType field_type> |
| typename CppTypeTraits<field_type>::CppType decode_float(const std::string& encoded) { |
| Slice encoded_key(encoded); |
| typename CppTypeTraits<field_type>::CppType result; |
| uint8_t* ptr = reinterpret_cast<uint8_t*>(&result); |
| Status status = KeyCoderTraits<field_type>::decode_ascending(&encoded_key, sizeof(result), ptr); |
| EXPECT_TRUE(status.ok()); |
| return result; |
| } |
| |
| template <FieldType field_type> |
| std::string encode_float(typename CppTypeTraits<field_type>::CppType value) { |
| std::string buf; |
| KeyCoderTraits<field_type>::full_encode_ascending(&value, &buf); |
| return buf; |
| } |
| |
| template <FieldType field_type> |
| void test_encode_decode(typename CppTypeTraits<field_type>::CppType value) { |
| std::string encoded = encode_float<field_type>(value); |
| typename CppTypeTraits<field_type>::CppType decoded = decode_float<field_type>(encoded); |
| EXPECT_EQ(value, decoded); |
| } |
| |
| template <FieldType field_type> |
| void test_ordering(typename CppTypeTraits<field_type>::CppType a, |
| typename CppTypeTraits<field_type>::CppType b) { |
| std::string encoded_a = encode_float<field_type>(a); |
| std::string encoded_b = encode_float<field_type>(b); |
| |
| bool a_is_nan = std::isnan(a); |
| bool b_is_nan = std::isnan(b); |
| |
| if (a_is_nan && b_is_nan) { |
| EXPECT_EQ(encoded_a, encoded_b); |
| } else if (a_is_nan) { |
| EXPECT_GT(encoded_a, encoded_b); |
| } else if (b_is_nan) { |
| EXPECT_LT(encoded_a, encoded_b); |
| } else if (a < b) { |
| EXPECT_LT(encoded_a, encoded_b); |
| } else if (a > b) { |
| EXPECT_GT(encoded_a, encoded_b); |
| } else { |
| if (std::signbit(a) && !std::signbit(b)) { |
| EXPECT_LT(encoded_a, encoded_b); |
| } else if (!std::signbit(a) && std::signbit(b)) { |
| EXPECT_GT(encoded_a, encoded_b); |
| } else { |
| EXPECT_EQ(encoded_a, encoded_b); |
| } |
| } |
| } |
| |
| TEST_F(KeyCoderTest, test_int) { |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_TINYINT>(); |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_SMALLINT>(); |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_INT>(); |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT>(); |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_BIGINT>(); |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT>(); |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_LARGEINT>(); |
| |
| test_integer_encode<FieldType::OLAP_FIELD_TYPE_DATETIME>(); |
| } |
| |
| TEST_F(KeyCoderTest, test_date) { |
| using CppType = uint24_t; |
| auto key_coder = get_key_coder(FieldType::OLAP_FIELD_TYPE_DATE); |
| |
| { |
| std::string buf; |
| CppType val = 0; |
| key_coder->encode_ascending(&val, 1, &buf); |
| |
| std::string result; |
| for (int i = 0; i < sizeof(uint24_t); ++i) { |
| result.append("00"); |
| } |
| |
| EXPECT_STREQ(result.c_str(), hexdump(buf.data(), buf.size()).c_str()); |
| |
| { |
| Slice slice(buf); |
| CppType check_val; |
| static_cast<void>( |
| key_coder->decode_ascending(&slice, sizeof(CppType), (uint8_t*)&check_val)); |
| EXPECT_EQ(val, check_val); |
| } |
| } |
| |
| { |
| std::string buf; |
| CppType val = 10000; |
| key_coder->encode_ascending(&val, sizeof(CppType), &buf); |
| |
| std::string result("002710"); |
| |
| EXPECT_STREQ(result.c_str(), hexdump(buf.data(), buf.size()).c_str()); |
| { |
| Slice slice(buf); |
| CppType check_val; |
| static_cast<void>( |
| key_coder->decode_ascending(&slice, sizeof(CppType), (uint8_t*)&check_val)); |
| EXPECT_EQ(val, check_val); |
| } |
| } |
| |
| for (auto i = 0; i < 100; ++i) { |
| CppType val1 = random(); |
| CppType val2 = random(); |
| |
| std::string buf1; |
| std::string buf2; |
| |
| key_coder->encode_ascending(&val1, sizeof(CppType), &buf1); |
| key_coder->encode_ascending(&val2, sizeof(CppType), &buf2); |
| |
| if (val1 < val2) { |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) < 0); |
| } else if (val1 > val2) { |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) > 0); |
| } else { |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) == 0); |
| } |
| } |
| } |
| |
| TEST_F(KeyCoderTest, test_decimal) { |
| auto key_coder = get_key_coder(FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| |
| decimal12_t val1 = {1, 100000000}; |
| std::string buf1; |
| |
| key_coder->encode_ascending(&val1, sizeof(decimal12_t), &buf1); |
| |
| decimal12_t check_val; |
| Slice slice1(buf1); |
| static_cast<void>( |
| key_coder->decode_ascending(&slice1, sizeof(decimal12_t), (uint8_t*)&check_val)); |
| EXPECT_EQ(check_val, val1); |
| |
| { |
| decimal12_t val2 = {-1, -100000000}; |
| std::string buf2; |
| key_coder->encode_ascending(&val2, sizeof(decimal12_t), &buf2); |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) > 0); |
| } |
| { |
| decimal12_t val2 = {1, 100000001}; |
| std::string buf2; |
| key_coder->encode_ascending(&val2, sizeof(decimal12_t), &buf2); |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) < 0); |
| } |
| { |
| decimal12_t val2 = {0, 0}; |
| std::string buf2; |
| key_coder->encode_ascending(&val2, sizeof(decimal12_t), &buf2); |
| EXPECT_TRUE(memcmp(buf1.c_str(), buf2.c_str(), buf1.size()) > 0); |
| |
| std::string result("80"); |
| for (int i = 0; i < sizeof(int64_t) - 1; ++i) { |
| result.append("00"); |
| } |
| result.append("80"); |
| for (int i = 0; i < sizeof(int32_t) - 1; ++i) { |
| result.append("00"); |
| } |
| |
| EXPECT_STREQ(result.c_str(), hexdump(buf2.data(), buf2.size()).c_str()); |
| } |
| } |
| |
| TEST_F(KeyCoderTest, test_char) { |
| auto key_coder = get_key_coder(FieldType::OLAP_FIELD_TYPE_CHAR); |
| |
| char buf[] = "1234567890"; |
| Slice slice(buf, 10); |
| |
| { |
| std::string key; |
| key_coder->encode_ascending(&slice, 10, &key); |
| Slice encoded_key(key); |
| /* |
| Slice check_slice; |
| auto st = key_coder->decode_ascending(&encoded_key, 10, (uint8_t*)&check_slice, &_pool); |
| EXPECT_TRUE(st.ok()); |
| |
| EXPECT_EQ(10, check_slice.size); |
| EXPECT_EQ(strncmp("1234567890", check_slice.data, 10), 0); |
| */ |
| } |
| |
| { |
| std::string key; |
| key_coder->encode_ascending(&slice, 5, &key); |
| Slice encoded_key(key); |
| /* |
| Slice check_slice; |
| auto st = key_coder->decode_ascending(&encoded_key, 5, (uint8_t*)&check_slice, &_pool); |
| EXPECT_TRUE(st.ok()); |
| |
| EXPECT_EQ(5, check_slice.size); |
| EXPECT_EQ(strncmp("12345", check_slice.data, 5), 0); |
| */ |
| } |
| } |
| |
| TEST_F(KeyCoderTest, test_varchar) { |
| auto key_coder = get_key_coder(FieldType::OLAP_FIELD_TYPE_VARCHAR); |
| |
| char buf[] = "1234567890"; |
| Slice slice(buf, 10); |
| |
| { |
| std::string key; |
| key_coder->encode_ascending(&slice, 15, &key); |
| Slice encoded_key(key); |
| /* |
| Slice check_slice; |
| auto st = key_coder->decode_ascending(&encoded_key, 15, (uint8_t*)&check_slice, &_pool); |
| EXPECT_TRUE(st.ok()); |
| |
| EXPECT_EQ(10, check_slice.size); |
| EXPECT_EQ(strncmp("1234567890", check_slice.data, 10), 0); |
| */ |
| } |
| |
| { |
| std::string key; |
| key_coder->encode_ascending(&slice, 5, &key); |
| Slice encoded_key(key); |
| /* |
| Slice check_slice; |
| auto st = key_coder->decode_ascending(&encoded_key, 5, (uint8_t*)&check_slice, &_pool); |
| EXPECT_TRUE(st.ok()); |
| |
| EXPECT_EQ(5, check_slice.size); |
| EXPECT_EQ(strncmp("12345", check_slice.data, 5), 0); |
| */ |
| } |
| } |
| |
| TEST(KeyCoderTraitsTest, FloatEncodeDecode) { |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(3.14f); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(-3.14f); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(0.0f); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(-0.0f); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(std::numeric_limits<float>::max()); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(std::numeric_limits<float>::min()); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_FLOAT>(std::numeric_limits<float>::lowest()); |
| } |
| |
| TEST(KeyCoderTraitsTest, FloatOrdering) { |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(-1.0f, 1.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(-2.0f, -1.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(-0.0f, 0.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(1.0f, 2.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(0.0f, 0.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(std::numeric_limits<float>::lowest(), |
| std::numeric_limits<float>::max()); |
| } |
| |
| TEST(KeyCoderTraitsTest, DoubleEncodeDecode) { |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(3.1415926535); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-3.1415926535); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(0.0); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-0.0); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(std::numeric_limits<double>::max()); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(std::numeric_limits<double>::min()); |
| test_encode_decode<FieldType::OLAP_FIELD_TYPE_DOUBLE>(std::numeric_limits<double>::lowest()); |
| } |
| |
| TEST(KeyCoderTraitsTest, DoubleOrdering) { |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-1.0, 1.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-2.0, -1.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-0.0, 0.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(1.0, 2.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(0.0, 0.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(std::numeric_limits<double>::lowest(), |
| std::numeric_limits<double>::max()); |
| } |
| |
| TEST(KeyCoderTraitsTest, FloatSpecialValues) { |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>( |
| std::numeric_limits<float>::quiet_NaN()); |
| EXPECT_EQ("FFC00000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>( |
| std::numeric_limits<float>::infinity()); |
| EXPECT_EQ("FF800000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>(1.0f); |
| EXPECT_EQ("BF800000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>(0.0f); |
| EXPECT_EQ("80000000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>(-0.0f); |
| EXPECT_EQ("7FFFFFFF", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>(-1.0f); |
| EXPECT_EQ("407FFFFF", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_FLOAT>( |
| -std::numeric_limits<float>::infinity()); |
| EXPECT_EQ("007FFFFF", hexdump(encoded.data(), encoded.size())); |
| } |
| |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(-std::numeric_limits<float>::infinity(), -1.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(-1.0f, -0.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(-0.0f, 0.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(0.0f, 1.0f); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(1.0f, std::numeric_limits<float>::infinity()); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(std::numeric_limits<float>::infinity(), |
| std::numeric_limits<float>::quiet_NaN()); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(std::numeric_limits<float>::quiet_NaN(), |
| std::numeric_limits<float>::quiet_NaN()); |
| } |
| |
| TEST(KeyCoderTraitsTest, DoubleSpecialValues) { |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>( |
| std::numeric_limits<double>::quiet_NaN()); |
| EXPECT_EQ("FFF8000000000000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>( |
| std::numeric_limits<double>::infinity()); |
| EXPECT_EQ("FFF0000000000000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>(1.0); |
| EXPECT_EQ("BFF0000000000000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>(0.0); |
| EXPECT_EQ("8000000000000000", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-0.0); |
| EXPECT_EQ("7FFFFFFFFFFFFFFF", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-1.0); |
| EXPECT_EQ("400FFFFFFFFFFFFF", hexdump(encoded.data(), encoded.size())); |
| } |
| { |
| std::string encoded = encode_float<FieldType::OLAP_FIELD_TYPE_DOUBLE>( |
| -std::numeric_limits<double>::infinity()); |
| EXPECT_EQ("000FFFFFFFFFFFFF", hexdump(encoded.data(), encoded.size())); |
| } |
| |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-std::numeric_limits<double>::infinity(), |
| -1.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-1.0, -0.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(-0.0, 0.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(0.0, 1.0); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(1.0, std::numeric_limits<double>::infinity()); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(std::numeric_limits<double>::infinity(), |
| std::numeric_limits<double>::quiet_NaN()); |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(std::numeric_limits<double>::quiet_NaN(), |
| std::numeric_limits<double>::quiet_NaN()); |
| } |
| |
| TEST(KeyCoderTraitsTest, FloatComprehensiveOrdering) { |
| std::vector<float> values = {-std::numeric_limits<float>::infinity(), |
| -100.0f, |
| -1.0f, |
| -0.0f, |
| 0.0f, |
| 1.0f, |
| 100.0f, |
| std::numeric_limits<float>::infinity(), |
| std::numeric_limits<float>::quiet_NaN()}; |
| |
| for (size_t i = 0; i < values.size(); ++i) { |
| for (size_t j = 0; j < values.size(); ++j) { |
| test_ordering<FieldType::OLAP_FIELD_TYPE_FLOAT>(values[i], values[j]); |
| } |
| } |
| } |
| |
| TEST(KeyCoderTraitsTest, DoubleComprehensiveOrdering) { |
| std::vector<double> values = {-std::numeric_limits<double>::infinity(), |
| -100.0, |
| -1.0, |
| -0.0, |
| 0.0, |
| 1.0, |
| 100.0, |
| std::numeric_limits<double>::infinity(), |
| std::numeric_limits<double>::quiet_NaN()}; |
| |
| for (size_t i = 0; i < values.size(); ++i) { |
| for (size_t j = 0; j < values.size(); ++j) { |
| test_ordering<FieldType::OLAP_FIELD_TYPE_DOUBLE>(values[i], values[j]); |
| } |
| } |
| } |
| |
| // single filedtype test |
| static const std::string filename = "./be/test/olap/test_data/key_coder_test.dat"; |
| // multi filedtype test(two filedtype) |
| static const std::string complex_filename = "./be/test/olap/test_data/key_coder_complex.dat"; |
| |
| // FieldType + original_value + encoded_value |
| template <typename T> |
| void WriteNumberToFile(std::ofstream& out, const T& value, FieldType field_type) { |
| const KeyCoder* coder = get_key_coder(field_type); |
| |
| std::string encoded_buf; |
| coder->full_encode_ascending(&value, &encoded_buf); |
| |
| const uint8_t field_type_value = static_cast<uint8_t>(field_type); |
| |
| // 1. FieldType |
| out.write(reinterpret_cast<const char*>(&field_type_value), sizeof(field_type_value)); |
| |
| // 2. original_value |
| size_t value_size = sizeof(T); |
| out.write(reinterpret_cast<const char*>(&value_size), sizeof(value_size)); |
| out.write(reinterpret_cast<const char*>(&value), value_size); |
| |
| // 3. encoded_value |
| size_t encoded_size = encoded_buf.size(); |
| out.write(reinterpret_cast<const char*>(&encoded_size), sizeof(encoded_size)); |
| out.write(encoded_buf.data(), encoded_size); |
| } |
| |
| // FieldType + index_size + original_value + encoded_value |
| void WriteStringToFile(std::ofstream& out, const std::string& value, FieldType field_type, |
| size_t index_size = 0) { |
| const KeyCoder* coder = get_key_coder(field_type); |
| Slice slice(value.data(), value.size()); |
| std::string encoded_buf; |
| coder->encode_ascending(&slice, index_size, &encoded_buf); |
| |
| const uint8_t field_type_value = static_cast<uint8_t>(field_type); |
| |
| // 1. FieldType |
| out.write(reinterpret_cast<const char*>(&field_type_value), sizeof(field_type_value)); |
| |
| // 2. index_size |
| out.write(reinterpret_cast<const char*>(&index_size), sizeof(index_size)); |
| |
| size_t value_size = value.size(); |
| |
| // 3. original_value |
| out.write(reinterpret_cast<const char*>(&value_size), sizeof(value_size)); |
| out.write(value.data(), value_size); |
| |
| // 4. encoded_value |
| size_t encoded_size = encoded_buf.size(); |
| out.write(reinterpret_cast<const char*>(&encoded_size), sizeof(encoded_size)); |
| out.write(encoded_buf.data(), encoded_size); |
| } |
| |
| // Helper function to read from file and decode |
| template <FieldType field_type> |
| void ReadAndDecodeNumber(std::ifstream& in) { |
| using T = typename CppTypeTraits<field_type>::CppType; |
| |
| // 2. read original_value |
| size_t value_size = 0; |
| in.read(reinterpret_cast<char*>(&value_size), sizeof(value_size)); |
| |
| T original_value; |
| in.read(reinterpret_cast<char*>(&original_value), value_size); |
| |
| // 3. read encoded_value |
| size_t encoded_size; |
| in.read(reinterpret_cast<char*>(&encoded_size), sizeof(encoded_size)); |
| std::vector<char> encoded_buf(encoded_size); |
| in.read(encoded_buf.data(), encoded_size); |
| |
| const KeyCoder* coder = get_key_coder(field_type); |
| EXPECT_NE(coder, nullptr); |
| |
| // test1: decode |
| T decoded_value; |
| Slice slice(encoded_buf.data(), encoded_size); |
| auto st = coder->decode_ascending(&slice, 0, (uint8_t*)&decoded_value); |
| EXPECT_TRUE(st.ok()) << st.msg(); |
| if constexpr (field_type == FieldType::OLAP_FIELD_TYPE_FLOAT || |
| field_type == FieldType::OLAP_FIELD_TYPE_DOUBLE) { |
| if (std::isnan(original_value)) { |
| EXPECT_TRUE(std::isnan(decoded_value)); |
| } |
| } else { |
| EXPECT_EQ(decoded_value, original_value); |
| } |
| |
| // test2: full_encode |
| std::string encoded_buf_full; |
| coder->full_encode_ascending(&original_value, &encoded_buf_full); |
| EXPECT_EQ(std::string_view(encoded_buf_full), |
| std::string_view(encoded_buf.data(), encoded_size)); |
| } |
| |
| template <FieldType field_type> |
| void ReadAndDecodeString(std::ifstream& in) { |
| // 2. read index_size |
| size_t index_size; |
| in.read(reinterpret_cast<char*>(&index_size), sizeof(index_size)); |
| |
| // 3. read original_value |
| size_t value_size; |
| in.read(reinterpret_cast<char*>(&value_size), sizeof(value_size)); |
| std::vector<char> value_buf(value_size); |
| in.read(value_buf.data(), value_size); |
| |
| // 4. read encoded_value |
| size_t encoded_size; |
| in.read(reinterpret_cast<char*>(&encoded_size), sizeof(encoded_size)); |
| std::vector<char> encoded_buf(encoded_size); |
| in.read(encoded_buf.data(), encoded_size); |
| |
| const KeyCoder* coder = get_key_coder(field_type); |
| EXPECT_NE(coder, nullptr); |
| |
| // test |
| EXPECT_EQ(std::string_view(value_buf.data(), index_size), |
| std::string_view(encoded_buf.data(), encoded_size)); |
| } |
| |
| template <FieldType field_type> |
| void WriteAllBoundaryValues(std::ofstream& out) { |
| using T = typename CppTypeTraits<field_type>::CppType; |
| WriteNumberToFile<T>(out, std::numeric_limits<T>::min(), field_type); |
| WriteNumberToFile<T>(out, T(0), field_type); |
| WriteNumberToFile<T>(out, std::numeric_limits<T>::max(), field_type); |
| } |
| |
| void WriteStringsValues(std::ofstream& out, const std::string& str) { |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_CHAR, 0); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_CHAR, str.size() / 2); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_CHAR, str.size()); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_VARCHAR, 0); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_VARCHAR, str.size() / 2); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_VARCHAR, str.size()); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_STRING, 0); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_STRING, str.size() / 2); |
| WriteStringToFile(out, str, FieldType::OLAP_FIELD_TYPE_STRING, str.size()); |
| } |
| |
| template <FieldType field_type> |
| void WriteFloatValues(std::ofstream& out) { |
| using T = typename CppTypeTraits<field_type>::CppType; |
| WriteNumberToFile<T>(out, +0.0, field_type); |
| WriteNumberToFile<T>(out, -0.0, field_type); |
| WriteNumberToFile<T>(out, 1.0, field_type); |
| WriteNumberToFile<T>(out, -1.0, field_type); |
| WriteNumberToFile<T>(out, std::numeric_limits<T>::min(), field_type); |
| WriteNumberToFile<T>(out, std::numeric_limits<T>::max(), field_type); |
| WriteNumberToFile<T>(out, std::numeric_limits<T>::quiet_NaN(), field_type); |
| WriteNumberToFile<T>(out, std::numeric_limits<T>::infinity(), field_type); |
| WriteNumberToFile<T>(out, -std::numeric_limits<T>::infinity(), field_type); |
| } |
| |
| void WriteDecimalValues(std::ofstream& out) { |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, 0), FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(1, 0), FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(-1, 0), FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, 500000000), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, -500000000), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(999999999999999999, 999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(-999999999999999999, -999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, 999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, -999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(123, 1), FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(123, 999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(1, 999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(-1, -999999999), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, 123456789), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| WriteNumberToFile<decimal12_t>(out, decimal12_t(0, -123456789), |
| FieldType::OLAP_FIELD_TYPE_DECIMAL); |
| } |
| |
| TEST_F(KeyCoderTest, write_and_read_single_filedtype) { |
| // std::ofstream out(filename, std::ios::binary | std::ios::trunc); |
| // EXPECT_TRUE(out.is_open()) << "Failed to open file for writing: " << filename; |
| |
| // // 1. write integers |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_TINYINT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_SMALLINT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_INT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_BIGINT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_LARGEINT>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DATETIME>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DATE>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_BOOL>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DATEV2>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DATETIMEV2>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DECIMAL32>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DECIMAL64>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DECIMAL128I>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_DECIMAL256>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_IPV4>(out); |
| // WriteAllBoundaryValues<FieldType::OLAP_FIELD_TYPE_IPV6>(out); |
| |
| // // 2. write strings |
| // const std::string empty_str = ""; |
| // WriteStringsValues(out, empty_str); |
| |
| // const std::string control_chars = "\n\r\t\b\f\v\a\\\"\'"; |
| // WriteStringsValues(out, control_chars); |
| |
| // const std::string null_byte(1, '\0'); |
| // WriteStringsValues(out, null_byte); |
| |
| // const std::string ascii_edges = std::string("\x00\x7F"); |
| // WriteStringsValues(out, ascii_edges); |
| |
| // const std::string chinese = "中文测试:龘𠮷丂𡃁𠮷𠱓𡘙!"; |
| // WriteStringsValues(out, chinese); |
| |
| // const std::string korean = "안녕하세요"; |
| // WriteStringsValues(out, korean); |
| |
| // const std::string japanese = "こんにちは世界"; |
| // WriteStringsValues(out, japanese); |
| |
| // const std::string symbols = "αβγδε ∑∏∞∫√"; |
| // WriteStringsValues(out, symbols); |
| |
| // const std::string html_like = "<div class=\"test\">© 2025</div>"; |
| // WriteStringsValues(out, html_like); |
| |
| // const std::string escaped_literal = R"(This is not a real newline: \n)"; |
| // WriteStringsValues(out, escaped_literal); |
| |
| // const std::string long_str(1024, 'X'); |
| // WriteStringsValues(out, long_str); |
| |
| // std::string gbk_str = "\xC4\xE3\xBA\xC3"; |
| // WriteStringsValues(out, gbk_str); |
| |
| // std::string latin1_str = "\xE9\xE0\xF6"; |
| // WriteStringsValues(out, latin1_str); |
| |
| // // 3. write floats |
| // WriteFloatValues<FieldType::OLAP_FIELD_TYPE_FLOAT>(out); |
| // WriteFloatValues<FieldType::OLAP_FIELD_TYPE_DOUBLE>(out); |
| |
| // // 4. write decimal |
| // WriteDecimalValues(out); |
| |
| // out.close(); |
| |
| std::ifstream in(filename, std::ios::binary); |
| EXPECT_TRUE(in.is_open()) << "Failed to open file for reading: " << filename; |
| |
| while (in.peek() != EOF) { |
| FieldType field_type; |
| uint8_t field_type_value; |
| |
| in.read(reinterpret_cast<char*>(&field_type_value), sizeof(field_type_value)); |
| field_type = static_cast<FieldType>(field_type_value); |
| |
| switch (field_type) { |
| case FieldType::OLAP_FIELD_TYPE_TINYINT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_TINYINT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_SMALLINT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_SMALLINT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_INT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_INT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_BIGINT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_BIGINT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_LARGEINT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_LARGEINT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DATETIME: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DATETIME>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DATE: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DATE>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DECIMAL: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DECIMAL>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_BOOL: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_BOOL>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DATEV2: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DATEV2>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DATETIMEV2: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DATETIMEV2>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DECIMAL32: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DECIMAL32>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DECIMAL64: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DECIMAL64>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DECIMAL128I: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DECIMAL128I>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DECIMAL256: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DECIMAL256>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_IPV4: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_IPV4>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_IPV6: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_IPV6>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_CHAR: |
| ReadAndDecodeString<FieldType::OLAP_FIELD_TYPE_CHAR>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_VARCHAR: |
| ReadAndDecodeString<FieldType::OLAP_FIELD_TYPE_VARCHAR>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_STRING: |
| ReadAndDecodeString<FieldType::OLAP_FIELD_TYPE_STRING>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_FLOAT: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_FLOAT>(in); |
| break; |
| case FieldType::OLAP_FIELD_TYPE_DOUBLE: |
| ReadAndDecodeNumber<FieldType::OLAP_FIELD_TYPE_DOUBLE>(in); |
| break; |
| default: |
| FAIL() << "Unsupported field type: " << static_cast<int>(field_type); |
| break; |
| } |
| } |
| in.close(); |
| } |
| |
| template <FieldType field_type> |
| void WriteSingleValueToComplexFile(std::ofstream& out) { |
| if constexpr (field_type == FieldType::OLAP_FIELD_TYPE_DECIMAL) { |
| // 2. original_value |
| decimal12_t value(123, 1); |
| size_t value_size = sizeof(value); |
| out.write(reinterpret_cast<const char*>(&value_size), sizeof(value_size)); |
| out.write(reinterpret_cast<const char*>(&value), value_size); |
| } else if constexpr (field_is_numeric_type(field_type) || |
| field_type == FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT) { |
| using T = typename CppTypeTraits<field_type>::CppType; |
| T value = std::numeric_limits<T>::min(); |
| size_t value_size = sizeof(value); |
| out.write(reinterpret_cast<const char*>(&value_size), sizeof(value_size)); |
| out.write(reinterpret_cast<const char*>(&value), value_size); |
| } else if constexpr (field_is_slice_type(field_type)) { |
| const std::string value = |
| "abcdefghijklmnopqrstuvwxyz\n\r\t\b\f\v\a\\\"\'\0\x00\x7F龘𠮷丂𡃁𠮷𠱓𡘙"; |
| size_t index_size = 30; |
| if (field_type == FieldType::OLAP_FIELD_TYPE_CHAR) { |
| index_size = 10; |
| } else if (field_type == FieldType::OLAP_FIELD_TYPE_VARCHAR) { |
| index_size = 30; |
| } else if (field_type == FieldType::OLAP_FIELD_TYPE_STRING) { |
| index_size = value.size(); |
| } |
| // 2. index_size |
| out.write(reinterpret_cast<const char*>(&index_size), sizeof(index_size)); |
| |
| // 3. original_value |
| size_t value_size = value.size(); |
| out.write(reinterpret_cast<const char*>(&value_size), sizeof(value_size)); |
| out.write(value.data(), value_size); |
| } else { |
| FAIL() << "Unsupported field type: " << static_cast<int>(field_type); |
| } |
| } |
| |
| template <FieldType field_type> |
| void WriteSingleEncodedValueToComplexFile(std::ofstream& out) { |
| auto coder = get_key_coder(field_type); |
| EXPECT_NE(coder, nullptr); |
| std::string encoded_buf; |
| if constexpr (field_type == FieldType::OLAP_FIELD_TYPE_DECIMAL) { |
| // 2. original_value |
| decimal12_t value(123, 1); |
| coder->full_encode_ascending(&value, &encoded_buf); |
| } else if constexpr (field_is_numeric_type(field_type) || |
| field_type == FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT) { |
| using T = typename CppTypeTraits<field_type>::CppType; |
| T value = std::numeric_limits<T>::min(); |
| coder->full_encode_ascending(&value, &encoded_buf); |
| } else if constexpr (field_is_slice_type(field_type)) { |
| const std::string value = |
| "abcdefghijklmnopqrstuvwxyz\n\r\t\b\f\v\a\\\"\'\0\x00\x7F龘𠮷丂𡃁𠮷𠱓𡘙"; |
| size_t index_size = 30; |
| if (field_type == FieldType::OLAP_FIELD_TYPE_CHAR) { |
| index_size = 10; |
| } else if (field_type == FieldType::OLAP_FIELD_TYPE_VARCHAR) { |
| index_size = 30; |
| } else if (field_type == FieldType::OLAP_FIELD_TYPE_STRING) { |
| index_size = value.size(); |
| } |
| coder->encode_ascending(&value, index_size, &encoded_buf); |
| } else { |
| FAIL() << "Unsupported field type: " << static_cast<int>(field_type); |
| } |
| |
| size_t encoded_size = encoded_buf.size(); |
| out.write(reinterpret_cast<const char*>(&encoded_size), sizeof(encoded_size)); |
| out.write(encoded_buf.data(), encoded_size); |
| } |
| |
| #define DISPATCH_FIELD_VALUE(F) \ |
| case FieldType::OLAP_FIELD_TYPE_##F: \ |
| WriteSingleValueToComplexFile<FieldType::OLAP_FIELD_TYPE_##F>(out); \ |
| break; |
| #define DISPATCH_FIELD_ENCODED_VALUE(F) \ |
| case FieldType::OLAP_FIELD_TYPE_##F: \ |
| WriteSingleEncodedValueToComplexFile<FieldType::OLAP_FIELD_TYPE_##F>(out); \ |
| break; |
| |
| void WriteSingleValueToComplexFile(std::ofstream& out, FieldType field_type) { |
| switch (field_type) { |
| DISPATCH_FIELD_VALUE(TINYINT) |
| DISPATCH_FIELD_VALUE(SMALLINT) |
| DISPATCH_FIELD_VALUE(INT) |
| DISPATCH_FIELD_VALUE(UNSIGNED_INT) |
| DISPATCH_FIELD_VALUE(BIGINT) |
| DISPATCH_FIELD_VALUE(UNSIGNED_BIGINT) |
| DISPATCH_FIELD_VALUE(LARGEINT) |
| DISPATCH_FIELD_VALUE(BOOL) |
| DISPATCH_FIELD_VALUE(DATE) |
| DISPATCH_FIELD_VALUE(DATEV2) |
| DISPATCH_FIELD_VALUE(DATETIME) |
| DISPATCH_FIELD_VALUE(DATETIMEV2) |
| DISPATCH_FIELD_VALUE(DECIMAL) |
| DISPATCH_FIELD_VALUE(DECIMAL32) |
| DISPATCH_FIELD_VALUE(DECIMAL64) |
| DISPATCH_FIELD_VALUE(DECIMAL128I) |
| DISPATCH_FIELD_VALUE(DECIMAL256) |
| DISPATCH_FIELD_VALUE(IPV4) |
| DISPATCH_FIELD_VALUE(IPV6) |
| DISPATCH_FIELD_VALUE(CHAR) |
| DISPATCH_FIELD_VALUE(VARCHAR) |
| DISPATCH_FIELD_VALUE(STRING) |
| DISPATCH_FIELD_VALUE(FLOAT) |
| DISPATCH_FIELD_VALUE(DOUBLE) |
| default: |
| FAIL() << "Unsupported field type: " << static_cast<int>(field_type); |
| break; |
| } |
| } |
| |
| void WriteSingleEncodedValueToComplexFile(std::ofstream& out, FieldType field_type) { |
| switch (field_type) { |
| DISPATCH_FIELD_ENCODED_VALUE(TINYINT) |
| DISPATCH_FIELD_ENCODED_VALUE(SMALLINT) |
| DISPATCH_FIELD_ENCODED_VALUE(INT) |
| DISPATCH_FIELD_ENCODED_VALUE(UNSIGNED_INT) |
| DISPATCH_FIELD_ENCODED_VALUE(BIGINT) |
| DISPATCH_FIELD_ENCODED_VALUE(UNSIGNED_BIGINT) |
| DISPATCH_FIELD_ENCODED_VALUE(LARGEINT) |
| DISPATCH_FIELD_ENCODED_VALUE(BOOL) |
| DISPATCH_FIELD_ENCODED_VALUE(DATE) |
| DISPATCH_FIELD_ENCODED_VALUE(DATEV2) |
| DISPATCH_FIELD_ENCODED_VALUE(DATETIME) |
| DISPATCH_FIELD_ENCODED_VALUE(DATETIMEV2) |
| DISPATCH_FIELD_ENCODED_VALUE(DECIMAL) |
| DISPATCH_FIELD_ENCODED_VALUE(DECIMAL32) |
| DISPATCH_FIELD_ENCODED_VALUE(DECIMAL64) |
| DISPATCH_FIELD_ENCODED_VALUE(DECIMAL128I) |
| DISPATCH_FIELD_ENCODED_VALUE(DECIMAL256) |
| DISPATCH_FIELD_ENCODED_VALUE(IPV4) |
| DISPATCH_FIELD_ENCODED_VALUE(IPV6) |
| DISPATCH_FIELD_ENCODED_VALUE(CHAR) |
| DISPATCH_FIELD_ENCODED_VALUE(VARCHAR) |
| DISPATCH_FIELD_ENCODED_VALUE(STRING) |
| DISPATCH_FIELD_ENCODED_VALUE(FLOAT) |
| DISPATCH_FIELD_ENCODED_VALUE(DOUBLE) |
| default: |
| FAIL() << "Unsupported field type: " << static_cast<int>(field_type); |
| break; |
| } |
| } |
| |
| std::string ReadEncodedStringFromComplexFile(std::ifstream& in) { |
| size_t encoded_size; |
| in.read(reinterpret_cast<char*>(&encoded_size), sizeof(encoded_size)); |
| std::string encoded_buf(encoded_size, '\0'); |
| in.read(encoded_buf.data(), encoded_size); |
| return encoded_buf; |
| } |
| |
| template <FieldType field_type_i, FieldType field_type_j> |
| void ReadAndDecodeFromComplexFile(std::ifstream& in) { |
| if constexpr (field_is_slice_type(field_type_i) && field_is_slice_type(field_type_j)) { |
| size_t index_size_i; |
| in.read(reinterpret_cast<char*>(&index_size_i), sizeof(index_size_i)); |
| size_t value_size_i; |
| in.read(reinterpret_cast<char*>(&value_size_i), sizeof(value_size_i)); |
| std::string value_i(value_size_i, '\0'); |
| in.read(value_i.data(), value_size_i); |
| |
| size_t index_size_j; |
| in.read(reinterpret_cast<char*>(&index_size_j), sizeof(index_size_j)); |
| size_t value_size_j; |
| in.read(reinterpret_cast<char*>(&value_size_j), sizeof(value_size_j)); |
| std::string value_j(value_size_j, '\0'); |
| in.read(value_j.data(), value_size_j); |
| |
| auto coder_i = get_key_coder(field_type_i); |
| auto coder_j = get_key_coder(field_type_j); |
| EXPECT_NE(coder_i, nullptr); |
| EXPECT_NE(coder_j, nullptr); |
| |
| std::string encoded_buf_i; |
| coder_i->encode_ascending(&value_i, index_size_i, &encoded_buf_i); |
| std::string encoded_buf_j; |
| coder_j->encode_ascending(&value_j, index_size_j, &encoded_buf_j); |
| |
| std::string encoded_buf_i_str = ReadEncodedStringFromComplexFile(in); |
| std::string encoded_buf_j_str = ReadEncodedStringFromComplexFile(in); |
| EXPECT_EQ(encoded_buf_i_str, encoded_buf_i); |
| EXPECT_EQ(encoded_buf_j_str, encoded_buf_j); |
| } else if constexpr (field_is_slice_type(field_type_i) && !field_is_slice_type(field_type_j)) { |
| size_t index_size_i; |
| in.read(reinterpret_cast<char*>(&index_size_i), sizeof(index_size_i)); |
| size_t value_size_i; |
| in.read(reinterpret_cast<char*>(&value_size_i), sizeof(value_size_i)); |
| std::string value_i(value_size_i, '\0'); |
| in.read(value_i.data(), value_size_i); |
| |
| using T = typename CppTypeTraits<field_type_j>::CppType; |
| size_t value_size = 0; |
| in.read(reinterpret_cast<char*>(&value_size), sizeof(value_size)); |
| |
| T original_value; |
| in.read(reinterpret_cast<char*>(&original_value), value_size); |
| |
| auto coder_i = get_key_coder(field_type_i); |
| auto coder_j = get_key_coder(field_type_j); |
| EXPECT_NE(coder_i, nullptr); |
| EXPECT_NE(coder_j, nullptr); |
| |
| std::string encoded_buf_i; |
| coder_i->encode_ascending(&value_i, index_size_i, &encoded_buf_i); |
| std::string encoded_buf_j; |
| coder_j->full_encode_ascending(&original_value, &encoded_buf_j); |
| std::string encoded_buf_i_str = ReadEncodedStringFromComplexFile(in); |
| std::string encoded_buf_j_str = ReadEncodedStringFromComplexFile(in); |
| EXPECT_EQ(encoded_buf_i_str, encoded_buf_i); |
| EXPECT_EQ(encoded_buf_j_str, encoded_buf_j); |
| |
| T decoded_value; |
| Slice encoded_buf_j_str_slice(encoded_buf_j_str); |
| auto status = |
| coder_j->decode_ascending(&encoded_buf_j_str_slice, 0, (uint8_t*)&decoded_value); |
| EXPECT_TRUE(status.ok()); |
| EXPECT_EQ(decoded_value, original_value); |
| } else if constexpr (!field_is_slice_type(field_type_i) && field_is_slice_type(field_type_j)) { |
| using T = typename CppTypeTraits<field_type_i>::CppType; |
| size_t value_size = 0; |
| in.read(reinterpret_cast<char*>(&value_size), sizeof(value_size)); |
| |
| T original_value; |
| in.read(reinterpret_cast<char*>(&original_value), value_size); |
| |
| size_t index_size_j; |
| in.read(reinterpret_cast<char*>(&index_size_j), sizeof(index_size_j)); |
| size_t value_size_j; |
| in.read(reinterpret_cast<char*>(&value_size_j), sizeof(value_size_j)); |
| std::string value_j(value_size_j, '\0'); |
| in.read(value_j.data(), value_size_j); |
| |
| auto coder_i = get_key_coder(field_type_i); |
| auto coder_j = get_key_coder(field_type_j); |
| EXPECT_NE(coder_i, nullptr); |
| EXPECT_NE(coder_j, nullptr); |
| |
| std::string encoded_buf_i; |
| coder_i->full_encode_ascending(&original_value, &encoded_buf_i); |
| std::string encoded_buf_j; |
| coder_j->encode_ascending(&value_j, index_size_j, &encoded_buf_j); |
| |
| std::string encoded_buf_i_str = ReadEncodedStringFromComplexFile(in); |
| std::string encoded_buf_j_str = ReadEncodedStringFromComplexFile(in); |
| EXPECT_EQ(encoded_buf_i_str, encoded_buf_i); |
| EXPECT_EQ(encoded_buf_j_str, encoded_buf_j); |
| |
| T decoded_value; |
| Slice encoded_buf_i_str_slice(encoded_buf_i_str); |
| auto status = |
| coder_i->decode_ascending(&encoded_buf_i_str_slice, 0, (uint8_t*)&decoded_value); |
| EXPECT_TRUE(status.ok()); |
| EXPECT_EQ(decoded_value, original_value); |
| } else { |
| using T = typename CppTypeTraits<field_type_i>::CppType; |
| using U = typename CppTypeTraits<field_type_j>::CppType; |
| size_t value_size_i; |
| in.read(reinterpret_cast<char*>(&value_size_i), sizeof(value_size_i)); |
| T original_value_i; |
| in.read(reinterpret_cast<char*>(&original_value_i), value_size_i); |
| |
| size_t value_size_j; |
| in.read(reinterpret_cast<char*>(&value_size_j), sizeof(value_size_j)); |
| U original_value_j; |
| in.read(reinterpret_cast<char*>(&original_value_j), value_size_j); |
| |
| auto coder_i = get_key_coder(field_type_i); |
| auto coder_j = get_key_coder(field_type_j); |
| EXPECT_NE(coder_i, nullptr); |
| EXPECT_NE(coder_j, nullptr); |
| |
| std::string encoded_buf_i; |
| coder_i->full_encode_ascending(&original_value_i, &encoded_buf_i); |
| std::string encoded_buf_j; |
| coder_j->full_encode_ascending(&original_value_j, &encoded_buf_j); |
| |
| std::string encoded_buf_i_str = ReadEncodedStringFromComplexFile(in); |
| std::string encoded_buf_j_str = ReadEncodedStringFromComplexFile(in); |
| EXPECT_EQ(encoded_buf_i_str, encoded_buf_i); |
| EXPECT_EQ(encoded_buf_j_str, encoded_buf_j); |
| |
| T decoded_value_i; |
| Slice encoded_buf_i_str_slice(encoded_buf_i_str); |
| auto status = |
| coder_i->decode_ascending(&encoded_buf_i_str_slice, 0, (uint8_t*)&decoded_value_i); |
| EXPECT_TRUE(status.ok()); |
| EXPECT_EQ(decoded_value_i, original_value_i); |
| |
| U decoded_value_j; |
| Slice encoded_buf_j_str_slice(encoded_buf_j_str); |
| status = coder_j->decode_ascending(&encoded_buf_j_str_slice, 0, (uint8_t*)&decoded_value_j); |
| EXPECT_TRUE(status.ok()); |
| EXPECT_EQ(decoded_value_j, original_value_j); |
| } |
| } |
| |
| void ReadAndDecodeFromComplexFile(std::ifstream& in, FieldType field_type_i, |
| FieldType field_type_j) { |
| #define HANDLE_COMBINATION(TYPE1, TYPE2) \ |
| if (field_type_i == FieldType::OLAP_FIELD_TYPE_##TYPE1 && \ |
| field_type_j == FieldType::OLAP_FIELD_TYPE_##TYPE2) { \ |
| ReadAndDecodeFromComplexFile<FieldType::OLAP_FIELD_TYPE_##TYPE1, \ |
| FieldType::OLAP_FIELD_TYPE_##TYPE2>(in); \ |
| return; \ |
| } |
| |
| HANDLE_COMBINATION(TINYINT, TINYINT) |
| HANDLE_COMBINATION(TINYINT, SMALLINT) |
| HANDLE_COMBINATION(TINYINT, INT) |
| HANDLE_COMBINATION(TINYINT, UNSIGNED_INT) |
| HANDLE_COMBINATION(TINYINT, BIGINT) |
| HANDLE_COMBINATION(TINYINT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(TINYINT, LARGEINT) |
| HANDLE_COMBINATION(TINYINT, BOOL) |
| HANDLE_COMBINATION(TINYINT, DATE) |
| HANDLE_COMBINATION(TINYINT, DATEV2) |
| HANDLE_COMBINATION(TINYINT, DATETIME) |
| HANDLE_COMBINATION(TINYINT, DATETIMEV2) |
| HANDLE_COMBINATION(TINYINT, DECIMAL) |
| HANDLE_COMBINATION(TINYINT, DECIMAL32) |
| HANDLE_COMBINATION(TINYINT, DECIMAL64) |
| HANDLE_COMBINATION(TINYINT, DECIMAL128I) |
| HANDLE_COMBINATION(TINYINT, DECIMAL256) |
| HANDLE_COMBINATION(TINYINT, IPV4) |
| HANDLE_COMBINATION(TINYINT, IPV6) |
| HANDLE_COMBINATION(TINYINT, CHAR) |
| HANDLE_COMBINATION(TINYINT, VARCHAR) |
| HANDLE_COMBINATION(TINYINT, STRING) |
| HANDLE_COMBINATION(TINYINT, FLOAT) |
| HANDLE_COMBINATION(TINYINT, DOUBLE) |
| |
| HANDLE_COMBINATION(SMALLINT, TINYINT) |
| HANDLE_COMBINATION(SMALLINT, SMALLINT) |
| HANDLE_COMBINATION(SMALLINT, INT) |
| HANDLE_COMBINATION(SMALLINT, UNSIGNED_INT) |
| HANDLE_COMBINATION(SMALLINT, BIGINT) |
| HANDLE_COMBINATION(SMALLINT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(SMALLINT, LARGEINT) |
| HANDLE_COMBINATION(SMALLINT, BOOL) |
| HANDLE_COMBINATION(SMALLINT, DATE) |
| HANDLE_COMBINATION(SMALLINT, DATEV2) |
| HANDLE_COMBINATION(SMALLINT, DATETIME) |
| HANDLE_COMBINATION(SMALLINT, DATETIMEV2) |
| HANDLE_COMBINATION(SMALLINT, DECIMAL) |
| HANDLE_COMBINATION(SMALLINT, DECIMAL32) |
| HANDLE_COMBINATION(SMALLINT, DECIMAL64) |
| HANDLE_COMBINATION(SMALLINT, DECIMAL128I) |
| HANDLE_COMBINATION(SMALLINT, DECIMAL256) |
| HANDLE_COMBINATION(SMALLINT, IPV4) |
| HANDLE_COMBINATION(SMALLINT, IPV6) |
| HANDLE_COMBINATION(SMALLINT, CHAR) |
| HANDLE_COMBINATION(SMALLINT, VARCHAR) |
| HANDLE_COMBINATION(SMALLINT, STRING) |
| HANDLE_COMBINATION(SMALLINT, FLOAT) |
| HANDLE_COMBINATION(SMALLINT, DOUBLE) |
| |
| HANDLE_COMBINATION(INT, TINYINT) |
| HANDLE_COMBINATION(INT, SMALLINT) |
| HANDLE_COMBINATION(INT, INT) |
| HANDLE_COMBINATION(INT, UNSIGNED_INT) |
| HANDLE_COMBINATION(INT, BIGINT) |
| HANDLE_COMBINATION(INT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(INT, LARGEINT) |
| HANDLE_COMBINATION(INT, BOOL) |
| HANDLE_COMBINATION(INT, DATE) |
| HANDLE_COMBINATION(INT, DATEV2) |
| HANDLE_COMBINATION(INT, DATETIME) |
| HANDLE_COMBINATION(INT, DATETIMEV2) |
| HANDLE_COMBINATION(INT, DECIMAL) |
| HANDLE_COMBINATION(INT, DECIMAL32) |
| HANDLE_COMBINATION(INT, DECIMAL64) |
| HANDLE_COMBINATION(INT, DECIMAL128I) |
| HANDLE_COMBINATION(INT, DECIMAL256) |
| HANDLE_COMBINATION(INT, IPV4) |
| HANDLE_COMBINATION(INT, IPV6) |
| HANDLE_COMBINATION(INT, CHAR) |
| HANDLE_COMBINATION(INT, VARCHAR) |
| HANDLE_COMBINATION(INT, STRING) |
| HANDLE_COMBINATION(INT, FLOAT) |
| HANDLE_COMBINATION(INT, DOUBLE) |
| |
| HANDLE_COMBINATION(UNSIGNED_INT, TINYINT) |
| HANDLE_COMBINATION(UNSIGNED_INT, SMALLINT) |
| HANDLE_COMBINATION(UNSIGNED_INT, INT) |
| HANDLE_COMBINATION(UNSIGNED_INT, UNSIGNED_INT) |
| HANDLE_COMBINATION(UNSIGNED_INT, BIGINT) |
| HANDLE_COMBINATION(UNSIGNED_INT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(UNSIGNED_INT, LARGEINT) |
| HANDLE_COMBINATION(UNSIGNED_INT, BOOL) |
| HANDLE_COMBINATION(UNSIGNED_INT, DATE) |
| HANDLE_COMBINATION(UNSIGNED_INT, DATEV2) |
| HANDLE_COMBINATION(UNSIGNED_INT, DATETIME) |
| HANDLE_COMBINATION(UNSIGNED_INT, DATETIMEV2) |
| HANDLE_COMBINATION(UNSIGNED_INT, DECIMAL) |
| HANDLE_COMBINATION(UNSIGNED_INT, DECIMAL32) |
| HANDLE_COMBINATION(UNSIGNED_INT, DECIMAL64) |
| HANDLE_COMBINATION(UNSIGNED_INT, DECIMAL128I) |
| HANDLE_COMBINATION(UNSIGNED_INT, DECIMAL256) |
| HANDLE_COMBINATION(UNSIGNED_INT, IPV4) |
| HANDLE_COMBINATION(UNSIGNED_INT, IPV6) |
| HANDLE_COMBINATION(UNSIGNED_INT, CHAR) |
| HANDLE_COMBINATION(UNSIGNED_INT, VARCHAR) |
| HANDLE_COMBINATION(UNSIGNED_INT, STRING) |
| HANDLE_COMBINATION(UNSIGNED_INT, FLOAT) |
| HANDLE_COMBINATION(UNSIGNED_INT, DOUBLE) |
| |
| HANDLE_COMBINATION(BIGINT, TINYINT) |
| HANDLE_COMBINATION(BIGINT, SMALLINT) |
| HANDLE_COMBINATION(BIGINT, INT) |
| HANDLE_COMBINATION(BIGINT, UNSIGNED_INT) |
| HANDLE_COMBINATION(BIGINT, BIGINT) |
| HANDLE_COMBINATION(BIGINT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(BIGINT, LARGEINT) |
| HANDLE_COMBINATION(BIGINT, BOOL) |
| HANDLE_COMBINATION(BIGINT, DATE) |
| HANDLE_COMBINATION(BIGINT, DATEV2) |
| HANDLE_COMBINATION(BIGINT, DATETIME) |
| HANDLE_COMBINATION(BIGINT, DATETIMEV2) |
| HANDLE_COMBINATION(BIGINT, DECIMAL) |
| HANDLE_COMBINATION(BIGINT, DECIMAL32) |
| HANDLE_COMBINATION(BIGINT, DECIMAL64) |
| HANDLE_COMBINATION(BIGINT, DECIMAL128I) |
| HANDLE_COMBINATION(BIGINT, DECIMAL256) |
| HANDLE_COMBINATION(BIGINT, IPV4) |
| HANDLE_COMBINATION(BIGINT, IPV6) |
| HANDLE_COMBINATION(BIGINT, CHAR) |
| HANDLE_COMBINATION(BIGINT, VARCHAR) |
| HANDLE_COMBINATION(BIGINT, STRING) |
| HANDLE_COMBINATION(BIGINT, FLOAT) |
| HANDLE_COMBINATION(BIGINT, DOUBLE) |
| |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, TINYINT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, SMALLINT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, INT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, UNSIGNED_INT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, BIGINT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, LARGEINT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, BOOL) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DATE) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DATEV2) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DATETIME) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DATETIMEV2) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DECIMAL) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DECIMAL32) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DECIMAL64) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DECIMAL128I) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DECIMAL256) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, IPV4) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, IPV6) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, CHAR) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, VARCHAR) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, STRING) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, FLOAT) |
| HANDLE_COMBINATION(UNSIGNED_BIGINT, DOUBLE) |
| |
| HANDLE_COMBINATION(LARGEINT, TINYINT) |
| HANDLE_COMBINATION(LARGEINT, SMALLINT) |
| HANDLE_COMBINATION(LARGEINT, INT) |
| HANDLE_COMBINATION(LARGEINT, UNSIGNED_INT) |
| HANDLE_COMBINATION(LARGEINT, BIGINT) |
| HANDLE_COMBINATION(LARGEINT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(LARGEINT, LARGEINT) |
| HANDLE_COMBINATION(LARGEINT, BOOL) |
| HANDLE_COMBINATION(LARGEINT, DATE) |
| HANDLE_COMBINATION(LARGEINT, DATEV2) |
| HANDLE_COMBINATION(LARGEINT, DATETIME) |
| HANDLE_COMBINATION(LARGEINT, DATETIMEV2) |
| HANDLE_COMBINATION(LARGEINT, DECIMAL) |
| HANDLE_COMBINATION(LARGEINT, DECIMAL32) |
| HANDLE_COMBINATION(LARGEINT, DECIMAL64) |
| HANDLE_COMBINATION(LARGEINT, DECIMAL128I) |
| HANDLE_COMBINATION(LARGEINT, DECIMAL256) |
| HANDLE_COMBINATION(LARGEINT, IPV4) |
| HANDLE_COMBINATION(LARGEINT, IPV6) |
| HANDLE_COMBINATION(LARGEINT, CHAR) |
| HANDLE_COMBINATION(LARGEINT, VARCHAR) |
| HANDLE_COMBINATION(LARGEINT, STRING) |
| HANDLE_COMBINATION(LARGEINT, FLOAT) |
| HANDLE_COMBINATION(LARGEINT, DOUBLE) |
| |
| HANDLE_COMBINATION(BOOL, TINYINT) |
| HANDLE_COMBINATION(BOOL, SMALLINT) |
| HANDLE_COMBINATION(BOOL, INT) |
| HANDLE_COMBINATION(BOOL, UNSIGNED_INT) |
| HANDLE_COMBINATION(BOOL, BIGINT) |
| HANDLE_COMBINATION(BOOL, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(BOOL, LARGEINT) |
| HANDLE_COMBINATION(BOOL, BOOL) |
| HANDLE_COMBINATION(BOOL, DATE) |
| HANDLE_COMBINATION(BOOL, DATEV2) |
| HANDLE_COMBINATION(BOOL, DATETIME) |
| HANDLE_COMBINATION(BOOL, DATETIMEV2) |
| HANDLE_COMBINATION(BOOL, DECIMAL) |
| HANDLE_COMBINATION(BOOL, DECIMAL32) |
| HANDLE_COMBINATION(BOOL, DECIMAL64) |
| HANDLE_COMBINATION(BOOL, DECIMAL128I) |
| HANDLE_COMBINATION(BOOL, DECIMAL256) |
| HANDLE_COMBINATION(BOOL, IPV4) |
| HANDLE_COMBINATION(BOOL, IPV6) |
| HANDLE_COMBINATION(BOOL, CHAR) |
| HANDLE_COMBINATION(BOOL, VARCHAR) |
| HANDLE_COMBINATION(BOOL, STRING) |
| HANDLE_COMBINATION(BOOL, FLOAT) |
| HANDLE_COMBINATION(BOOL, DOUBLE) |
| |
| HANDLE_COMBINATION(DATE, TINYINT) |
| HANDLE_COMBINATION(DATE, SMALLINT) |
| HANDLE_COMBINATION(DATE, INT) |
| HANDLE_COMBINATION(DATE, UNSIGNED_INT) |
| HANDLE_COMBINATION(DATE, BIGINT) |
| HANDLE_COMBINATION(DATE, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DATE, LARGEINT) |
| HANDLE_COMBINATION(DATE, BOOL) |
| HANDLE_COMBINATION(DATE, DATE) |
| HANDLE_COMBINATION(DATE, DATEV2) |
| HANDLE_COMBINATION(DATE, DATETIME) |
| HANDLE_COMBINATION(DATE, DATETIMEV2) |
| HANDLE_COMBINATION(DATE, DECIMAL) |
| HANDLE_COMBINATION(DATE, DECIMAL32) |
| HANDLE_COMBINATION(DATE, DECIMAL64) |
| HANDLE_COMBINATION(DATE, DECIMAL128I) |
| HANDLE_COMBINATION(DATE, DECIMAL256) |
| HANDLE_COMBINATION(DATE, IPV4) |
| HANDLE_COMBINATION(DATE, IPV6) |
| HANDLE_COMBINATION(DATE, CHAR) |
| HANDLE_COMBINATION(DATE, VARCHAR) |
| HANDLE_COMBINATION(DATE, STRING) |
| HANDLE_COMBINATION(DATE, FLOAT) |
| HANDLE_COMBINATION(DATE, DOUBLE) |
| |
| HANDLE_COMBINATION(DATEV2, TINYINT) |
| HANDLE_COMBINATION(DATEV2, SMALLINT) |
| HANDLE_COMBINATION(DATEV2, INT) |
| HANDLE_COMBINATION(DATEV2, UNSIGNED_INT) |
| HANDLE_COMBINATION(DATEV2, BIGINT) |
| HANDLE_COMBINATION(DATEV2, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DATEV2, LARGEINT) |
| HANDLE_COMBINATION(DATEV2, BOOL) |
| HANDLE_COMBINATION(DATEV2, DATE) |
| HANDLE_COMBINATION(DATEV2, DATEV2) |
| HANDLE_COMBINATION(DATEV2, DATETIME) |
| HANDLE_COMBINATION(DATEV2, DATETIMEV2) |
| HANDLE_COMBINATION(DATEV2, DECIMAL) |
| HANDLE_COMBINATION(DATEV2, DECIMAL32) |
| HANDLE_COMBINATION(DATEV2, DECIMAL64) |
| HANDLE_COMBINATION(DATEV2, DECIMAL128I) |
| HANDLE_COMBINATION(DATEV2, DECIMAL256) |
| HANDLE_COMBINATION(DATEV2, IPV4) |
| HANDLE_COMBINATION(DATEV2, IPV6) |
| HANDLE_COMBINATION(DATEV2, CHAR) |
| HANDLE_COMBINATION(DATEV2, VARCHAR) |
| HANDLE_COMBINATION(DATEV2, STRING) |
| HANDLE_COMBINATION(DATEV2, FLOAT) |
| HANDLE_COMBINATION(DATEV2, DOUBLE) |
| |
| HANDLE_COMBINATION(DATETIME, TINYINT) |
| HANDLE_COMBINATION(DATETIME, SMALLINT) |
| HANDLE_COMBINATION(DATETIME, INT) |
| HANDLE_COMBINATION(DATETIME, UNSIGNED_INT) |
| HANDLE_COMBINATION(DATETIME, BIGINT) |
| HANDLE_COMBINATION(DATETIME, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DATETIME, LARGEINT) |
| HANDLE_COMBINATION(DATETIME, BOOL) |
| HANDLE_COMBINATION(DATETIME, DATE) |
| HANDLE_COMBINATION(DATETIME, DATEV2) |
| HANDLE_COMBINATION(DATETIME, DATETIME) |
| HANDLE_COMBINATION(DATETIME, DATETIMEV2) |
| HANDLE_COMBINATION(DATETIME, DECIMAL) |
| HANDLE_COMBINATION(DATETIME, DECIMAL32) |
| HANDLE_COMBINATION(DATETIME, DECIMAL64) |
| HANDLE_COMBINATION(DATETIME, DECIMAL128I) |
| HANDLE_COMBINATION(DATETIME, DECIMAL256) |
| HANDLE_COMBINATION(DATETIME, IPV4) |
| HANDLE_COMBINATION(DATETIME, IPV6) |
| HANDLE_COMBINATION(DATETIME, CHAR) |
| HANDLE_COMBINATION(DATETIME, VARCHAR) |
| HANDLE_COMBINATION(DATETIME, STRING) |
| HANDLE_COMBINATION(DATETIME, FLOAT) |
| HANDLE_COMBINATION(DATETIME, DOUBLE) |
| |
| HANDLE_COMBINATION(DATETIMEV2, TINYINT) |
| HANDLE_COMBINATION(DATETIMEV2, SMALLINT) |
| HANDLE_COMBINATION(DATETIMEV2, INT) |
| HANDLE_COMBINATION(DATETIMEV2, UNSIGNED_INT) |
| HANDLE_COMBINATION(DATETIMEV2, BIGINT) |
| HANDLE_COMBINATION(DATETIMEV2, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DATETIMEV2, LARGEINT) |
| HANDLE_COMBINATION(DATETIMEV2, BOOL) |
| HANDLE_COMBINATION(DATETIMEV2, DATE) |
| HANDLE_COMBINATION(DATETIMEV2, DATEV2) |
| HANDLE_COMBINATION(DATETIMEV2, DATETIME) |
| HANDLE_COMBINATION(DATETIMEV2, DATETIMEV2) |
| HANDLE_COMBINATION(DATETIMEV2, DECIMAL) |
| HANDLE_COMBINATION(DATETIMEV2, DECIMAL32) |
| HANDLE_COMBINATION(DATETIMEV2, DECIMAL64) |
| HANDLE_COMBINATION(DATETIMEV2, DECIMAL128I) |
| HANDLE_COMBINATION(DATETIMEV2, DECIMAL256) |
| HANDLE_COMBINATION(DATETIMEV2, IPV4) |
| HANDLE_COMBINATION(DATETIMEV2, IPV6) |
| HANDLE_COMBINATION(DATETIMEV2, CHAR) |
| HANDLE_COMBINATION(DATETIMEV2, VARCHAR) |
| HANDLE_COMBINATION(DATETIMEV2, STRING) |
| HANDLE_COMBINATION(DATETIMEV2, FLOAT) |
| HANDLE_COMBINATION(DATETIMEV2, DOUBLE) |
| |
| HANDLE_COMBINATION(DECIMAL, TINYINT) |
| HANDLE_COMBINATION(DECIMAL, SMALLINT) |
| HANDLE_COMBINATION(DECIMAL, INT) |
| HANDLE_COMBINATION(DECIMAL, UNSIGNED_INT) |
| HANDLE_COMBINATION(DECIMAL, BIGINT) |
| HANDLE_COMBINATION(DECIMAL, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DECIMAL, LARGEINT) |
| HANDLE_COMBINATION(DECIMAL, BOOL) |
| HANDLE_COMBINATION(DECIMAL, DATE) |
| HANDLE_COMBINATION(DECIMAL, DATEV2) |
| HANDLE_COMBINATION(DECIMAL, DATETIME) |
| HANDLE_COMBINATION(DECIMAL, DATETIMEV2) |
| HANDLE_COMBINATION(DECIMAL, DECIMAL) |
| HANDLE_COMBINATION(DECIMAL, DECIMAL32) |
| HANDLE_COMBINATION(DECIMAL, DECIMAL64) |
| HANDLE_COMBINATION(DECIMAL, DECIMAL128I) |
| HANDLE_COMBINATION(DECIMAL, DECIMAL256) |
| HANDLE_COMBINATION(DECIMAL, IPV4) |
| HANDLE_COMBINATION(DECIMAL, IPV6) |
| HANDLE_COMBINATION(DECIMAL, CHAR) |
| HANDLE_COMBINATION(DECIMAL, VARCHAR) |
| HANDLE_COMBINATION(DECIMAL, STRING) |
| HANDLE_COMBINATION(DECIMAL, FLOAT) |
| HANDLE_COMBINATION(DECIMAL, DOUBLE) |
| |
| HANDLE_COMBINATION(DECIMAL32, TINYINT) |
| HANDLE_COMBINATION(DECIMAL32, SMALLINT) |
| HANDLE_COMBINATION(DECIMAL32, INT) |
| HANDLE_COMBINATION(DECIMAL32, UNSIGNED_INT) |
| HANDLE_COMBINATION(DECIMAL32, BIGINT) |
| HANDLE_COMBINATION(DECIMAL32, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DECIMAL32, LARGEINT) |
| HANDLE_COMBINATION(DECIMAL32, BOOL) |
| HANDLE_COMBINATION(DECIMAL32, DATE) |
| HANDLE_COMBINATION(DECIMAL32, DATEV2) |
| HANDLE_COMBINATION(DECIMAL32, DATETIME) |
| HANDLE_COMBINATION(DECIMAL32, DATETIMEV2) |
| HANDLE_COMBINATION(DECIMAL32, DECIMAL) |
| HANDLE_COMBINATION(DECIMAL32, DECIMAL32) |
| HANDLE_COMBINATION(DECIMAL32, DECIMAL64) |
| HANDLE_COMBINATION(DECIMAL32, DECIMAL128I) |
| HANDLE_COMBINATION(DECIMAL32, DECIMAL256) |
| HANDLE_COMBINATION(DECIMAL32, IPV4) |
| HANDLE_COMBINATION(DECIMAL32, IPV6) |
| HANDLE_COMBINATION(DECIMAL32, CHAR) |
| HANDLE_COMBINATION(DECIMAL32, VARCHAR) |
| HANDLE_COMBINATION(DECIMAL32, STRING) |
| HANDLE_COMBINATION(DECIMAL32, FLOAT) |
| HANDLE_COMBINATION(DECIMAL32, DOUBLE) |
| |
| HANDLE_COMBINATION(DECIMAL64, TINYINT) |
| HANDLE_COMBINATION(DECIMAL64, SMALLINT) |
| HANDLE_COMBINATION(DECIMAL64, INT) |
| HANDLE_COMBINATION(DECIMAL64, UNSIGNED_INT) |
| HANDLE_COMBINATION(DECIMAL64, BIGINT) |
| HANDLE_COMBINATION(DECIMAL64, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DECIMAL64, LARGEINT) |
| HANDLE_COMBINATION(DECIMAL64, BOOL) |
| HANDLE_COMBINATION(DECIMAL64, DATE) |
| HANDLE_COMBINATION(DECIMAL64, DATEV2) |
| HANDLE_COMBINATION(DECIMAL64, DATETIME) |
| HANDLE_COMBINATION(DECIMAL64, DATETIMEV2) |
| HANDLE_COMBINATION(DECIMAL64, DECIMAL) |
| HANDLE_COMBINATION(DECIMAL64, DECIMAL32) |
| HANDLE_COMBINATION(DECIMAL64, DECIMAL64) |
| HANDLE_COMBINATION(DECIMAL64, DECIMAL128I) |
| HANDLE_COMBINATION(DECIMAL64, DECIMAL256) |
| HANDLE_COMBINATION(DECIMAL64, IPV4) |
| HANDLE_COMBINATION(DECIMAL64, IPV6) |
| HANDLE_COMBINATION(DECIMAL64, CHAR) |
| HANDLE_COMBINATION(DECIMAL64, VARCHAR) |
| HANDLE_COMBINATION(DECIMAL64, STRING) |
| HANDLE_COMBINATION(DECIMAL64, FLOAT) |
| HANDLE_COMBINATION(DECIMAL64, DOUBLE) |
| |
| HANDLE_COMBINATION(DECIMAL128I, TINYINT) |
| HANDLE_COMBINATION(DECIMAL128I, SMALLINT) |
| HANDLE_COMBINATION(DECIMAL128I, INT) |
| HANDLE_COMBINATION(DECIMAL128I, UNSIGNED_INT) |
| HANDLE_COMBINATION(DECIMAL128I, BIGINT) |
| HANDLE_COMBINATION(DECIMAL128I, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DECIMAL128I, LARGEINT) |
| HANDLE_COMBINATION(DECIMAL128I, BOOL) |
| HANDLE_COMBINATION(DECIMAL128I, DATE) |
| HANDLE_COMBINATION(DECIMAL128I, DATEV2) |
| HANDLE_COMBINATION(DECIMAL128I, DATETIME) |
| HANDLE_COMBINATION(DECIMAL128I, DATETIMEV2) |
| HANDLE_COMBINATION(DECIMAL128I, DECIMAL) |
| HANDLE_COMBINATION(DECIMAL128I, DECIMAL32) |
| HANDLE_COMBINATION(DECIMAL128I, DECIMAL64) |
| HANDLE_COMBINATION(DECIMAL128I, DECIMAL128I) |
| HANDLE_COMBINATION(DECIMAL128I, DECIMAL256) |
| HANDLE_COMBINATION(DECIMAL128I, IPV4) |
| HANDLE_COMBINATION(DECIMAL128I, IPV6) |
| HANDLE_COMBINATION(DECIMAL128I, CHAR) |
| HANDLE_COMBINATION(DECIMAL128I, VARCHAR) |
| HANDLE_COMBINATION(DECIMAL128I, STRING) |
| HANDLE_COMBINATION(DECIMAL128I, FLOAT) |
| HANDLE_COMBINATION(DECIMAL128I, DOUBLE) |
| |
| HANDLE_COMBINATION(DECIMAL256, TINYINT) |
| HANDLE_COMBINATION(DECIMAL256, SMALLINT) |
| HANDLE_COMBINATION(DECIMAL256, INT) |
| HANDLE_COMBINATION(DECIMAL256, UNSIGNED_INT) |
| HANDLE_COMBINATION(DECIMAL256, BIGINT) |
| HANDLE_COMBINATION(DECIMAL256, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DECIMAL256, LARGEINT) |
| HANDLE_COMBINATION(DECIMAL256, BOOL) |
| HANDLE_COMBINATION(DECIMAL256, DATE) |
| HANDLE_COMBINATION(DECIMAL256, DATEV2) |
| HANDLE_COMBINATION(DECIMAL256, DATETIME) |
| HANDLE_COMBINATION(DECIMAL256, DATETIMEV2) |
| HANDLE_COMBINATION(DECIMAL256, DECIMAL) |
| HANDLE_COMBINATION(DECIMAL256, DECIMAL32) |
| HANDLE_COMBINATION(DECIMAL256, DECIMAL64) |
| HANDLE_COMBINATION(DECIMAL256, DECIMAL128I) |
| HANDLE_COMBINATION(DECIMAL256, DECIMAL256) |
| HANDLE_COMBINATION(DECIMAL256, IPV4) |
| HANDLE_COMBINATION(DECIMAL256, IPV6) |
| HANDLE_COMBINATION(DECIMAL256, CHAR) |
| HANDLE_COMBINATION(DECIMAL256, VARCHAR) |
| HANDLE_COMBINATION(DECIMAL256, STRING) |
| HANDLE_COMBINATION(DECIMAL256, FLOAT) |
| HANDLE_COMBINATION(DECIMAL256, DOUBLE) |
| |
| HANDLE_COMBINATION(IPV4, TINYINT) |
| HANDLE_COMBINATION(IPV4, SMALLINT) |
| HANDLE_COMBINATION(IPV4, INT) |
| HANDLE_COMBINATION(IPV4, UNSIGNED_INT) |
| HANDLE_COMBINATION(IPV4, BIGINT) |
| HANDLE_COMBINATION(IPV4, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(IPV4, LARGEINT) |
| HANDLE_COMBINATION(IPV4, BOOL) |
| HANDLE_COMBINATION(IPV4, DATE) |
| HANDLE_COMBINATION(IPV4, DATEV2) |
| HANDLE_COMBINATION(IPV4, DATETIME) |
| HANDLE_COMBINATION(IPV4, DATETIMEV2) |
| HANDLE_COMBINATION(IPV4, DECIMAL) |
| HANDLE_COMBINATION(IPV4, DECIMAL32) |
| HANDLE_COMBINATION(IPV4, DECIMAL64) |
| HANDLE_COMBINATION(IPV4, DECIMAL128I) |
| HANDLE_COMBINATION(IPV4, DECIMAL256) |
| HANDLE_COMBINATION(IPV4, IPV4) |
| HANDLE_COMBINATION(IPV4, IPV6) |
| HANDLE_COMBINATION(IPV4, CHAR) |
| HANDLE_COMBINATION(IPV4, VARCHAR) |
| HANDLE_COMBINATION(IPV4, STRING) |
| HANDLE_COMBINATION(IPV4, FLOAT) |
| HANDLE_COMBINATION(IPV4, DOUBLE) |
| |
| HANDLE_COMBINATION(IPV6, TINYINT) |
| HANDLE_COMBINATION(IPV6, SMALLINT) |
| HANDLE_COMBINATION(IPV6, INT) |
| HANDLE_COMBINATION(IPV6, UNSIGNED_INT) |
| HANDLE_COMBINATION(IPV6, BIGINT) |
| HANDLE_COMBINATION(IPV6, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(IPV6, LARGEINT) |
| HANDLE_COMBINATION(IPV6, BOOL) |
| HANDLE_COMBINATION(IPV6, DATE) |
| HANDLE_COMBINATION(IPV6, DATEV2) |
| HANDLE_COMBINATION(IPV6, DATETIME) |
| HANDLE_COMBINATION(IPV6, DATETIMEV2) |
| HANDLE_COMBINATION(IPV6, DECIMAL) |
| HANDLE_COMBINATION(IPV6, DECIMAL32) |
| HANDLE_COMBINATION(IPV6, DECIMAL64) |
| HANDLE_COMBINATION(IPV6, DECIMAL128I) |
| HANDLE_COMBINATION(IPV6, DECIMAL256) |
| HANDLE_COMBINATION(IPV6, IPV4) |
| HANDLE_COMBINATION(IPV6, IPV6) |
| HANDLE_COMBINATION(IPV6, CHAR) |
| HANDLE_COMBINATION(IPV6, VARCHAR) |
| HANDLE_COMBINATION(IPV6, STRING) |
| HANDLE_COMBINATION(IPV6, FLOAT) |
| HANDLE_COMBINATION(IPV6, DOUBLE) |
| |
| HANDLE_COMBINATION(CHAR, TINYINT) |
| HANDLE_COMBINATION(CHAR, SMALLINT) |
| HANDLE_COMBINATION(CHAR, INT) |
| HANDLE_COMBINATION(CHAR, UNSIGNED_INT) |
| HANDLE_COMBINATION(CHAR, BIGINT) |
| HANDLE_COMBINATION(CHAR, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(CHAR, LARGEINT) |
| HANDLE_COMBINATION(CHAR, BOOL) |
| HANDLE_COMBINATION(CHAR, DATE) |
| HANDLE_COMBINATION(CHAR, DATEV2) |
| HANDLE_COMBINATION(CHAR, DATETIME) |
| HANDLE_COMBINATION(CHAR, DATETIMEV2) |
| HANDLE_COMBINATION(CHAR, DECIMAL) |
| HANDLE_COMBINATION(CHAR, DECIMAL32) |
| HANDLE_COMBINATION(CHAR, DECIMAL64) |
| HANDLE_COMBINATION(CHAR, DECIMAL128I) |
| HANDLE_COMBINATION(CHAR, DECIMAL256) |
| HANDLE_COMBINATION(CHAR, IPV4) |
| HANDLE_COMBINATION(CHAR, IPV6) |
| HANDLE_COMBINATION(CHAR, CHAR) |
| HANDLE_COMBINATION(CHAR, VARCHAR) |
| HANDLE_COMBINATION(CHAR, STRING) |
| HANDLE_COMBINATION(CHAR, FLOAT) |
| HANDLE_COMBINATION(CHAR, DOUBLE) |
| |
| HANDLE_COMBINATION(VARCHAR, TINYINT) |
| HANDLE_COMBINATION(VARCHAR, SMALLINT) |
| HANDLE_COMBINATION(VARCHAR, INT) |
| HANDLE_COMBINATION(VARCHAR, UNSIGNED_INT) |
| HANDLE_COMBINATION(VARCHAR, BIGINT) |
| HANDLE_COMBINATION(VARCHAR, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(VARCHAR, LARGEINT) |
| HANDLE_COMBINATION(VARCHAR, BOOL) |
| HANDLE_COMBINATION(VARCHAR, DATE) |
| HANDLE_COMBINATION(VARCHAR, DATEV2) |
| HANDLE_COMBINATION(VARCHAR, DATETIME) |
| HANDLE_COMBINATION(VARCHAR, DATETIMEV2) |
| HANDLE_COMBINATION(VARCHAR, DECIMAL) |
| HANDLE_COMBINATION(VARCHAR, DECIMAL32) |
| HANDLE_COMBINATION(VARCHAR, DECIMAL64) |
| HANDLE_COMBINATION(VARCHAR, DECIMAL128I) |
| HANDLE_COMBINATION(VARCHAR, DECIMAL256) |
| HANDLE_COMBINATION(VARCHAR, IPV4) |
| HANDLE_COMBINATION(VARCHAR, IPV6) |
| HANDLE_COMBINATION(VARCHAR, CHAR) |
| HANDLE_COMBINATION(VARCHAR, VARCHAR) |
| HANDLE_COMBINATION(VARCHAR, STRING) |
| HANDLE_COMBINATION(VARCHAR, FLOAT) |
| HANDLE_COMBINATION(VARCHAR, DOUBLE) |
| |
| HANDLE_COMBINATION(STRING, TINYINT) |
| HANDLE_COMBINATION(STRING, SMALLINT) |
| HANDLE_COMBINATION(STRING, INT) |
| HANDLE_COMBINATION(STRING, UNSIGNED_INT) |
| HANDLE_COMBINATION(STRING, BIGINT) |
| HANDLE_COMBINATION(STRING, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(STRING, LARGEINT) |
| HANDLE_COMBINATION(STRING, BOOL) |
| HANDLE_COMBINATION(STRING, DATE) |
| HANDLE_COMBINATION(STRING, DATEV2) |
| HANDLE_COMBINATION(STRING, DATETIME) |
| HANDLE_COMBINATION(STRING, DATETIMEV2) |
| HANDLE_COMBINATION(STRING, DECIMAL) |
| HANDLE_COMBINATION(STRING, DECIMAL32) |
| HANDLE_COMBINATION(STRING, DECIMAL64) |
| HANDLE_COMBINATION(STRING, DECIMAL128I) |
| HANDLE_COMBINATION(STRING, DECIMAL256) |
| HANDLE_COMBINATION(STRING, IPV4) |
| HANDLE_COMBINATION(STRING, IPV6) |
| HANDLE_COMBINATION(STRING, CHAR) |
| HANDLE_COMBINATION(STRING, VARCHAR) |
| HANDLE_COMBINATION(STRING, STRING) |
| HANDLE_COMBINATION(STRING, FLOAT) |
| HANDLE_COMBINATION(STRING, DOUBLE) |
| |
| HANDLE_COMBINATION(FLOAT, TINYINT) |
| HANDLE_COMBINATION(FLOAT, SMALLINT) |
| HANDLE_COMBINATION(FLOAT, INT) |
| HANDLE_COMBINATION(FLOAT, UNSIGNED_INT) |
| HANDLE_COMBINATION(FLOAT, BIGINT) |
| HANDLE_COMBINATION(FLOAT, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(FLOAT, LARGEINT) |
| HANDLE_COMBINATION(FLOAT, BOOL) |
| HANDLE_COMBINATION(FLOAT, DATE) |
| HANDLE_COMBINATION(FLOAT, DATEV2) |
| HANDLE_COMBINATION(FLOAT, DATETIME) |
| HANDLE_COMBINATION(FLOAT, DATETIMEV2) |
| HANDLE_COMBINATION(FLOAT, DECIMAL) |
| HANDLE_COMBINATION(FLOAT, DECIMAL32) |
| HANDLE_COMBINATION(FLOAT, DECIMAL64) |
| HANDLE_COMBINATION(FLOAT, DECIMAL128I) |
| HANDLE_COMBINATION(FLOAT, DECIMAL256) |
| HANDLE_COMBINATION(FLOAT, IPV4) |
| HANDLE_COMBINATION(FLOAT, IPV6) |
| HANDLE_COMBINATION(FLOAT, CHAR) |
| HANDLE_COMBINATION(FLOAT, VARCHAR) |
| HANDLE_COMBINATION(FLOAT, STRING) |
| HANDLE_COMBINATION(FLOAT, FLOAT) |
| HANDLE_COMBINATION(FLOAT, DOUBLE) |
| |
| HANDLE_COMBINATION(DOUBLE, TINYINT) |
| HANDLE_COMBINATION(DOUBLE, SMALLINT) |
| HANDLE_COMBINATION(DOUBLE, INT) |
| HANDLE_COMBINATION(DOUBLE, UNSIGNED_INT) |
| HANDLE_COMBINATION(DOUBLE, BIGINT) |
| HANDLE_COMBINATION(DOUBLE, UNSIGNED_BIGINT) |
| HANDLE_COMBINATION(DOUBLE, LARGEINT) |
| HANDLE_COMBINATION(DOUBLE, BOOL) |
| HANDLE_COMBINATION(DOUBLE, DATE) |
| HANDLE_COMBINATION(DOUBLE, DATEV2) |
| HANDLE_COMBINATION(DOUBLE, DATETIME) |
| HANDLE_COMBINATION(DOUBLE, DATETIMEV2) |
| HANDLE_COMBINATION(DOUBLE, DECIMAL) |
| HANDLE_COMBINATION(DOUBLE, DECIMAL32) |
| HANDLE_COMBINATION(DOUBLE, DECIMAL64) |
| HANDLE_COMBINATION(DOUBLE, DECIMAL128I) |
| HANDLE_COMBINATION(DOUBLE, DECIMAL256) |
| HANDLE_COMBINATION(DOUBLE, IPV4) |
| HANDLE_COMBINATION(DOUBLE, IPV6) |
| HANDLE_COMBINATION(DOUBLE, CHAR) |
| HANDLE_COMBINATION(DOUBLE, VARCHAR) |
| HANDLE_COMBINATION(DOUBLE, STRING) |
| HANDLE_COMBINATION(DOUBLE, FLOAT) |
| HANDLE_COMBINATION(DOUBLE, DOUBLE) |
| |
| #undef HANDLE_COMBINATION |
| |
| FAIL() << "Unsupported field type combination: " << static_cast<int>(field_type_i) << " and " |
| << static_cast<int>(field_type_j); |
| } |
| |
| TEST_F(KeyCoderTest, write_and_read_complex_filedtype) { |
| // std::ofstream out(complex_filename, std::ios::binary | std::ios::trunc); |
| // EXPECT_TRUE(out.is_open()) << "Failed to open file for writing: " << complex_filename; |
| |
| // std::vector<FieldType> field_types = { |
| // FieldType::OLAP_FIELD_TYPE_TINYINT, |
| // FieldType::OLAP_FIELD_TYPE_SMALLINT, |
| // FieldType::OLAP_FIELD_TYPE_INT, |
| // FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT, |
| // FieldType::OLAP_FIELD_TYPE_BIGINT, |
| // FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT, |
| // FieldType::OLAP_FIELD_TYPE_LARGEINT, |
| // FieldType::OLAP_FIELD_TYPE_BOOL, |
| // FieldType::OLAP_FIELD_TYPE_DATE, |
| // FieldType::OLAP_FIELD_TYPE_DATEV2, |
| // FieldType::OLAP_FIELD_TYPE_DATETIME, |
| // FieldType::OLAP_FIELD_TYPE_DATETIMEV2, |
| // FieldType::OLAP_FIELD_TYPE_DECIMAL, |
| // FieldType::OLAP_FIELD_TYPE_DECIMAL32, |
| // FieldType::OLAP_FIELD_TYPE_DECIMAL64, |
| // FieldType::OLAP_FIELD_TYPE_DECIMAL128I, |
| // FieldType::OLAP_FIELD_TYPE_DECIMAL256, |
| // FieldType::OLAP_FIELD_TYPE_IPV4, |
| // FieldType::OLAP_FIELD_TYPE_IPV6, |
| // FieldType::OLAP_FIELD_TYPE_CHAR, |
| // FieldType::OLAP_FIELD_TYPE_VARCHAR, |
| // FieldType::OLAP_FIELD_TYPE_STRING, |
| // FieldType::OLAP_FIELD_TYPE_FLOAT, |
| // FieldType::OLAP_FIELD_TYPE_DOUBLE |
| // }; |
| // for (int i = 0; i < field_types.size(); i++) { |
| // for (int j = 0; j < field_types.size(); j++) { |
| // const uint8_t field_type_value_i = static_cast<uint8_t>(field_types[i]); |
| // const uint8_t field_type_value_j = static_cast<uint8_t>(field_types[j]); |
| |
| // // 1. FieldType |
| // out.write(reinterpret_cast<const char*>(&field_type_value_i), sizeof(field_type_value_i)); |
| // out.write(reinterpret_cast<const char*>(&field_type_value_j), sizeof(field_type_value_j)); |
| |
| // // 2. original values |
| // WriteSingleValueToComplexFile(out, field_types[i]); |
| // WriteSingleValueToComplexFile(out, field_types[j]); |
| |
| // // 3. encoded values |
| // WriteSingleEncodedValueToComplexFile(out, field_types[i]); |
| // WriteSingleEncodedValueToComplexFile(out, field_types[j]); |
| // } |
| // } |
| // out.close(); |
| |
| std::ifstream in(complex_filename, std::ios::binary); |
| EXPECT_TRUE(in.is_open()) << "Failed to open file for reading: " << complex_filename; |
| while (in.peek() != EOF) { |
| // read first field |
| FieldType field_type_i; |
| uint8_t field_type_value_i; |
| in.read(reinterpret_cast<char*>(&field_type_value_i), sizeof(field_type_value_i)); |
| field_type_i = static_cast<FieldType>(field_type_value_i); |
| |
| // read second field |
| FieldType field_type_j; |
| uint8_t field_type_value_j; |
| in.read(reinterpret_cast<char*>(&field_type_value_j), sizeof(field_type_value_j)); |
| field_type_j = static_cast<FieldType>(field_type_value_j); |
| |
| ReadAndDecodeFromComplexFile(in, field_type_i, field_type_j); |
| } |
| in.close(); |
| } |
| } // namespace doris |