Skip to content

Commit dc8a961

Browse files
committed
[CALCITE-7449] DateTimeUtils.intervalDayTimeToString silently truncates large intervals
Signed-off-by: Mihai Budiu <mbudiu@feldera.com>
1 parent 8f2b775 commit dc8a961

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
520520
h = v % 24;
521521
v /= 24;
522522
d = v;
523-
buf.append((int) d);
523+
buf.append(d);
524524
buf.append(' ');
525525
number(buf, (int) h, 2);
526526
buf.append(':');
@@ -538,7 +538,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
538538
h = v % 24;
539539
v /= 24;
540540
d = v;
541-
buf.append((int) d);
541+
buf.append(d);
542542
buf.append(' ');
543543
number(buf, (int) h, 2);
544544
buf.append(':');
@@ -552,22 +552,22 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
552552
h = v % 24;
553553
v /= 24;
554554
d = v;
555-
buf.append((int) d);
555+
buf.append(d);
556556
buf.append(' ');
557557
number(buf, (int) h, 2);
558558
break;
559559
case DAY:
560560
v = roundUp(v, 1000 * 60 * 60 * 24);
561561
d = v / (1000 * 60 * 60 * 24);
562-
buf.append((int) d);
562+
buf.append(d);
563563
break;
564564
case HOUR:
565565
v = roundUp(v, 1000 * 60 * 60);
566566
v /= 1000;
567567
v /= 60;
568568
v /= 60;
569569
h = v;
570-
buf.append((int) h);
570+
buf.append(h);
571571
break;
572572
case HOUR_TO_MINUTE:
573573
v = roundUp(v, 1000 * 60);
@@ -576,7 +576,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
576576
m = v % 60;
577577
v /= 60;
578578
h = v;
579-
buf.append((int) h);
579+
buf.append(h);
580580
buf.append(':');
581581
number(buf, (int) m, 2);
582582
break;
@@ -589,7 +589,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
589589
m = v % 60;
590590
v /= 60;
591591
h = v;
592-
buf.append((int) h);
592+
buf.append(h);
593593
buf.append(':');
594594
number(buf, (int) m, 2);
595595
buf.append(':');
@@ -603,7 +603,7 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
603603
s = v % 60;
604604
v /= 60;
605605
m = v;
606-
buf.append((int) m);
606+
buf.append(m);
607607
buf.append(':');
608608
number(buf, (int) s, 2);
609609
fraction(buf, scale, ms);
@@ -613,14 +613,14 @@ public static String intervalDayTimeToString(long v, TimeUnitRange range,
613613
v /= 1000;
614614
v /= 60;
615615
m = v;
616-
buf.append((int) m);
616+
buf.append(m);
617617
break;
618618
case SECOND:
619619
v = roundUp(v, powerX(10, 3 - scale));
620620
ms = v % 1000;
621621
v /= 1000;
622622
s = v;
623-
buf.append((int) s);
623+
buf.append(s);
624624
fraction(buf, scale, ms);
625625
break;
626626
default:

core/src/test/java/org/apache/calcite/avatica/util/DateTimeUtilsTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,18 @@ private void checkTimestampString(String s, int p, long d) {
351351
intervalDayTimeToString(0, TimeUnitRange.MINUTE_TO_SECOND, 0));
352352
assertEquals("+0",
353353
intervalDayTimeToString(0, TimeUnitRange.SECOND, 0));
354+
// Test cases for https://issues.apache.org/jira/browse/CALCITE-7449
355+
// DateTimeUtils.intervalDayTimeToString silently truncates large intervals
356+
assertEquals("+2147483648",
357+
intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.DAY, 0));
358+
assertEquals("+51539607552",
359+
intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.HOUR, 0));
360+
assertEquals("+51539607552:00",
361+
intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.HOUR_TO_MINUTE, 0));
362+
assertEquals("+3092376453120",
363+
intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.MINUTE, 0));
364+
assertEquals("+185542587187200",
365+
intervalDayTimeToString(2147483648L * 86400000L, TimeUnitRange.SECOND, 0));
354366
}
355367

356368
@Test public void testYmdToJulian() {

0 commit comments

Comments
 (0)