From de4053ad87b4d4299ed12a1f044c7a6a913f2097 Mon Sep 17 00:00:00 2001 From: wecharyu Date: Fri, 7 Jun 2024 10:36:06 +0000 Subject: [PATCH] HIVE-28311: Backward compatibility of java.sql.Date and java.sql.Timestamp in hive-serde --- .../apache/hadoop/hive/common/type/Date.java | 4 ++++ .../primitive/JavaDateObjectInspector.java | 3 +++ .../primitive/JavaTimestampObjectInspector.java | 3 +++ .../TestPrimitiveObjectInspectorUtils.java | 17 +++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/common/src/java/org/apache/hadoop/hive/common/type/Date.java b/common/src/java/org/apache/hadoop/hive/common/type/Date.java index 0f47ba513d47..90f4f47e9b80 100644 --- a/common/src/java/org/apache/hadoop/hive/common/type/Date.java +++ b/common/src/java/org/apache/hadoop/hive/common/type/Date.java @@ -190,6 +190,10 @@ public static Date valueOf(final String text) { } } + public static Date valueOf(java.sql.Date d) { + return new Date(d.toLocalDate()); + } + public static Date ofEpochDay(int epochDay) { return new Date(LocalDate.ofEpochDay(epochDay)); } diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaDateObjectInspector.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaDateObjectInspector.java index 4cf0a60b481d..0e3fcbca5bf8 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaDateObjectInspector.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaDateObjectInspector.java @@ -33,6 +33,9 @@ protected JavaDateObjectInspector() { } public DateWritableV2 getPrimitiveWritableObject(Object o) { + if (o instanceof java.sql.Date) { + return new DateWritableV2(Date.valueOf((java.sql.Date) o)); + } return o == null ? null : new DateWritableV2((Date) o); } diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaTimestampObjectInspector.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaTimestampObjectInspector.java index 47719c856429..991773c2b099 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaTimestampObjectInspector.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaTimestampObjectInspector.java @@ -30,6 +30,9 @@ protected JavaTimestampObjectInspector() { } public TimestampWritableV2 getPrimitiveWritableObject(Object o) { + if (o instanceof java.sql.Timestamp) { + return new TimestampWritableV2(Timestamp.ofEpochMilli(((java.sql.Timestamp) o).getTime())); + } return o == null ? null : new TimestampWritableV2((Timestamp) o); } diff --git a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/primitive/TestPrimitiveObjectInspectorUtils.java b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/primitive/TestPrimitiveObjectInspectorUtils.java index 25c3f6001da1..7dc9ea8caade 100644 --- a/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/primitive/TestPrimitiveObjectInspectorUtils.java +++ b/serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/primitive/TestPrimitiveObjectInspectorUtils.java @@ -79,6 +79,20 @@ public void testGetPrimitiveGrouping() { PrimitiveObjectInspectorUtils.getPrimitiveGrouping(PrimitiveCategory.VOID)); } + @Test + public void testGetDate() { + DateFormat gmtDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + gmtDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + PrimitiveObjectInspector dateOI = PrimitiveObjectInspectorFactory + .getPrimitiveJavaObjectInspector(PrimitiveCategory.DATE); + assertEquals("1970-01-01", gmtDateFormat.format(PrimitiveObjectInspectorUtils.getDate(Date.ofEpochDay(0), dateOI).toEpochMilli())); + assertEquals("2024-06-07", gmtDateFormat.format(PrimitiveObjectInspectorUtils.getDate(Date.ofEpochMilli(1717752174344L), dateOI).toEpochMilli())); + + // Test the compatibility of java.sql.Date that's removed in HIVE-20007 + assertEquals("1970-01-01", gmtDateFormat.format(PrimitiveObjectInspectorUtils.getDate(java.sql.Date.valueOf("1970-01-01"), dateOI).toEpochMilli())); + assertEquals("2024-06-07", gmtDateFormat.format(PrimitiveObjectInspectorUtils.getDate(java.sql.Date.valueOf("2024-06-07"), dateOI).toEpochMilli())); + } + @Test public void testgetTimestampWithMillisecondsInt() { DateFormat gmtDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); @@ -148,6 +162,9 @@ public void testgetTimestampWithMillisecondsInt() { PrimitiveObjectInspector timestampOI = PrimitiveObjectInspectorFactory .getPrimitiveJavaObjectInspector(PrimitiveCategory.TIMESTAMP); assertEquals("2015-02-07 15:01:22.123", gmtDateFormat.format(PrimitiveObjectInspectorUtils.getTimestamp(Timestamp.ofEpochMilli(1423321282123L), timestampOI).toSqlTimestamp())); + + // Test the compatibility of java.sql.Timestamp that's removed in HIVE-20007 + assertEquals("2024-06-07 09:22:54.344", gmtDateFormat.format(PrimitiveObjectInspectorUtils.getTimestamp(new java.sql.Timestamp(1717752174344L), timestampOI).toSqlTimestamp())); } @Test