Skip to content

Commit ea81bea

Browse files
Chong Gaores-life
authored andcommitted
Preserve fixed-offset ORC timezone rules
Signed-off-by: Chong Gao <chongg@nvidia.com>
1 parent a9bfd55 commit ea81bea

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

src/main/java/com/nvidia/spark/rapids/jni/GpuTimeZoneDB.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,8 @@ private OrcTimezoneContext(Table writerTzInfoTable, Table readerTzInfoTable,
602602
readerTzInfo.transitions == null || readerTzInfo.transitions.length == 0
603603
? Long.MIN_VALUE
604604
: TimeUnit.MILLISECONDS.toMicros(readerTzInfo.transitions[0]);
605-
TimeZone writerTz = TimeZone.getTimeZone(getZoneId(writerTimezone).getId());
606-
TimeZone readerTz = TimeZone.getTimeZone(getZoneId(readerTimezone).getId());
605+
TimeZone writerTz = TimeZone.getTimeZone(getZoneId(writerTimezone));
606+
TimeZone readerTz = TimeZone.getTimeZone(getZoneId(readerTimezone));
607607
this.writerReaderRulesDiffer = !writerTz.hasSameRules(readerTz);
608608
}
609609

src/test/java/com/nvidia/spark/rapids/jni/GpuTimeZoneDBTest.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class GpuTimeZoneDBTest {
4343
private static final long MICROS_PER_SECOND = TimeUnit.SECONDS.toMicros(1);
4444

4545
private static TimeZone getTimeZoneForOrc(String timezoneId) {
46-
return TimeZone.getTimeZone(GpuTimeZoneDB.getZoneId(timezoneId).getId());
46+
return TimeZone.getTimeZone(GpuTimeZoneDB.getZoneId(timezoneId));
4747
}
4848

4949
private static long orc2015YearBaseOffsetUs(String timezoneId) {
@@ -190,6 +190,30 @@ void testConvertOrcTimezonesCorrectsIgnoredWriterTimezoneEpochBorrow() {
190190
}
191191
}
192192

193+
@Test
194+
void testConvertOrcTimezonesFixedOffsetIds() {
195+
GpuTimeZoneDB.cacheDatabase();
196+
GpuTimeZoneDB.verifyDatabaseCached();
197+
198+
long[] microseconds = {0L, -1L, 1L, -2_957_649_381_472_612L};
199+
String[][] cases = {
200+
{"UTC", "+05:30"},
201+
{"+05:30", "UTC"},
202+
{"UTC", "EST"},
203+
{"EST", "UTC"}
204+
};
205+
206+
for (String[] timezones : cases) {
207+
try (ColumnVector input = ColumnVector.timestampMicroSecondsFromLongs(microseconds);
208+
ColumnVector expected =
209+
convertOrcTimezonesOnCPU(microseconds, timezones[0], timezones[1]);
210+
ColumnVector actual =
211+
GpuTimeZoneDB.convertOrcTimezones(input, timezones[0], timezones[1])) {
212+
assertColumnsAreEqual(expected, actual);
213+
}
214+
}
215+
}
216+
193217
@Test
194218
void testConvertOrcTimezones() {
195219
GpuTimeZoneDB.cacheDatabase();

0 commit comments

Comments
 (0)