diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java index ce6adc4a6b..a1bbf42cdf 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java @@ -1664,6 +1664,9 @@ private boolean checkExprNodeDescForDecimal64(ExprNodeDesc exprNodeDesc) throws GenericUDF udf = ((ExprNodeGenericFuncDesc) exprNodeDesc).getGenericUDF(); Class udfClass = udf.getClass(); + if(udf instanceof GenericUDFToDecimal) { + return true; + } // We have a class-level annotation that says whether the UDF's vectorization expressions // support Decimal64. VectorizedExpressionsSupportDecimal64 annotation = @@ -1744,8 +1747,8 @@ private VectorExpression getDecimal64VectorExpressionForUdf(GenericUDF genericUd if (!isDecimal64ScaleEstablished) { decimal64ColumnScale = decimalTypeInfo.getScale(); isDecimal64ScaleEstablished = true; - } else if (decimalTypeInfo.getScale() != decimal64ColumnScale) { - return null; + } else if (decimalTypeInfo.getScale() > decimal64ColumnScale) { + decimal64ColumnScale = decimalTypeInfo.getScale(); } } builder.setInputExpressionType(i, InputExpressionType.COLUMN); @@ -1788,8 +1791,6 @@ private VectorExpression getDecimal64VectorExpressionForUdf(GenericUDF genericUd if((leftType.precision() + returnDecimalTypeInfo.getScale()) > 18) { return null; } - } else if (returnDecimalTypeInfo.getScale() != decimal64ColumnScale) { - return null; } returnDataTypePhysicalVariation = DataTypePhysicalVariation.DECIMAL_64; } else if (returnTypeInfo instanceof DecimalTypeInfo){ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDivide.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDivide.java index 0c0ce68311..dfee4115b2 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDivide.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPDivide.java @@ -22,6 +22,7 @@ import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressionsSupportDecimal64; import org.apache.hadoop.hive.ql.exec.vector.expressions.LongColDivideLongColumn; import org.apache.hadoop.hive.ql.exec.vector.expressions.LongColDivideLongScalar; import org.apache.hadoop.hive.ql.exec.vector.expressions.LongScalarDivideLongColumn; @@ -50,6 +51,7 @@ DecimalColDivideDecimalColumn.class, DecimalColDivideDecimalScalar.class, DecimalScalarDivideDecimalColumn.class, Decimal64ColDivideDecimal64Scalar.class, Decimal64ColDivideDecimal64Column.class}) +@VectorizedExpressionsSupportDecimal64() public class GenericUDFOPDivide extends GenericUDFBaseNumeric { public GenericUDFOPDivide() { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPMultiply.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPMultiply.java index 616641d2f0..ceb884f226 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPMultiply.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPMultiply.java @@ -21,6 +21,7 @@ import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressionsSupportDecimal64; import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.*; import org.apache.hadoop.hive.serde2.io.ByteWritable; import org.apache.hadoop.hive.serde2.io.DoubleWritable; @@ -46,7 +47,9 @@ DoubleScalarMultiplyLongColumn.class, DoubleScalarMultiplyDoubleColumn.class, DoubleScalarMultiplyLongColumnChecked.class, DoubleScalarMultiplyDoubleColumnChecked.class, DecimalColMultiplyDecimalColumn.class, DecimalColMultiplyDecimalScalar.class, - DecimalScalarMultiplyDecimalColumn.class}) + DecimalScalarMultiplyDecimalColumn.class, Decimal64ColMultiplyDecimal64Scalar.class, + Decimal64ColMultiplyDecimal64Column.class}) +@VectorizedExpressionsSupportDecimal64() public class GenericUDFOPMultiply extends GenericUDFBaseNumeric { public GenericUDFOPMultiply() { diff --git a/vector-code-gen/src/org/apache/hadoop/hive/tools/GenVectorCode.java b/vector-code-gen/src/org/apache/hadoop/hive/tools/GenVectorCode.java index 82fc1415de..cf135f0370 100644 --- a/vector-code-gen/src/org/apache/hadoop/hive/tools/GenVectorCode.java +++ b/vector-code-gen/src/org/apache/hadoop/hive/tools/GenVectorCode.java @@ -309,12 +309,15 @@ {"Decimal64ColumnArithmeticDecimal64Scalar", "Add", "+"}, {"Decimal64ColumnArithmeticDecimal64Scalar", "Subtract", "-"}, + {"Decimal64ColumnArithmeticDecimal64Scalar", "Multiply", "*"}, {"Decimal64ScalarArithmeticDecimal64Column", "Add", "+"}, {"Decimal64ScalarArithmeticDecimal64Column", "Subtract", "-"}, + {"Decimal64ScalarArithmeticDecimal64Column", "Multiply", "*"}, {"Decimal64ColumnArithmeticDecimal64Column", "Add", "+"}, {"Decimal64ColumnArithmeticDecimal64Column", "Subtract", "-"}, + {"Decimal64ColumnArithmeticDecimal64Column", "Multiply", "*"}, {"Decimal64ColumnDivideDecimal64Scalar", "Divide", "/"}, {"Decimal64ColumnDivideDecimal64Column", "Divide", "/"},