From cc46015327eef59187b39c42904d3b60df5ff2e0 Mon Sep 17 00:00:00 2001 From: Martin Traverso Date: Thu, 11 May 2023 00:04:22 -0700 Subject: [PATCH] Fix current_timestamp failure due to improper rounding When the number of nanoseconds in the current instant is such that it needs to round up to the nearest millisecond, the calculation doesn't properly compute the carryover. --- .../src/main/java/io/trino/type/DateTimes.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/type/DateTimes.java b/core/trino-main/src/main/java/io/trino/type/DateTimes.java index 817526a21652..6f3d0d1a4351 100644 --- a/core/trino-main/src/main/java/io/trino/type/DateTimes.java +++ b/core/trino-main/src/main/java/io/trino/type/DateTimes.java @@ -648,10 +648,13 @@ public static LongTimestampWithTimeZone longTimestampWithTimeZone(long precision { checkArgument(precision <= TimestampWithTimeZoneType.MAX_PRECISION, "Precision is out of range"); - return LongTimestampWithTimeZone.fromEpochMillisAndFraction( - start.toEpochMilli(), - (int) round((start.getNano() % NANOSECONDS_PER_MILLISECOND) * PICOSECONDS_PER_NANOSECOND, (int) (TimestampWithTimeZoneType.MAX_PRECISION - precision)), - timeZoneKey); + long epochMilli = start.toEpochMilli(); + int picosOfMilli = (int) round((start.getNano() % NANOSECONDS_PER_MILLISECOND) * PICOSECONDS_PER_NANOSECOND, (int) (TimestampWithTimeZoneType.MAX_PRECISION - precision)); + if (picosOfMilli == PICOSECONDS_PER_MILLISECOND) { + epochMilli++; + picosOfMilli = 0; + } + return LongTimestampWithTimeZone.fromEpochMillisAndFraction(epochMilli, picosOfMilli, timeZoneKey); } public static LongTimestampWithTimeZone longTimestampWithTimeZone(long epochSecond, long fractionInPicos, ZoneId zoneId)