From 37588de214f36aa2973285e8916fe4f1dd7e0c7a Mon Sep 17 00:00:00 2001 From: Ashutosh Chauhan Date: Tue, 29 Mar 2016 18:14:43 -0700 Subject: [PATCH] HIVE-13380 : Decimal should have lower precedence than double in type hierachy --- .../hadoop/hive/ql/exec/TestFunctionRegistry.java | 36 +++++++++++----------- .../hive/ql/udf/generic/TestGenericUDFOPMinus.java | 4 +-- .../ql/udf/generic/TestGenericUDFOPMultiply.java | 4 +-- .../hive/ql/udf/generic/TestGenericUDFOPPlus.java | 4 +-- .../hadoop/hive/serde2/typeinfo/TypeInfoUtils.java | 11 +++---- 5 files changed, 28 insertions(+), 31 deletions(-) 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..392d54e 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 @@ -23,12 +23,10 @@ import java.util.LinkedList; import java.util.List; -import junit.framework.Assert; import junit.framework.TestCase; import org.apache.hadoop.hive.common.type.HiveVarchar; import org.apache.hadoop.hive.conf.HiveConf; -import org.apache.hadoop.hive.ql.parse.SemanticException; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.serde2.io.DateWritable; import org.apache.hadoop.hive.serde2.io.DoubleWritable; @@ -42,6 +40,7 @@ import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; +import org.junit.Assert; public class TestFunctionRegistry extends TestCase { @@ -85,9 +84,10 @@ private void implicit(TypeInfo a, TypeInfo b, boolean convertible) { public void testImplicitConversion() { implicit(TypeInfoFactory.intTypeInfo, TypeInfoFactory.decimalTypeInfo, true); - implicit(TypeInfoFactory.floatTypeInfo, TypeInfoFactory.decimalTypeInfo, true); - implicit(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, true); - implicit(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, true); + implicit(TypeInfoFactory.longTypeInfo, TypeInfoFactory.decimalTypeInfo, true); + implicit(TypeInfoFactory.floatTypeInfo, TypeInfoFactory.decimalTypeInfo, false); + implicit(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, false); + implicit(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, false); implicit(TypeInfoFactory.dateTypeInfo, TypeInfoFactory.decimalTypeInfo, false); implicit(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.decimalTypeInfo, false); implicit(varchar10, TypeInfoFactory.stringTypeInfo, true); @@ -185,16 +185,16 @@ private void verify(Class udf, String name, TypeInfo ta, TypeInfo tb, public void testGetMethodInternal() { verify(TestUDF.class, "same", TypeInfoFactory.intTypeInfo, TypeInfoFactory.intTypeInfo, - DoubleWritable.class, DoubleWritable.class, false); + HiveDecimalWritable.class, HiveDecimalWritable.class, false); verify(TestUDF.class, "same", TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.doubleTypeInfo, DoubleWritable.class, DoubleWritable.class, false); verify(TestUDF.class, "same", TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, - HiveDecimalWritable.class, HiveDecimalWritable.class, false); + DoubleWritable.class, DoubleWritable.class, false); verify(TestUDF.class, "same", TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.doubleTypeInfo, - HiveDecimalWritable.class, HiveDecimalWritable.class, false); + DoubleWritable.class, DoubleWritable.class, false); verify(TestUDF.class, "same", TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.decimalTypeInfo, HiveDecimalWritable.class, HiveDecimalWritable.class, false); @@ -226,7 +226,7 @@ public void testCommonClass() { common(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.stringTypeInfo); common(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, - TypeInfoFactory.decimalTypeInfo); + TypeInfoFactory.doubleTypeInfo); common(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); @@ -246,9 +246,9 @@ public void testCommonClassComparison() { comparison(TypeInfoFactory.intTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.decimalTypeInfo); comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, - TypeInfoFactory.decimalTypeInfo); + TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, - TypeInfoFactory.decimalTypeInfo); + TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.doubleTypeInfo); @@ -326,9 +326,9 @@ public void testCommonClassUnionAll() { unionAll(TypeInfoFactory.intTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.decimalTypeInfo); unionAll(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, - TypeInfoFactory.decimalTypeInfo); + TypeInfoFactory.stringTypeInfo); unionAll(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, - TypeInfoFactory.decimalTypeInfo); + TypeInfoFactory.doubleTypeInfo); unionAll(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); @@ -364,15 +364,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/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMinus.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMinus.java index 771a6c7..b060877 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMinus.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMinus.java @@ -224,7 +224,7 @@ public void testReturnTypeBackwardCompat() throws Exception { verifyReturnType(new GenericUDFOPMinus(), "float", "float", "float"); verifyReturnType(new GenericUDFOPMinus(), "float", "double", "double"); - verifyReturnType(new GenericUDFOPMinus(), "float", "decimal(10,2)", "double"); + verifyReturnType(new GenericUDFOPMinus(), "float", "decimal(10,2)", "float"); verifyReturnType(new GenericUDFOPMinus(), "double", "double", "double"); verifyReturnType(new GenericUDFOPMinus(), "double", "decimal(10,2)", "double"); @@ -246,7 +246,7 @@ public void testReturnTypeAnsiSql() throws Exception { verifyReturnType(new GenericUDFOPMinus(), "float", "float", "float"); verifyReturnType(new GenericUDFOPMinus(), "float", "double", "double"); - verifyReturnType(new GenericUDFOPMinus(), "float", "decimal(10,2)", "double"); + verifyReturnType(new GenericUDFOPMinus(), "float", "decimal(10,2)", "float"); verifyReturnType(new GenericUDFOPMinus(), "double", "double", "double"); verifyReturnType(new GenericUDFOPMinus(), "double", "decimal(10,2)", "double"); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMultiply.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMultiply.java index 696682f..e342a76 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMultiply.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPMultiply.java @@ -215,7 +215,7 @@ public void testReturnTypeBackwardCompat() throws Exception { verifyReturnType(new GenericUDFOPMultiply(), "float", "float", "float"); verifyReturnType(new GenericUDFOPMultiply(), "float", "double", "double"); - verifyReturnType(new GenericUDFOPMultiply(), "float", "decimal(10,2)", "double"); + verifyReturnType(new GenericUDFOPMultiply(), "float", "decimal(10,2)", "float"); verifyReturnType(new GenericUDFOPMultiply(), "double", "double", "double"); verifyReturnType(new GenericUDFOPMultiply(), "double", "decimal(10,2)", "double"); @@ -237,7 +237,7 @@ public void testReturnTypeAnsiSql() throws Exception { verifyReturnType(new GenericUDFOPMultiply(), "float", "float", "float"); verifyReturnType(new GenericUDFOPMultiply(), "float", "double", "double"); - verifyReturnType(new GenericUDFOPMultiply(), "float", "decimal(10,2)", "double"); + verifyReturnType(new GenericUDFOPMultiply(), "float", "decimal(10,2)", "float"); verifyReturnType(new GenericUDFOPMultiply(), "double", "double", "double"); verifyReturnType(new GenericUDFOPMultiply(), "double", "decimal(10,2)", "double"); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPPlus.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPPlus.java index eba4894..b49f6ef 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPPlus.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFOPPlus.java @@ -230,7 +230,7 @@ public void testReturnTypeBackwardCompat() throws Exception { verifyReturnType(new GenericUDFOPPlus(), "float", "float", "float"); verifyReturnType(new GenericUDFOPPlus(), "float", "double", "double"); - verifyReturnType(new GenericUDFOPPlus(), "float", "decimal(10,2)", "double"); + verifyReturnType(new GenericUDFOPPlus(), "float", "decimal(10,2)", "float"); verifyReturnType(new GenericUDFOPPlus(), "double", "double", "double"); verifyReturnType(new GenericUDFOPPlus(), "double", "decimal(10,2)", "double"); @@ -252,7 +252,7 @@ public void testReturnTypeAnsiSql() throws Exception { verifyReturnType(new GenericUDFOPPlus(), "float", "float", "float"); verifyReturnType(new GenericUDFOPPlus(), "float", "double", "double"); - verifyReturnType(new GenericUDFOPPlus(), "float", "decimal(10,2)", "double"); + verifyReturnType(new GenericUDFOPPlus(), "float", "decimal(10,2)", "float"); verifyReturnType(new GenericUDFOPPlus(), "double", "double", "double"); verifyReturnType(new GenericUDFOPPlus(), "double", "decimal(10,2)", "double"); diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java index d3bb4e4..066d344 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java @@ -68,9 +68,9 @@ registerNumericType(PrimitiveCategory.SHORT, 2); registerNumericType(PrimitiveCategory.INT, 3); registerNumericType(PrimitiveCategory.LONG, 4); - registerNumericType(PrimitiveCategory.FLOAT, 5); - registerNumericType(PrimitiveCategory.DOUBLE, 6); - registerNumericType(PrimitiveCategory.DECIMAL, 7); + registerNumericType(PrimitiveCategory.DECIMAL, 5); + registerNumericType(PrimitiveCategory.FLOAT, 6); + registerNumericType(PrimitiveCategory.DOUBLE, 7); registerNumericType(PrimitiveCategory.STRING, 8); } @@ -885,10 +885,7 @@ public static boolean implicitConvertible(PrimitiveCategory from, PrimitiveCateg if (fromPg == PrimitiveGrouping.STRING_GROUP && to == PrimitiveCategory.DOUBLE) { return true; } - // Allow implicit String to Decimal conversion - if (fromPg == PrimitiveGrouping.STRING_GROUP && to == PrimitiveCategory.DECIMAL) { - return true; - } + // Void can be converted to any type if (from == PrimitiveCategory.VOID) { return true; -- 1.7.12.4 (Apple Git-37)