Skip to content

Commit e268df6

Browse files
authored
Core: Fix overflow due to default value on timestamp nanos (#14359)
1 parent 329a901 commit e268df6

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

core/src/main/java/org/apache/iceberg/SchemaParser.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,14 @@ private static Type typeFromJson(JsonNode json) {
197197

198198
private static Literal<?> defaultFromJson(String defaultField, Type type, JsonNode json) {
199199
if (json.has(defaultField)) {
200-
return Expressions.lit(SingleValueParser.fromJson(type, json.get(defaultField)));
200+
Object value = SingleValueParser.fromJson(type, json.get(defaultField));
201+
if (type instanceof Types.TimestampNanoType) {
202+
// Call Expressions.nanos instead of Expressions.lit to prevent overflow
203+
// https://github.com/apache/iceberg/issues/13160
204+
return Expressions.nanos((long) value);
205+
}
206+
207+
return Expressions.lit(value);
201208
}
202209

203210
return null;

core/src/test/java/org/apache/iceberg/TestSchemaParser.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.UUID;
2929
import java.util.stream.Stream;
3030
import org.apache.iceberg.data.DataTestBase;
31+
import org.apache.iceberg.expressions.Expressions;
3132
import org.apache.iceberg.expressions.Literal;
3233
import org.apache.iceberg.relocated.com.google.common.collect.Lists;
3334
import org.apache.iceberg.relocated.com.google.common.collect.Sets;
@@ -116,9 +117,16 @@ private static Stream<Arguments> primitiveTypesAndDefaults() {
116117
Arguments.of(
117118
Types.TimestampType.withZone(),
118119
Literal.of(DateTimeUtil.isoTimestamptzToMicros("2024-12-17T23:59:59.999999+00:00"))),
120+
Arguments.of(
121+
Types.TimestampNanoType.withZone(),
122+
Expressions.nanos(
123+
DateTimeUtil.isoTimestamptzToNanos("2024-12-17T23:59:59.123456789+00:00"))),
119124
Arguments.of(
120125
Types.TimestampType.withoutZone(),
121126
Literal.of(DateTimeUtil.isoTimestampToMicros("2024-12-17T23:59:59.999999"))),
127+
Arguments.of(
128+
Types.TimestampNanoType.withoutZone(),
129+
Expressions.nanos(DateTimeUtil.isoTimestampToNanos("2024-12-17T23:59:59.123456789"))),
122130
Arguments.of(Types.StringType.get(), Literal.of("iceberg")),
123131
Arguments.of(Types.UUIDType.get(), Literal.of(UUID.randomUUID())),
124132
Arguments.of(

0 commit comments

Comments
 (0)