From 16a1f273b18bca7ed1c3eadc46b1ae4a9fb75532 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 --- .../apache/hadoop/hive/ql/exec/FunctionRegistry.java | 13 ++++++++++++- .../hadoop/hive/ql/exec/TestFunctionRegistry.java | 18 +++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) 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..585f605 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,18 @@ public static TypeInfo getCommonClassForComparison(TypeInfo a, TypeInfo b) { return getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo)a, (PrimitiveTypeInfo)b,PrimitiveCategory.STRING); } - + // timestamp is higher precedence than String_GROUP + if ((pgA == PrimitiveGrouping.STRING_GROUP && pcB == PrimitiveCategory.TIMESTAMP) || + (pgB == PrimitiveGrouping.STRING_GROUP && pcA == PrimitiveCategory.TIMESTAMP)) { + // Compare as strings. Char comparison semantics may be different if/when implemented. + return TypeInfoFactory.timestampTypeInfo; + } + // date is higher precedence than String_GROUP + if ((pgA == PrimitiveGrouping.STRING_GROUP && pcB == PrimitiveCategory.DATE) || + (pgB == PrimitiveGrouping.STRING_GROUP && pcA == PrimitiveCategory.DATE)) { + // Compare as strings. Char comparison semantics may be different if/when implemented. + return TypeInfoFactory.dateTypeInfo; + } // 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)); } -- 1.7.12.4 (Apple Git-37)