diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java index d047b25..68cf429 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java @@ -954,6 +954,12 @@ public static TypeInfo getCommonClassForComparison(TypeInfo a, TypeInfo b) { (PrimitiveTypeInfo)a, (PrimitiveTypeInfo)b,PrimitiveCategory.STRING); } + // 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)) { + return TypeInfoFactory.doubleTypeInfo; + } + for (PrimitiveCategory t : numericTypeList) { if (FunctionRegistry.implicitConvertible(pcA, t) && FunctionRegistry.implicitConvertible(pcB, t)) { diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java index f2e8113..655c3d0 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java @@ -256,6 +256,11 @@ public void testCommonClassComparison() { comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.dateTypeInfo, TypeInfoFactory.stringTypeInfo); + comparison(TypeInfoFactory.intTypeInfo, TypeInfoFactory.timestampTypeInfo, + TypeInfoFactory.doubleTypeInfo); + comparison(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.intTypeInfo, + TypeInfoFactory.doubleTypeInfo); + comparison(TypeInfoFactory.stringTypeInfo, varchar10, TypeInfoFactory.stringTypeInfo); comparison(varchar10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); comparison(varchar5, varchar10, varchar10); diff --git ql/src/test/queries/clientpositive/timestamp_comparison2.q ql/src/test/queries/clientpositive/timestamp_comparison2.q new file mode 100644 index 0000000..d41cc83 --- /dev/null +++ ql/src/test/queries/clientpositive/timestamp_comparison2.q @@ -0,0 +1,23 @@ +-- Test timestamp-to-numeric comparison +select count(*) +FROM alltypesorc +WHERE +((ctinyint != 0) + AND + (((ctimestamp1 <= 0) + OR ((ctinyint = cint) OR (cstring2 LIKE 'ss'))) + AND ((988888 < cdouble) + OR ((ctimestamp2 > -29071) AND (3569 >= cdouble))))) +; + +-- Should have same result as previous query +select count(*) +FROM alltypesorc +WHERE +((ctinyint != 0) + AND + (((ctimestamp1 <= timestamp('1969-12-31 16:00:00')) + OR ((ctinyint = cint) OR (cstring2 LIKE 'ss'))) + AND ((988888 < cdouble) + OR ((ctimestamp2 > timestamp('1969-12-31 07:55:29')) AND (3569 >= cdouble))))) +; diff --git ql/src/test/results/clientpositive/timestamp_comparison2.q.out ql/src/test/results/clientpositive/timestamp_comparison2.q.out new file mode 100644 index 0000000..76ac21d --- /dev/null +++ ql/src/test/results/clientpositive/timestamp_comparison2.q.out @@ -0,0 +1,54 @@ +PREHOOK: query: -- Test timestamp-to-numeric comparison +select count(*) +FROM alltypesorc +WHERE +((ctinyint != 0) + AND + (((ctimestamp1 <= 0) + OR ((ctinyint = cint) OR (cstring2 LIKE 'ss'))) + AND ((988888 < cdouble) + OR ((ctimestamp2 > -29071) AND (3569 >= cdouble))))) +PREHOOK: type: QUERY +PREHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +POSTHOOK: query: -- Test timestamp-to-numeric comparison +select count(*) +FROM alltypesorc +WHERE +((ctinyint != 0) + AND + (((ctimestamp1 <= 0) + OR ((ctinyint = cint) OR (cstring2 LIKE 'ss'))) + AND ((988888 < cdouble) + OR ((ctimestamp2 > -29071) AND (3569 >= cdouble))))) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +1826 +PREHOOK: query: -- Should have same result as previous query +select count(*) +FROM alltypesorc +WHERE +((ctinyint != 0) + AND + (((ctimestamp1 <= timestamp('1969-12-31 16:00:00')) + OR ((ctinyint = cint) OR (cstring2 LIKE 'ss'))) + AND ((988888 < cdouble) + OR ((ctimestamp2 > timestamp('1969-12-31 07:55:29')) AND (3569 >= cdouble))))) +PREHOOK: type: QUERY +PREHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +POSTHOOK: query: -- Should have same result as previous query +select count(*) +FROM alltypesorc +WHERE +((ctinyint != 0) + AND + (((ctimestamp1 <= timestamp('1969-12-31 16:00:00')) + OR ((ctinyint = cint) OR (cstring2 LIKE 'ss'))) + AND ((988888 < cdouble) + OR ((ctimestamp2 > timestamp('1969-12-31 07:55:29')) AND (3569 >= cdouble))))) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +1826