From 604a24c1a84c3f64ed05df3bfb2980fb81256fd9 Mon Sep 17 00:00:00 2001 From: Suzy Wang Date: Fri, 22 Sep 2023 16:29:47 -0300 Subject: [PATCH 1/2] ipv4 read fix --- src/Common/HashTable/Hash.h | 2 +- src/DataTypes/Serializations/SerializationIPv4andIPv6.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Common/HashTable/Hash.h b/src/Common/HashTable/Hash.h index c62be4fe2b81..90209891704d 100644 --- a/src/Common/HashTable/Hash.h +++ b/src/Common/HashTable/Hash.h @@ -310,7 +310,7 @@ requires (sizeof(T) <= sizeof(UInt64)) inline size_t hashCRC32(T key, DB::UInt64 updated_value = -1) { DB::UInt64 out {0}; - std::memcpy(&out, &key, sizeof(T)); + std::memcpy(reinterpret_cast(&out) + sizeof(UInt64) - sizeof(T), &key, sizeof(T)); return intHashCRC32(out, updated_value); } diff --git a/src/DataTypes/Serializations/SerializationIPv4andIPv6.h b/src/DataTypes/Serializations/SerializationIPv4andIPv6.h index 61464962f1c1..1289f82d1c41 100644 --- a/src/DataTypes/Serializations/SerializationIPv4andIPv6.h +++ b/src/DataTypes/Serializations/SerializationIPv4andIPv6.h @@ -86,12 +86,12 @@ class SerializationIP : public SimpleTextSerialization void serializeBinary(const Field & field, WriteBuffer & ostr, const FormatSettings &) const override { IPv x = field.get(); - writeBinary(x, ostr); + writeBinaryLittleEndian(x, ostr); } void deserializeBinary(Field & field, ReadBuffer & istr, const FormatSettings &) const override { IPv x; - readBinary(x.toUnderType(), istr); + readBinaryLittleEndian(x.toUnderType(), istr); field = NearestFieldType(x); } void serializeBinary(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override From 136fa4b00c1c5e5021016127bddb6f4f06f3858d Mon Sep 17 00:00:00 2001 From: Suzy Wang Date: Fri, 22 Sep 2023 16:41:49 -0300 Subject: [PATCH 2/2] big endian --- src/Common/HashTable/Hash.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Common/HashTable/Hash.h b/src/Common/HashTable/Hash.h index 90209891704d..6952e4bb1a57 100644 --- a/src/Common/HashTable/Hash.h +++ b/src/Common/HashTable/Hash.h @@ -310,7 +310,10 @@ requires (sizeof(T) <= sizeof(UInt64)) inline size_t hashCRC32(T key, DB::UInt64 updated_value = -1) { DB::UInt64 out {0}; - std::memcpy(reinterpret_cast(&out) + sizeof(UInt64) - sizeof(T), &key, sizeof(T)); + if constexpr (std::endian::native == std::endian::little) + std::memcpy(&out, &key, sizeof(T)); + else + std::memcpy(reinterpret_cast(&out) + sizeof(UInt64) - sizeof(T), &key, sizeof(T)); return intHashCRC32(out, updated_value); }