diff --git common/src/java/org/apache/hadoop/hive/common/type/Date.java common/src/java/org/apache/hadoop/hive/common/type/Date.java index 6ecfcf65c9..43f5977282 100644 --- common/src/java/org/apache/hadoop/hive/common/type/Date.java +++ common/src/java/org/apache/hadoop/hive/common/type/Date.java @@ -127,6 +127,11 @@ public static Date valueOf(String s) { int idx = s.indexOf(" "); if (idx != -1) { s = s.substring(0, idx); + } else { + idx = s.indexOf('T'); + if (idx != -1) { + s = s.substring(0, idx); + } } LocalDate localDate; try { diff --git common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java index 4708d35a78..862acb8880 100644 --- common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java +++ common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java @@ -53,7 +53,6 @@ builder.optionalStart().appendLiteral(" ").append(DateTimeFormatter.ofPattern("HH:mm:ss")). optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true). optionalEnd().optionalEnd(); - // Zone part builder.optionalStart().appendLiteral(" ").optionalEnd(); builder.optionalStart().appendZoneText(TextStyle.NARROW).optionalEnd(); diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java index 86b914dcef..30a9e74d36 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFDateDiff.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hive.ql.udf.generic; +import java.text.ParseException; import java.time.LocalDateTime; import org.apache.hadoop.hive.common.type.Date; @@ -35,12 +36,28 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; + import org.junit.Test; /** * TestGenericUDFDateDiff. */ public class TestGenericUDFDateDiff { + @Test + public void testStringToDateISOFormat() throws HiveException, ParseException { + GenericUDFDateDiff udf = new GenericUDFDateDiff(); + ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.javaStringObjectInspector; + ObjectInspector[] arguments = {valueOI1, valueOI2}; + + udf.initialize(arguments); + DeferredObject valueObj1 = new DeferredJavaObject(new Text("2019-09-09T10:45:49+02:00")); + DeferredObject valueObj2 = new DeferredJavaObject(new Text("2019-11-07 23:20:39.503")); + DeferredObject[] args = {valueObj1, valueObj2}; + IntWritable output = udf.evaluate(args); + assertEquals("date_iff() test for STRING failed ", "-59", output.toString()); + } + @Test public void testStringToDate() throws HiveException { GenericUDFDateDiff udf = new GenericUDFDateDiff(); diff --git ql/src/test/queries/clientpositive/date_udf.q ql/src/test/queries/clientpositive/date_udf.q index aa33b7a524..1b0b7f1030 100644 --- ql/src/test/queries/clientpositive/date_udf.q +++ ql/src/test/queries/clientpositive/date_udf.q @@ -75,7 +75,13 @@ select select min(fl_date) from date_udf_flight; select max(fl_date) from date_udf_flight; +create external table testdatediff(datetimecol string) stored as orc; +insert into testdatediff values ('2019-09-09T10:45:49+02:00'),('2019-07-24'); +select datetimecol from testdatediff where datediff(cast(current_timestamp as string), datetimecol)<183; +select cast(datetimecol as date), datetimecol from testdatediff; + +drop table testdatediff; drop table date_udf; drop table date_udf_string; drop table date_udf_flight; diff --git ql/src/test/results/clientpositive/date_udf.q.out ql/src/test/results/clientpositive/date_udf.q.out index 5c44e5e64e..06bc26d7cf 100644 --- ql/src/test/results/clientpositive/date_udf.q.out +++ ql/src/test/results/clientpositive/date_udf.q.out @@ -228,6 +228,51 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@date_udf_flight #### A masked pattern was here #### 2010-10-31 +PREHOOK: query: create external table testdatediff(datetimecol string) stored as orc +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@testdatediff +POSTHOOK: query: create external table testdatediff(datetimecol string) stored as orc +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@testdatediff +PREHOOK: query: insert into testdatediff values ('2019-09-09T10:45:49+02:00'),('2019-07-24') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@testdatediff +POSTHOOK: query: insert into testdatediff values ('2019-09-09T10:45:49+02:00'),('2019-07-24') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@testdatediff +POSTHOOK: Lineage: testdatediff.datetimecol SCRIPT [] +PREHOOK: query: select datetimecol from testdatediff where datediff(cast(current_timestamp as string), datetimecol)<183 +PREHOOK: type: QUERY +PREHOOK: Input: default@testdatediff +#### A masked pattern was here #### +POSTHOOK: query: select datetimecol from testdatediff where datediff(cast(current_timestamp as string), datetimecol)<183 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@testdatediff +#### A masked pattern was here #### +2019-09-09T10:45:49+02:00 +2019-07-24 +PREHOOK: query: select cast(datetimecol as date), datetimecol from testdatediff +PREHOOK: type: QUERY +PREHOOK: Input: default@testdatediff +#### A masked pattern was here #### +POSTHOOK: query: select cast(datetimecol as date), datetimecol from testdatediff +POSTHOOK: type: QUERY +POSTHOOK: Input: default@testdatediff +#### A masked pattern was here #### +2019-09-09 2019-09-09T10:45:49+02:00 +2019-07-24 2019-07-24 +PREHOOK: query: drop table testdatediff +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@testdatediff +PREHOOK: Output: default@testdatediff +POSTHOOK: query: drop table testdatediff +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@testdatediff +POSTHOOK: Output: default@testdatediff PREHOOK: query: drop table date_udf PREHOOK: type: DROPTABLE PREHOOK: Input: default@date_udf diff --git ql/src/test/results/clientpositive/spark/date_udf.q.out ql/src/test/results/clientpositive/spark/date_udf.q.out index 5c44e5e64e..06bc26d7cf 100644 --- ql/src/test/results/clientpositive/spark/date_udf.q.out +++ ql/src/test/results/clientpositive/spark/date_udf.q.out @@ -228,6 +228,51 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@date_udf_flight #### A masked pattern was here #### 2010-10-31 +PREHOOK: query: create external table testdatediff(datetimecol string) stored as orc +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@testdatediff +POSTHOOK: query: create external table testdatediff(datetimecol string) stored as orc +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@testdatediff +PREHOOK: query: insert into testdatediff values ('2019-09-09T10:45:49+02:00'),('2019-07-24') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@testdatediff +POSTHOOK: query: insert into testdatediff values ('2019-09-09T10:45:49+02:00'),('2019-07-24') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@testdatediff +POSTHOOK: Lineage: testdatediff.datetimecol SCRIPT [] +PREHOOK: query: select datetimecol from testdatediff where datediff(cast(current_timestamp as string), datetimecol)<183 +PREHOOK: type: QUERY +PREHOOK: Input: default@testdatediff +#### A masked pattern was here #### +POSTHOOK: query: select datetimecol from testdatediff where datediff(cast(current_timestamp as string), datetimecol)<183 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@testdatediff +#### A masked pattern was here #### +2019-09-09T10:45:49+02:00 +2019-07-24 +PREHOOK: query: select cast(datetimecol as date), datetimecol from testdatediff +PREHOOK: type: QUERY +PREHOOK: Input: default@testdatediff +#### A masked pattern was here #### +POSTHOOK: query: select cast(datetimecol as date), datetimecol from testdatediff +POSTHOOK: type: QUERY +POSTHOOK: Input: default@testdatediff +#### A masked pattern was here #### +2019-09-09 2019-09-09T10:45:49+02:00 +2019-07-24 2019-07-24 +PREHOOK: query: drop table testdatediff +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@testdatediff +PREHOOK: Output: default@testdatediff +POSTHOOK: query: drop table testdatediff +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@testdatediff +POSTHOOK: Output: default@testdatediff PREHOOK: query: drop table date_udf PREHOOK: type: DROPTABLE PREHOOK: Input: default@date_udf