|
19 | 19 |
|
20 | 20 | #include "paimon/common/global_index/btree/key_serializer.h" |
21 | 21 |
|
| 22 | +#include <cstdint> |
| 23 | +#include <string> |
| 24 | + |
22 | 25 | #include "gtest/gtest.h" |
| 26 | +#include "paimon/common/utils/math.h" |
23 | 27 | #include "paimon/data/decimal.h" |
24 | 28 | #include "paimon/data/timestamp.h" |
25 | 29 | #include "paimon/testing/utils/testharness.h" |
@@ -208,6 +212,30 @@ TEST_F(KeySerializerTest, SerializeAndDeserializeAllTypes) { |
208 | 212 | } |
209 | 213 | } |
210 | 214 |
|
| 215 | +TEST_F(KeySerializerTest, CanonicalizesFloatingPointNaN) { |
| 216 | + const auto float_nan = FloatingPointFromBits<float>(0xffc12345U); |
| 217 | + const auto canonical_float_nan = FloatingPointFromBits<float>(kCanonicalFloatNaNBits); |
| 218 | + ASSERT_OK_AND_ASSIGN( |
| 219 | + std::shared_ptr<Bytes> float_bytes, |
| 220 | + KeySerializer::SerializeKey(Literal(float_nan), arrow::float32(), pool_.get())); |
| 221 | + ASSERT_OK_AND_ASSIGN( |
| 222 | + std::shared_ptr<Bytes> canonical_float_bytes, |
| 223 | + KeySerializer::SerializeKey(Literal(canonical_float_nan), arrow::float32(), pool_.get())); |
| 224 | + ASSERT_EQ(std::string(float_bytes->data(), float_bytes->size()), |
| 225 | + std::string(canonical_float_bytes->data(), canonical_float_bytes->size())); |
| 226 | + |
| 227 | + const auto double_nan = FloatingPointFromBits<double>(0xfff8123456789abcULL); |
| 228 | + const auto canonical_double_nan = FloatingPointFromBits<double>(kCanonicalDoubleNaNBits); |
| 229 | + ASSERT_OK_AND_ASSIGN( |
| 230 | + std::shared_ptr<Bytes> double_bytes, |
| 231 | + KeySerializer::SerializeKey(Literal(double_nan), arrow::float64(), pool_.get())); |
| 232 | + ASSERT_OK_AND_ASSIGN( |
| 233 | + std::shared_ptr<Bytes> canonical_double_bytes, |
| 234 | + KeySerializer::SerializeKey(Literal(canonical_double_nan), arrow::float64(), pool_.get())); |
| 235 | + ASSERT_EQ(std::string(double_bytes->data(), double_bytes->size()), |
| 236 | + std::string(canonical_double_bytes->data(), canonical_double_bytes->size())); |
| 237 | +} |
| 238 | + |
211 | 239 | TEST_F(KeySerializerTest, RejectsMalformedSerializedKeys) { |
212 | 240 | auto wrap = [this](const std::string& value) { |
213 | 241 | return MemorySlice::Wrap(std::make_shared<Bytes>(value, pool_.get())); |
|
0 commit comments