This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite-avatica.git
The following commit(s) were added to refs/heads/main by this push:
new dc8a961d6 [CALCITE-7449] DateTimeUtils.intervalDayTimeToString
silently truncates large intervals
dc8a961d6 is described below
commit dc8a961d631213a12400e1067ccbd9fb4de49ec9
Author: Mihai Budiu <[email protected]>
AuthorDate: Tue Mar 24 15:58:03 2026 -0700
[CALCITE-7449] DateTimeUtils.intervalDayTimeToString silently truncates
large intervals
Signed-off-by: Mihai Budiu <[email protected]>
---
.../apache/calcite/avatica/util/DateTimeUtils.java | 20 ++++++++++----------
.../calcite/avatica/util/DateTimeUtilsTest.java | 12 ++++++++++++
2 files changed, 22 insertions(+), 10 deletions(-)
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() {