From df0417457407f2923f4d3f17e28fa66ed6d7f426 Mon Sep 17 00:00:00 2001 From: Naresh P R Date: Thu, 24 Oct 2019 23:54:41 +0530 Subject: [PATCH] HIVE-22400 - Hour, Minute, Second UDF returns NULL if HH:mm:ss format data is passed --- .../org/apache/hadoop/hive/common/type/Timestamp.java | 11 ++++++++++- ql/src/test/results/clientpositive/udf_hour.q.out | 6 +++--- ql/src/test/results/clientpositive/udf_minute.q.out | 8 ++++---- ql/src/test/results/clientpositive/udf_second.q.out | 6 +++--- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java b/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java index a8b7b6d186..fdb27e0c43 100644 --- a/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java +++ b/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java @@ -18,7 +18,9 @@ package org.apache.hadoop.hive.common.type; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -160,7 +162,14 @@ public static Timestamp valueOf(String s) { try { localDateTime = LocalDateTime.parse(s); } catch (DateTimeParseException e2) { - throw new IllegalArgumentException("Cannot create timestamp, parsing error"); + try { + // Try HH:mm:ss format (For Hour, Minute & Second UDF). + localDateTime = LocalDateTime.of(LocalDate.of(1970, 1, 1), + LocalTime.parse(s, DateTimeFormatter.ISO_LOCAL_TIME)); + } catch (DateTimeParseException e3) { + throw new IllegalArgumentException("Cannot create timestamp, parsing error"); + } + } } return new Timestamp(localDateTime); diff --git a/ql/src/test/results/clientpositive/udf_hour.q.out b/ql/src/test/results/clientpositive/udf_hour.q.out index 01745a0c3a..3eca55dc39 100644 --- a/ql/src/test/results/clientpositive/udf_hour.q.out +++ b/ql/src/test/results/clientpositive/udf_hour.q.out @@ -46,9 +46,9 @@ STAGE PLANS: predicate: (UDFToDouble(key) = 86.0D) (type: boolean) Statistics: Num rows: 250 Data size: 21750 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: 13 (type: int), null (type: int), 0 (type: int) + expressions: 13 (type: int), 13 (type: int), 0 (type: int) outputColumnNames: _col0, _col1, _col2 - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: SELECT hour('2009-08-07 13:14:15'), hour('13:14:15'), hour('2009-08-07') @@ -61,7 +61,7 @@ FROM src WHERE key = 86 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -13 NULL 0 +13 13 0 PREHOOK: query: SELECT hour(cast('2009-08-07 13:14:15' as timestamp)) FROM src WHERE key=86 PREHOOK: type: QUERY diff --git a/ql/src/test/results/clientpositive/udf_minute.q.out b/ql/src/test/results/clientpositive/udf_minute.q.out index 094e6c60bc..efb8dc6f7e 100644 --- a/ql/src/test/results/clientpositive/udf_minute.q.out +++ b/ql/src/test/results/clientpositive/udf_minute.q.out @@ -46,12 +46,12 @@ STAGE PLANS: predicate: (UDFToDouble(key) = 86.0D) (type: boolean) Statistics: Num rows: 250 Data size: 21750 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: 14 (type: int), null (type: int), 0 (type: int) + expressions: 14 (type: int), 14 (type: int), 0 (type: int) outputColumnNames: _col0, _col1, _col2 - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE File Output Operator compressed: false - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -74,4 +74,4 @@ FROM src WHERE key = 86 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -14 NULL 0 +14 14 0 diff --git a/ql/src/test/results/clientpositive/udf_second.q.out b/ql/src/test/results/clientpositive/udf_second.q.out index 906dfb735d..b60b7af4f6 100644 --- a/ql/src/test/results/clientpositive/udf_second.q.out +++ b/ql/src/test/results/clientpositive/udf_second.q.out @@ -46,9 +46,9 @@ STAGE PLANS: predicate: (UDFToDouble(key) = 86.0D) (type: boolean) Statistics: Num rows: 250 Data size: 21750 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: 15 (type: int), null (type: int), 0 (type: int) + expressions: 15 (type: int), 15 (type: int), 0 (type: int) outputColumnNames: _col0, _col1, _col2 - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: SELECT second('2009-08-07 13:14:15'), second('13:14:15'), second('2009-08-07') @@ -61,4 +61,4 @@ FROM src WHERE key = 86 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -15 NULL 0 +15 15 0 -- 2.18.0