From d9a71d6f9cd267ce20072381002ba6b78bb63961 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 --- .../org/apache/hadoop/hive/ql/udf/UDFSign.java | 15 +++++++++++++ .../hadoop/hive/ql/exec/TestFunctionRegistry.java | 26 +++++++++++----------- .../hive/ql/udf/generic/TestGenericUDFOPMinus.java | 4 ++-- .../ql/udf/generic/TestGenericUDFOPMultiply.java | 4 ++-- .../hive/ql/udf/generic/TestGenericUDFOPPlus.java | 4 ++-- .../clientpositive/alter_partition_change_col.q | 1 + .../queries/clientpositive/alter_table_cascade.q | 1 + .../test/results/clientpositive/perf/query32.q.out | 2 +- .../test/results/clientpositive/perf/query65.q.out | 2 +- .../test/results/clientpositive/perf/query75.q.out | 2 +- .../test/results/clientpositive/perf/query89.q.out | 8 +++---- .../tez/vector_decimal_expressions.q.out | 2 +- .../test/results/clientpositive/udf_greatest.q.out | 4 ++-- ql/src/test/results/clientpositive/udf_least.q.out | 4 ++-- .../vector_decimal_expressions.q.out | 2 +- .../hadoop/hive/serde2/typeinfo/TypeInfoUtils.java | 11 ++++----- 16 files changed, 53 insertions(+), 39 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSign.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSign.java index 022b130..67d62d9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSign.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSign.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hive.serde2.io.DoubleWritable; import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.LongWritable; @Description(name = "sign", value = "_FUNC_(x) - returns the sign of x )", @@ -57,6 +58,20 @@ public DoubleWritable evaluate(DoubleWritable a) { return result; } + public DoubleWritable evaluate(LongWritable a) { + if (a == null) { + return null; + } + if (a.get() == 0) { + result.set(0); + } else if (a.get() > 0) { + result.set(1); + } else { + result.set(-1); + } + return result; + } + /** * Get the sign of the decimal input * 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 8488c21..59ecd1e 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); @@ -330,9 +330,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); 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/ql/src/test/queries/clientpositive/alter_partition_change_col.q b/ql/src/test/queries/clientpositive/alter_partition_change_col.q index 6861ca2..360f4d2 100644 --- a/ql/src/test/queries/clientpositive/alter_partition_change_col.q +++ b/ql/src/test/queries/clientpositive/alter_partition_change_col.q @@ -1,3 +1,4 @@ +set hive.metastore.disallow.incompatible.col.type.changes=false; SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; diff --git a/ql/src/test/queries/clientpositive/alter_table_cascade.q b/ql/src/test/queries/clientpositive/alter_table_cascade.q index 479fda4..acca4e8 100644 --- a/ql/src/test/queries/clientpositive/alter_table_cascade.q +++ b/ql/src/test/queries/clientpositive/alter_table_cascade.q @@ -1,3 +1,4 @@ +set hive.metastore.disallow.incompatible.col.type.changes=false; SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; diff --git a/ql/src/test/results/clientpositive/perf/query32.q.out b/ql/src/test/results/clientpositive/perf/query32.q.out index f9cfd69..7cfda2f 100644 --- a/ql/src/test/results/clientpositive/perf/query32.q.out +++ b/ql/src/test/results/clientpositive/perf/query32.q.out @@ -60,7 +60,7 @@ Stage-0 Select Operator [SEL_32] (rows=169400 width=1436) Output:["_col1"] Filter Operator [FIL_31] (rows=169400 width=1436) - predicate:(_col1 > CAST( _col5 AS decimal(20,15))) + predicate:(UDFToDouble(_col1) > _col5) Merge Join Operator [MERGEJOIN_59] (rows=508200 width=1436) Conds:RS_27._col0=RS_28._col0(Inner),RS_28._col0=RS_29._col0(Inner),Output:["_col1","_col5"] <-Map 6 [SIMPLE_EDGE] diff --git a/ql/src/test/results/clientpositive/perf/query65.q.out b/ql/src/test/results/clientpositive/perf/query65.q.out index 37bb1b3..a57bb85 100644 --- a/ql/src/test/results/clientpositive/perf/query65.q.out +++ b/ql/src/test/results/clientpositive/perf/query65.q.out @@ -102,7 +102,7 @@ Stage-0 Select Operator [SEL_49] (rows=372680 width=1436) Output:["_col0","_col1","_col2","_col3","_col4","_col5"] Filter Operator [FIL_48] (rows=372680 width=1436) - predicate:(_col11 <= CAST( (0.1 * UDFToDouble(_col8)) AS decimal(30,15))) + predicate:(UDFToDouble(_col11) <= (0.1 * UDFToDouble(_col8))) Merge Join Operator [MERGEJOIN_73] (rows=1118040 width=1436) Conds:RS_45._col7, _col0, _col2=RS_46._col0, _col0, _col1(Inner),Output:["_col1","_col3","_col4","_col5","_col6","_col8","_col11"] <-Reducer 13 [SIMPLE_EDGE] diff --git a/ql/src/test/results/clientpositive/perf/query75.q.out b/ql/src/test/results/clientpositive/perf/query75.q.out index 25a8776..82a382e 100644 --- a/ql/src/test/results/clientpositive/perf/query75.q.out +++ b/ql/src/test/results/clientpositive/perf/query75.q.out @@ -43,7 +43,7 @@ Stage-0 Select Operator [SEL_152] (rows=169103 width=1436) Output:["_col0","_col1","_col2","_col3","_col4","_col5","_col6","_col7","_col8","_col9"] Filter Operator [FIL_151] (rows=169103 width=1436) - predicate:((CAST( _col5 AS decimal(17,2)) / CAST( _col12 AS decimal(17,2))) < 0.9) + predicate:(UDFToDouble((CAST( _col5 AS decimal(17,2)) / CAST( _col12 AS decimal(17,2)))) < 0.9) Merge Join Operator [MERGEJOIN_259] (rows=507310 width=1436) Conds:RS_148._col1, _col2, _col3, _col4=RS_149._col1, _col2, _col3, _col4(Inner),Output:["_col0","_col1","_col2","_col3","_col4","_col5","_col6","_col7","_col12","_col13"] <-Reducer 31 [SIMPLE_EDGE] diff --git a/ql/src/test/results/clientpositive/perf/query89.q.out b/ql/src/test/results/clientpositive/perf/query89.q.out index 0cda449..d821964 100644 --- a/ql/src/test/results/clientpositive/perf/query89.q.out +++ b/ql/src/test/results/clientpositive/perf/query89.q.out @@ -70,14 +70,14 @@ Stage-0 File Output Operator [FS_36] Limit [LIM_35] (rows=100 width=1436) Number of rows:100 - Select Operator [SEL_34] (rows=76865 width=1436) + Select Operator [SEL_34] (rows=51243 width=1436) Output:["_col0","_col1","_col2","_col3","_col4","_col5","_col6","_col7"] <-Reducer 6 [SIMPLE_EDGE] SHUFFLE [RS_33] - Select Operator [SEL_30] (rows=76865 width=1436) + Select Operator [SEL_30] (rows=51243 width=1436) Output:["_col0","_col1","_col2","_col3","_col4","_col5","_col6","_col7"] - Filter Operator [FIL_46] (rows=76865 width=1436) - predicate:CASE WHEN ((avg_window_0 <> 0)) THEN (((abs((_col6 - avg_window_0)) / avg_window_0) > 0.1)) ELSE (null) END + Filter Operator [FIL_46] (rows=51243 width=1436) + predicate:(UDFToDouble(CASE WHEN ((avg_window_0 <> 0)) THEN ((abs((_col6 - avg_window_0)) / avg_window_0)) ELSE (null) END) > 0.1) Select Operator [SEL_29] (rows=153730 width=1436) Output:["avg_window_0","_col0","_col1","_col2","_col3","_col4","_col5","_col6"] PTF Operator [PTF_28] (rows=153730 width=1436) diff --git a/ql/src/test/results/clientpositive/tez/vector_decimal_expressions.q.out b/ql/src/test/results/clientpositive/tez/vector_decimal_expressions.q.out index 2976cb5..7500210 100644 --- a/ql/src/test/results/clientpositive/tez/vector_decimal_expressions.q.out +++ b/ql/src/test/results/clientpositive/tez/vector_decimal_expressions.q.out @@ -41,7 +41,7 @@ STAGE PLANS: alias: decimal_test Statistics: Num rows: 12288 Data size: 2128368 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (((((cdecimal1 > 0) and (cdecimal1 < 12345.5678)) and (cdecimal2 <> 0)) and (cdecimal2 > 1000)) and cdouble is not null) (type: boolean) + predicate: (((((cdecimal1 > 0) and (UDFToDouble(cdecimal1) < 12345.5678)) and (cdecimal2 <> 0)) and (cdecimal2 > 1000)) and cdouble is not null) (type: boolean) Statistics: Num rows: 455 Data size: 78809 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: (cdecimal1 + cdecimal2) (type: decimal(25,14)), (cdecimal1 - (2 * cdecimal2)) (type: decimal(26,14)), ((UDFToDouble(cdecimal1) + 2.34) / UDFToDouble(cdecimal2)) (type: double), (UDFToDouble(cdecimal1) * (UDFToDouble(cdecimal2) / 3.4)) (type: double), (cdecimal1 % 10) (type: decimal(12,10)), UDFToInteger(cdecimal1) (type: int), UDFToShort(cdecimal2) (type: smallint), UDFToByte(cdecimal2) (type: tinyint), UDFToLong(cdecimal1) (type: bigint), UDFToBoolean(cdecimal1) (type: boolean), UDFToDouble(cdecimal2) (type: double), UDFToFloat(cdecimal1) (type: float), UDFToString(cdecimal2) (type: string), CAST( cdecimal1 AS TIMESTAMP) (type: timestamp) diff --git a/ql/src/test/results/clientpositive/udf_greatest.q.out b/ql/src/test/results/clientpositive/udf_greatest.q.out index 47cfb3f..7c7e67a 100644 --- a/ql/src/test/results/clientpositive/udf_greatest.q.out +++ b/ql/src/test/results/clientpositive/udf_greatest.q.out @@ -183,7 +183,7 @@ FROM src tablesample (1 rows) POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -1.1 1.1 1 NULL +1.100000023841858 1.1 1.0 NULL PREHOOK: query: SELECT GREATEST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)), GREATEST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)), GREATEST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal)) @@ -198,7 +198,7 @@ FROM src tablesample (1 rows) POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -1 100 NULL +1.0 100.0 NULL PREHOOK: query: SELECT GREATEST(10L, 'a', date('2001-01-28')) FROM src tablesample (1 rows) PREHOOK: type: QUERY diff --git a/ql/src/test/results/clientpositive/udf_least.q.out b/ql/src/test/results/clientpositive/udf_least.q.out index 2363abe..497370e 100644 --- a/ql/src/test/results/clientpositive/udf_least.q.out +++ b/ql/src/test/results/clientpositive/udf_least.q.out @@ -183,7 +183,7 @@ FROM src tablesample (1 rows) POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### --1.1 -1.1 -0.1 NULL +-1.1 -1.100000023841858 -0.1 NULL PREHOOK: query: SELECT LEAST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)), LEAST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)), LEAST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal)) @@ -198,7 +198,7 @@ FROM src tablesample (1 rows) POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### --100 -1 NULL +-100.0 -1.0 NULL PREHOOK: query: SELECT LEAST(10L, 'a', date('2001-01-28')) FROM src tablesample (1 rows) PREHOOK: type: QUERY diff --git a/ql/src/test/results/clientpositive/vector_decimal_expressions.q.out b/ql/src/test/results/clientpositive/vector_decimal_expressions.q.out index 3ca326d..ea23268 100644 --- a/ql/src/test/results/clientpositive/vector_decimal_expressions.q.out +++ b/ql/src/test/results/clientpositive/vector_decimal_expressions.q.out @@ -35,7 +35,7 @@ STAGE PLANS: alias: decimal_test Statistics: Num rows: 12288 Data size: 2128368 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (((((cdecimal1 > 0) and (cdecimal1 < 12345.5678)) and (cdecimal2 <> 0)) and (cdecimal2 > 1000)) and cdouble is not null) (type: boolean) + predicate: (((((cdecimal1 > 0) and (UDFToDouble(cdecimal1) < 12345.5678)) and (cdecimal2 <> 0)) and (cdecimal2 > 1000)) and cdouble is not null) (type: boolean) Statistics: Num rows: 455 Data size: 78809 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: (cdecimal1 + cdecimal2) (type: decimal(25,14)), (cdecimal1 - (2 * cdecimal2)) (type: decimal(26,14)), ((UDFToDouble(cdecimal1) + 2.34) / UDFToDouble(cdecimal2)) (type: double), (UDFToDouble(cdecimal1) * (UDFToDouble(cdecimal2) / 3.4)) (type: double), (cdecimal1 % 10) (type: decimal(12,10)), UDFToInteger(cdecimal1) (type: int), UDFToShort(cdecimal2) (type: smallint), UDFToByte(cdecimal2) (type: tinyint), UDFToLong(cdecimal1) (type: bigint), UDFToBoolean(cdecimal1) (type: boolean), UDFToDouble(cdecimal2) (type: double), UDFToFloat(cdecimal1) (type: float), UDFToString(cdecimal2) (type: string), CAST( cdecimal1 AS TIMESTAMP) (type: timestamp) 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)