From 9e43b95092e5b3717143fa9e8c8730ecb7658dca Mon Sep 17 00:00:00 2001 From: Ashutosh Chauhan Date: Tue, 29 Mar 2016 19:01:24 -0700 Subject: [PATCH] HIVE-13381 : Timestamp & date should have precedence in type hierarchy than string group --- .../hadoop/hive/ql/exec/FunctionRegistry.java | 9 +- .../hadoop/hive/ql/exec/TestFunctionRegistry.java | 18 ++- .../test/queries/clientpositive/cast_on_constant.q | 7 + .../results/clientpositive/cast_on_constant.q.out | 160 +++++++++++++++++++++ 4 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 ql/src/test/queries/clientpositive/cast_on_constant.q create mode 100644 ql/src/test/results/clientpositive/cast_on_constant.q.out 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 56b96b4..1343b39 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 @@ -737,7 +737,14 @@ public static TypeInfo getCommonClassForComparison(TypeInfo a, TypeInfo b) { 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; + } + // date/timestamp is higher precedence than String_GROUP + if (pgB == PrimitiveGrouping.STRING_GROUP && pgA == PrimitiveGrouping.DATE_GROUP) { + return a; + } // Another special case, because timestamp is not implicitly convertible to numeric types. if ((pgA == PrimitiveGrouping.NUMERIC_GROUP || pgB == PrimitiveGrouping.NUMERIC_GROUP) && (pcA == PrimitiveCategory.TIMESTAMP || pcB == PrimitiveCategory.TIMESTAMP)) { diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java b/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java index 6a83c32..8488c21 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java @@ -253,9 +253,13 @@ public void testCommonClassComparison() { TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.dateTypeInfo, TypeInfoFactory.stringTypeInfo, - TypeInfoFactory.stringTypeInfo); + TypeInfoFactory.dateTypeInfo); comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.dateTypeInfo, - TypeInfoFactory.stringTypeInfo); + TypeInfoFactory.dateTypeInfo); + comparison(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.stringTypeInfo, + TypeInfoFactory.timestampTypeInfo); + comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.timestampTypeInfo, + TypeInfoFactory.timestampTypeInfo); comparison(TypeInfoFactory.intTypeInfo, TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.doubleTypeInfo); @@ -364,15 +368,15 @@ public void testGetTypeInfoForPrimitiveCategory() { // non-qualified types should simply return the TypeInfo associated with that type assertEquals(TypeInfoFactory.stringTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory( - (PrimitiveTypeInfo) varchar10, (PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo, + (PrimitiveTypeInfo) varchar10, TypeInfoFactory.stringTypeInfo, PrimitiveCategory.STRING)); assertEquals(TypeInfoFactory.stringTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory( - (PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo, - (PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo, + TypeInfoFactory.stringTypeInfo, + TypeInfoFactory.stringTypeInfo, PrimitiveCategory.STRING)); assertEquals(TypeInfoFactory.doubleTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory( - (PrimitiveTypeInfo) TypeInfoFactory.doubleTypeInfo, - (PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo, + TypeInfoFactory.doubleTypeInfo, + TypeInfoFactory.stringTypeInfo, PrimitiveCategory.DOUBLE)); } diff --git a/ql/src/test/queries/clientpositive/cast_on_constant.q b/ql/src/test/queries/clientpositive/cast_on_constant.q new file mode 100644 index 0000000..aabb9c6 --- /dev/null +++ b/ql/src/test/queries/clientpositive/cast_on_constant.q @@ -0,0 +1,7 @@ +create table t1(ts_field timestamp, date_field date); +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'; + +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 new file mode 100644 index 0000000..f8d6a0d --- /dev/null +++ b/ql/src/test/results/clientpositive/cast_on_constant.q.out @@ -0,0 +1,160 @@ +PREHOOK: query: create table t1(ts_field timestamp, date_field date) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t1 +POSTHOOK: query: create table t1(ts_field timestamp, date_field date) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t1 +PREHOOK: query: explain select * from t1 where ts_field = "2016-01-23 00:00:00" +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where ts_field = "2016-01-23 00:00:00" +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: (ts_field = 2016-01-23 00:00:00.0) (type: boolean) + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + Select Operator + expressions: 2016-01-23 00:00:00.0 (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: explain select * from t1 where date_field = "2016-01-23" +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where date_field = "2016-01-23" +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: (date_field = 2016-01-23) (type: boolean) + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + Select Operator + expressions: ts_field (type: timestamp), 2016-01-23 (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: explain select * from t1 where ts_field = timestamp '2016-01-23 00:00:00' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where ts_field = timestamp '2016-01-23 00:00:00' +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: (ts_field = 2016-01-23 00:00:00.0) (type: boolean) + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + Select Operator + expressions: 2016-01-23 00:00:00.0 (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: explain select * from t1 where date_field = date '2016-01-23' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where date_field = date '2016-01-23' +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: (date_field = 2016-01-23) (type: boolean) + Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE + Select Operator + expressions: ts_field (type: timestamp), 2016-01-23 (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 +PREHOOK: Output: default@t1 +POSTHOOK: query: drop table t1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@t1 +POSTHOOK: Output: default@t1 -- 1.7.12.4 (Apple Git-37)