From 387883f6435352430f4f1dc0817f9664f8c8563a Mon Sep 17 00:00:00 2001 From: Ashutosh Chauhan Date: Thu, 17 Nov 2016 15:21:12 -0800 Subject: [PATCH] HIVE-15236 : timestamp and date comparison should happen in timestamp --- .../hadoop/hive/ql/exec/FunctionRegistry.java | 9 ++++++ .../test/queries/clientpositive/cast_on_constant.q | 1 + .../results/clientpositive/cast_on_constant.q.out | 36 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java index 0dbbc1d..e30abbb 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java @@ -767,12 +767,21 @@ public static TypeInfo getCommonClassForComparison(TypeInfo a, TypeInfo b) { PrimitiveGrouping pgA = PrimitiveObjectInspectorUtils.getPrimitiveGrouping(pcA); PrimitiveGrouping pgB = PrimitiveObjectInspectorUtils.getPrimitiveGrouping(pcB); + + if (pgA == pgB) { + // grouping is same, but category is not. + if (pgA == PrimitiveGrouping.DATE_GROUP) { + // we got timestamp & date and timestamp has higher precedence than date + return TypeInfoFactory.timestampTypeInfo; + } + } // handle string types properly if (pgA == PrimitiveGrouping.STRING_GROUP && pgB == PrimitiveGrouping.STRING_GROUP) { // Compare as strings. Char comparison semantics may be different if/when implemented. return getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo)a, (PrimitiveTypeInfo)b,PrimitiveCategory.STRING); } + // timestamp/date is higher precedence than String_GROUP if (pgA == PrimitiveGrouping.STRING_GROUP && pgB == PrimitiveGrouping.DATE_GROUP) { return b; diff --git a/ql/src/test/queries/clientpositive/cast_on_constant.q b/ql/src/test/queries/clientpositive/cast_on_constant.q index aabb9c6..bd9d57a 100644 --- a/ql/src/test/queries/clientpositive/cast_on_constant.q +++ b/ql/src/test/queries/clientpositive/cast_on_constant.q @@ -3,5 +3,6 @@ explain select * from t1 where ts_field = "2016-01-23 00:00:00"; explain select * from t1 where date_field = "2016-01-23"; explain select * from t1 where ts_field = timestamp '2016-01-23 00:00:00'; explain select * from t1 where date_field = date '2016-01-23'; +explain select * from t1 where date_field = ts_field; drop table t1; diff --git a/ql/src/test/results/clientpositive/cast_on_constant.q.out b/ql/src/test/results/clientpositive/cast_on_constant.q.out index f8d6a0d..7f920f4 100644 --- a/ql/src/test/results/clientpositive/cast_on_constant.q.out +++ b/ql/src/test/results/clientpositive/cast_on_constant.q.out @@ -150,6 +150,42 @@ STAGE PLANS: Processor Tree: ListSink +PREHOOK: query: explain select * from t1 where date_field = ts_field +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where date_field = ts_field +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + Filter Operator + predicate: (CAST( date_field AS TIMESTAMP) = ts_field) (type: boolean) + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + Select Operator + expressions: ts_field (type: timestamp), date_field (type: date) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + PREHOOK: query: drop table t1 PREHOOK: type: DROPTABLE PREHOOK: Input: default@t1 -- 1.7.12.4 (Apple Git-37)