diff --git a/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java b/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java index a71f3e52e..0c5854edf 100644 --- a/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java +++ b/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java @@ -520,7 +520,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, h = v % 24; v /= 24; d = v; - buf.append((int) d); + buf.append(d); buf.append(' '); number(buf, (int) h, 2); buf.append(':'); @@ -538,7 +538,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, h = v % 24; v /= 24; d = v; - buf.append((int) d); + buf.append(d); buf.append(' '); number(buf, (int) h, 2); buf.append(':'); @@ -552,14 +552,14 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, h = v % 24; v /= 24; d = v; - buf.append((int) d); + buf.append(d); buf.append(' '); number(buf, (int) h, 2); break; case DAY: v = roundUp(v, 1000 * 60 * 60 * 24); d = v / (1000 * 60 * 60 * 24); - buf.append((int) d); + buf.append(d); break; case HOUR: v = roundUp(v, 1000 * 60 * 60); @@ -567,7 +567,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, v /= 60; v /= 60; h = v; - buf.append((int) h); + buf.append(h); break; case HOUR_TO_MINUTE: v = roundUp(v, 1000 * 60); @@ -576,7 +576,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, m = v % 60; v /= 60; h = v; - buf.append((int) h); + buf.append(h); buf.append(':'); number(buf, (int) m, 2); break; @@ -589,7 +589,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, m = v % 60; v /= 60; h = v; - buf.append((int) h); + buf.append(h); buf.append(':'); number(buf, (int) m, 2); buf.append(':'); @@ -603,7 +603,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, s = v % 60; v /= 60; m = v; - buf.append((int) m); + buf.append(m); buf.append(':'); number(buf, (int) s, 2); fraction(buf, scale, ms); @@ -613,14 +613,14 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range, v /= 1000; v /= 60; m = v; - buf.append((int) m); + buf.append(m); break; case SECOND: v = roundUp(v, powerX(10, 3 - scale)); ms = v % 1000; v /= 1000; s = v; - buf.append((int) s); + buf.append(s); fraction(buf, scale, ms); break; default: diff --git a/core/src/test/java/org/apache/calcite/avatica/util/DateTimeUtilsTest.java b/core/src/test/java/org/apache/calcite/avatica/util/DateTimeUtilsTest.java index b4e0203fb..d62dba14c 100644 --- a/core/src/test/java/org/apache/calcite/avatica/util/DateTimeUtilsTest.java +++ b/core/src/test/java/org/apache/calcite/avatica/util/DateTimeUtilsTest.java @@ -351,6 +351,18 @@ private void checkTimestampString(String s, int p, long d) { intervalDayTimeToString(0, TimeUnitRange.MINUTE_TO_SECOND, 0)); assertEquals("+0", intervalDayTimeToString(0, TimeUnitRange.SECOND, 0)); + // Test cases for https://issues.apache.org/jira/browse/CALCITE-7449 + // DateTimeUtils.intervalDayTimeToString silently truncates large intervals + assertEquals("+2147483648", + intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.DAY, 0)); + assertEquals("+51539607552", + intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.HOUR, 0)); + assertEquals("+51539607552:00", + intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.HOUR_TO_MINUTE, 0)); + assertEquals("+3092376453120", + intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.MINUTE, 0)); + assertEquals("+185542587187200", + intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.SECOND, 0)); } @Test public void testYmdToJulian() {