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 bc19eb50a1..8e7923882e 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 @@ -1671,6 +1671,9 @@ private boolean checkExprNodeDescForDecimal64(ExprNodeDesc exprNodeDesc) throws if (annotation == null) { return false; } + if(udf instanceof GenericUDFToDecimal) { + return true; + } // Carefully check the children to make sure they are Decimal64. List children = exprNodeDesc.getChildren(); @@ -1739,15 +1742,6 @@ private VectorExpression getDecimal64VectorExpressionForUdf(GenericUDF genericUd TypeInfo typeInfo = childExpr.getTypeInfo(); if (childExpr instanceof ExprNodeGenericFuncDesc || childExpr instanceof ExprNodeColumnDesc) { - if (isExprDecimal64) { - DecimalTypeInfo decimalTypeInfo = (DecimalTypeInfo) typeInfo; - if (!isDecimal64ScaleEstablished) { - decimal64ColumnScale = decimalTypeInfo.getScale(); - isDecimal64ScaleEstablished = true; - } else if (decimalTypeInfo.getScale() != decimal64ColumnScale) { - return null; - } - } builder.setInputExpressionType(i, InputExpressionType.COLUMN); } else if (childExpr instanceof ExprNodeConstantDesc) { if (isNullConst(childExpr)) { @@ -1778,10 +1772,9 @@ private VectorExpression getDecimal64VectorExpressionForUdf(GenericUDF genericUd final DataTypePhysicalVariation returnDataTypePhysicalVariation; if (isReturnDecimal64) { DecimalTypeInfo returnDecimalTypeInfo = (DecimalTypeInfo) returnTypeInfo; - if (!isDecimal64ScaleEstablished) { - decimal64ColumnScale = returnDecimalTypeInfo.getScale(); - isDecimal64ScaleEstablished = true; - } else if (genericUdf instanceof GenericUDFOPDivide) { + decimal64ColumnScale = returnDecimalTypeInfo.getScale(); + isDecimal64ScaleEstablished = true; + if (genericUdf instanceof GenericUDFOPDivide) { // Check possible addition of long numbers overflow during decimal64 division // if yes then skip the optimization DecimalTypeInfo leftType = (DecimalTypeInfo)childExprs.get(0).getTypeInfo(); @@ -1789,8 +1782,6 @@ private VectorExpression getDecimal64VectorExpressionForUdf(GenericUDF genericUd if (leftType.precision() > 17 || rightType.precision() > 17) { 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 a4c2475120..d1ee64ca6f 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; @@ -49,6 +50,7 @@ DoubleScalarDivideLongColumn.class, DoubleScalarDivideDoubleColumn.class, DecimalColDivideDecimalColumn.class, DecimalColDivideDecimalScalar.class, DecimalScalarDivideDecimalColumn.class, Decimal64ColDivideDecimal64Scalar.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/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java index 1d92927e8c..bd734f8071 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDecimal.java @@ -20,6 +20,7 @@ import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressionsSupportDecimal64; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.SettableUDF; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; @@ -31,6 +32,7 @@ import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; @Description(name = "decimal", value = "_FUNC_(a) - cast a to decimal") +@VectorizedExpressionsSupportDecimal64() public class GenericUDFToDecimal extends GenericUDF implements SettableUDF { private transient PrimitiveObjectInspector argumentOI; 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 83cd48c578..37b478da6e 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", "/"},