HIVE-17640: Comparison of date return null if time part is provided in string. (Yongzhi Chen, reviewed by Aihua Xu)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/a2df8f48 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/a2df8f48 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/a2df8f48 Branch: refs/heads/branch-2.3 Commit: a2df8f48ee32008032102759d48b0172b949b494 Parents: f3dc6a9 Author: Yongzhi Chen <ych...@apache.org> Authored: Fri Oct 20 10:29:49 2017 -0400 Committer: Sahil Takiar <stak...@cloudera.com> Committed: Tue Nov 7 08:15:47 2017 -0800 ---------------------------------------------------------------------- .../queries/clientpositive/date_withtimestamp.q | 3 +++ .../clientpositive/annotate_stats_select.q.out | 4 +-- .../clientpositive/constantfolding.q.out | 4 +-- .../clientpositive/date_withtimestamp.q.out | 27 ++++++++++++++++++++ .../PrimitiveObjectInspectorUtils.java | 16 +++++++++--- 5 files changed, 47 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/a2df8f48/ql/src/test/queries/clientpositive/date_withtimestamp.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientpositive/date_withtimestamp.q b/ql/src/test/queries/clientpositive/date_withtimestamp.q new file mode 100644 index 0000000..b6d04f5 --- /dev/null +++ b/ql/src/test/queries/clientpositive/date_withtimestamp.q @@ -0,0 +1,3 @@ +select "2016-12-29 23:59:59" < cast("2016-12-30" as date); +select "2016-12-30 00:00:00" = cast("2016-12-30" as date); +select "2016-12-31 00:00:01" > cast("2016-12-30" as date); http://git-wip-us.apache.org/repos/asf/hive/blob/a2df8f48/ql/src/test/results/clientpositive/annotate_stats_select.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/annotate_stats_select.q.out b/ql/src/test/results/clientpositive/annotate_stats_select.q.out index 873f1ab..489f4d2 100644 --- a/ql/src/test/results/clientpositive/annotate_stats_select.q.out +++ b/ql/src/test/results/clientpositive/annotate_stats_select.q.out @@ -470,9 +470,9 @@ STAGE PLANS: alias: alltypes_orc Statistics: Num rows: 2 Data size: 1686 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: null (type: date) + expressions: 1970-12-31 (type: date) outputColumnNames: _col0 - Statistics: Num rows: 2 Data size: 56 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 2 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: explain select cast("58.174" as DECIMAL) from alltypes_orc http://git-wip-us.apache.org/repos/asf/hive/blob/a2df8f48/ql/src/test/results/clientpositive/constantfolding.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/constantfolding.q.out b/ql/src/test/results/clientpositive/constantfolding.q.out index 10e185f..f9a9d24 100644 --- a/ql/src/test/results/clientpositive/constantfolding.q.out +++ b/ql/src/test/results/clientpositive/constantfolding.q.out @@ -205,9 +205,9 @@ STAGE PLANS: alias: src Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: null (type: date) + expressions: 1970-12-31 (type: date) outputColumnNames: _col0 - Statistics: Num rows: 500 Data size: 56 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 500 Data size: 28000 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: CREATE TABLE dest1(c1 STRING) STORED AS TEXTFILE http://git-wip-us.apache.org/repos/asf/hive/blob/a2df8f48/ql/src/test/results/clientpositive/date_withtimestamp.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/date_withtimestamp.q.out b/ql/src/test/results/clientpositive/date_withtimestamp.q.out new file mode 100644 index 0000000..3661888 --- /dev/null +++ b/ql/src/test/results/clientpositive/date_withtimestamp.q.out @@ -0,0 +1,27 @@ +PREHOOK: query: select "2016-12-29 23:59:59" < cast("2016-12-30" as date) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: select "2016-12-29 23:59:59" < cast("2016-12-30" as date) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +true +PREHOOK: query: select "2016-12-30 00:00:00" = cast("2016-12-30" as date) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: select "2016-12-30 00:00:00" = cast("2016-12-30" as date) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +true +PREHOOK: query: select "2016-12-31 00:00:01" > cast("2016-12-30" as date) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: select "2016-12-31 00:00:01" > cast("2016-12-30" as date) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +true http://git-wip-us.apache.org/repos/asf/hive/blob/a2df8f48/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java ---------------------------------------------------------------------- diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java index 9642a7e..27af6ec 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java @@ -1072,16 +1072,26 @@ public final class PrimitiveObjectInspectorUtils { try { result = Date.valueOf(s); } catch (IllegalArgumentException e) { - result = null; + Timestamp ts = getTimestampFromString(s); + if (ts != null) { + result = new Date(ts.getTime()); + } else { + result = null; + } } break; case CHAR: case VARCHAR: { + String val = getString(o, oi).trim(); try { - String val = getString(o, oi).trim(); result = Date.valueOf(val); } catch (IllegalArgumentException e) { - result = null; + Timestamp ts = getTimestampFromString(val); + if (ts != null) { + result = new Date(ts.getTime()); + } else { + result = null; + } } break; }