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() {

Reply via email to