|
20 | 20 | #include "iceberg/schema_field.h" |
21 | 21 |
|
22 | 22 | #include <format> |
| 23 | +#include <limits> |
23 | 24 | #include <memory> |
24 | 25 |
|
25 | 26 | #include <gtest/gtest.h> |
26 | 27 |
|
27 | 28 | #include "iceberg/expression/literal.h" |
| 29 | +#include "iceberg/test/matchers.h" |
28 | 30 | #include "iceberg/type.h" |
29 | 31 | #include "iceberg/util/formatter.h" // IWYU pragma: keep |
30 | 32 |
|
@@ -170,4 +172,34 @@ TEST(SchemaFieldTest, CastDefaultValue) { |
170 | 172 | } |
171 | 173 | } |
172 | 174 |
|
| 175 | +TEST(SchemaFieldTest, ValidateRejectsNonFiniteFloatingDefault) { |
| 176 | + // NaN / infinity cannot be represented in JSON (the serializer emits `null`, which |
| 177 | + // reads back as an absent default), so a non-finite floating default must be rejected. |
| 178 | + SchemaField nan_field(/*field_id=*/1, /*name=*/"f", float32(), |
| 179 | + /*optional=*/true, /*doc=*/"", |
| 180 | + std::make_shared<const Literal>( |
| 181 | + Literal::Float(std::numeric_limits<float>::quiet_NaN()))); |
| 182 | + EXPECT_THAT(nan_field.Validate(), IsError(ErrorKind::kInvalidSchema)); |
| 183 | + EXPECT_THAT(nan_field.Validate(), HasErrorMessage("must be finite")); |
| 184 | + |
| 185 | + SchemaField inf_field(/*field_id=*/2, /*name=*/"d", float64(), |
| 186 | + /*optional=*/true, /*doc=*/"", |
| 187 | + std::make_shared<const Literal>( |
| 188 | + Literal::Double(std::numeric_limits<double>::infinity()))); |
| 189 | + EXPECT_THAT(inf_field.Validate(), IsError(ErrorKind::kInvalidSchema)); |
| 190 | + |
| 191 | + SchemaField neg_inf_field(/*field_id=*/3, /*name=*/"d2", float64(), |
| 192 | + /*optional=*/true, /*doc=*/"", |
| 193 | + std::make_shared<const Literal>(Literal::Double( |
| 194 | + -std::numeric_limits<double>::infinity()))); |
| 195 | + EXPECT_THAT(neg_inf_field.Validate(), IsError(ErrorKind::kInvalidSchema)); |
| 196 | +} |
| 197 | + |
| 198 | +TEST(SchemaFieldTest, ValidateAcceptsFiniteFloatingDefault) { |
| 199 | + SchemaField field(/*field_id=*/1, /*name=*/"f", float32(), |
| 200 | + /*optional=*/true, /*doc=*/"", |
| 201 | + std::make_shared<const Literal>(Literal::Float(1.5f))); |
| 202 | + EXPECT_THAT(field.Validate(), IsOk()); |
| 203 | +} |
| 204 | + |
173 | 205 | } // namespace iceberg |
0 commit comments