You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2019/11/06 03:49:45 UTC

[hive] branch master updated: HIVE-22382 : Support Decimal64 column division with decimal64 Column (Ramesh Kumar via Gopal V)

This is an automated email from the ASF dual-hosted git repository.

hashutosh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new aac72eb  HIVE-22382 : Support Decimal64 column division with decimal64 Column (Ramesh Kumar via Gopal V)
aac72eb is described below

commit aac72eb50c5db5ba509dce4deb1069c4162791c0
Author: Ramesh Kumar Thangarajan <ra...@cloudera.com>
AuthorDate: Thu Oct 24 23:03:00 2019 -0700

    HIVE-22382 : Support Decimal64 column division with decimal64 Column (Ramesh Kumar via Gopal V)
    
    Signed-off-by: Ashutosh Chauhan <ha...@apache.org>
---
 .../test/resources/testconfiguration.properties    |   1 +
 ...xt => Decimal64ColumnDivideDecimal64Column.txt} | 245 +++++++++++----------
 .../Decimal64ColumnDivideDecimal64Scalar.txt       |  53 ++---
 .../hive/ql/exec/vector/VectorizationContext.java  |   5 +-
 .../hive/ql/udf/generic/GenericUDFOPDivide.java    |   3 +-
 .../vector_decimal64_div_decimal64column.q         |   6 +
 .../vector_decimal64_div_decimal64scalar.q         |  16 +-
 .../vector_decimal64_div_decimal64column.q.out     | 170 ++++++++++++++
 .../vector_decimal64_div_decimal64scalar.q.out     |  80 +++----
 .../clientpositive/llap/vector_decimal_udf.q.out   |  12 +-
 .../vector_decimal64_div_decimal64column.q.out     | 142 ++++++++++++
 .../vector_decimal64_div_decimal64scalar.q.out     |  80 +++----
 .../apache/hadoop/hive/tools/GenVectorCode.java    |   3 +
 13 files changed, 574 insertions(+), 242 deletions(-)

diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index d49563b..e60c4c5 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -259,6 +259,7 @@ minillaplocal.shared.query.files=alter_merge_2_orc.q,\
   vector_data_types.q,\
   vector_date_1.q,\
   vector_decimal64_div_decimal64scalar.q,\
+  vector_decimal64_div_decimal64column.q,\
   vector_decimal_1.q,\
   vector_decimal_10_0.q,\
   vector_decimal_2.q,\
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt b/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Column.txt
similarity index 52%
copy from ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt
copy to ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Column.txt
index d420e22..01da31c 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Column.txt
@@ -20,20 +20,20 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions.gen;
 
 import java.util.Arrays;
 
+import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
 import org.apache.hadoop.hive.ql.exec.vector.Decimal64ColumnVector;
-import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil;
 import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.Decimal64Util;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression;
-import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
 import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo;
-import org.apache.hadoop.hive.common.type.HiveDecimal;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 
 /**
- * Generated from template Decimal64ColumnDivideDecimal64Scalar.txt, which covers decimal64 arithmetic
- * expressions between a column and a scalar.
+ * Generated from template Decimal64ColumnArithmeticDecimal64Column.txt, which covers
+ * decimal64 arithmetic expressions between columns.
  */
 public class <ClassName> extends VectorExpression {
 
@@ -43,46 +43,46 @@ public class <ClassName> extends VectorExpression {
     1L,                   // 0
     10L,
     100L,
-    1000L,
-    10000L,
-    100000L,
-    1000000L,
-    10000000L,
-    100000000L,           // 8
-    1000000000L,
-    10000000000L,
-    100000000000L,
-    1000000000000L,
-    10000000000000L,
-    100000000000000L,
-    1000000000000000L,
-    10000000000000000L,   // 16
-    100000000000000000L,
-    1000000000000000000L, // 18
+    1_000L,
+    10_000L,
+    100_000L,
+    1_000_000L,
+    10_000_000L,
+    100_000_000L,           // 8
+    1_000_000_000L,
+    10_000_000_000L,
+    100_000_000_000L,
+    1_000_000_000_000L,
+    10_000_000_000_000L,
+    100_000_000_000_000L,
+    1_000_000_000_000_000L,
+    10_000_000_000_000_000L,   // 16
+    100_000_000_000_000_000L,
+    1_000_000_000_000_000_000L, // 18
   };
 
-  private final int colNum;
-  private final long value;
+  private final int colNum1;
+  private final int colNum2;
 
-  public <ClassName>(int colNum, long value, int outputColumnNum) {
+  public <ClassName>(int colNum1, int colNum2, int outputColumnNum) {
     super(outputColumnNum);
-    this.colNum = colNum;
-    this.value = value;
+    this.colNum1 = colNum1;
+    this.colNum2 = colNum2;
   }
 
   public <ClassName>() {
     super();
 
     // Dummy final assignments.
-    colNum = -1;
-    value = 0;
+    colNum1 = -1;
+    colNum2 = -1;
   }
 
   /*
    * Division that rounds up if the subsequent digits are greater than half.
    * Sign of the result will depend on the both x and y.
-   * If x and y have different sign, then the result is multiplied by -1
-   * If x and y have same sign, then the result is unchanged
+   * If x and y have different sign, then the result is multiplied by -1.
+   * If x and y have same sign, then the result is always positive.
    */
   private long roundingDivision(long divident, long divisor) {
     final long absDivident = Math.abs(divident);
@@ -113,85 +113,103 @@ public class <ClassName> extends VectorExpression {
       super.evaluateChildren(batch);
     }
 
-    Decimal64ColumnVector inputColVector = (Decimal64ColumnVector) batch.cols[colNum];
+    Decimal64ColumnVector inputColVector1 = (Decimal64ColumnVector) batch.cols[colNum1];
+    Decimal64ColumnVector inputColVector2 = (Decimal64ColumnVector) batch.cols[colNum2];
     Decimal64ColumnVector outputColVector = (Decimal64ColumnVector) batch.cols[outputColumnNum];
     int[] sel = batch.selected;
-    boolean[] inputIsNull = inputColVector.isNull;
-    boolean[] outputIsNull = outputColVector.isNull;
 
-    // We do not need to do a column reset since we are carefully changing the output.
-    outputColVector.isRepeating = false;
-
-    long[] vector = inputColVector.vector;
+    long[] vector1 = inputColVector1.vector;
+    long[] vector2 = inputColVector2.vector;
     long[] outputVector = outputColVector.vector;
+    boolean[] outputIsNull = outputColVector.isNull;
+    int outputScale = ((DecimalTypeInfo) outputTypeInfo).scale();
+    long scaleFactor = powerOfTenTable[outputScale];
 
     final long outputDecimal64AbsMax =
         HiveDecimalWritable.getDecimal64AbsMax(outputColVector.precision);
-    int outputScale = ((DecimalTypeInfo) outputTypeInfo).scale();
 
-    if (value == 0) {
-      // Denominator is zero, convert the batch to nulls
-      outputColVector.noNulls = false;
-      outputColVector.isRepeating = true;
-      outputIsNull[0] = true;
-      NullUtil.setNullOutputEntriesColScalar(outputColVector, batch.selectedInUse, sel, n);
-      return;
-    } else if (inputColVector.isRepeating) {
-      if (inputColVector.noNulls || !inputIsNull[0]) {
-        outputIsNull[0] = false;
-        // The following may override a "false" null setting if an error or overflow occurs.
-        final long result = roundingDivision(vector[0] * powerOfTenTable[outputScale], value);
-        if (Math.abs(result) > outputDecimal64AbsMax) {
-          outputIsNull[0] = true;
-          outputColVector.noNulls = false;
-        } else {
-          outputVector[0] = result;
-        }
-      } else {
-        outputIsNull[0] = true;
+    /*
+     * Propagate null values for a two-input operator and set isRepeating and noNulls appropriately.
+     */
+    NullUtil.propagateNullsColCol(
+        inputColVector1, inputColVector2, outputColVector, sel, n, batch.selectedInUse);
+
+    /*
+     * Disregard nulls for processing. In other words,
+     * the arithmetic operation is performed even if one or
+     * more inputs are null. This is to improve speed by avoiding
+     * conditional checks in the inner loop.
+     */
+    if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
+      if(vector2[0] == 0) {   
         outputColVector.noNulls = false;
+        outputColVector.isRepeating = true;
+        Arrays.fill(outputIsNull, true);
+        NullUtil.setNullOutputEntriesColScalar(outputColVector, batch.selectedInUse, sel, n);
+        return;
       }
-      outputColVector.isRepeating = true;
-      return;
-    }
-
-    if (inputColVector.noNulls) {
+      final long result = roundingDivision(vector1[0] * scaleFactor, vector2[0]);
+      outputVector[0] = result;
+      if (Math.abs(result) > outputDecimal64AbsMax) {
+        outputColVector.noNulls = false;
+        outputIsNull[0] = true;
+      }
+    } else if (inputColVector1.isRepeating) {
+      final long repeatedValue1 = vector1[0];
       if (batch.selectedInUse) {
-
-         // CONSIDER: For large n, fill n or all of isNull array and use the tighter ELSE loop.
-
-         if (!outputColVector.noNulls) {
-           for(int j = 0; j != n; j++) {
-            final int i = sel[j];
-            outputIsNull[i] = false;
-            final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+        for(int j = 0; j != n; j++) {
+          int i = sel[j];
+          if(vector2[i] == 0) {
+            outputColVector.noNulls = false;
+            outputIsNull[i] = true;
+            outputVector[i] = LongColumnVector.NULL_VALUE;
+          } else {
+            final long result = roundingDivision(repeatedValue1 * scaleFactor, vector2[i]);
             outputVector[i] = result;
             if (Math.abs(result) > outputDecimal64AbsMax) {
               outputColVector.noNulls = false;
               outputIsNull[i] = true;
             }
           }
-         } else {
-           for(int j = 0; j != n; j++) {
-             final int i = sel[j];
-             final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
-             outputVector[i] = result;
-             if (Math.abs(result) > outputDecimal64AbsMax) {
-               outputColVector.noNulls = false;
-               outputIsNull[i] = true;
-             }
-           }
-         }
+        }
       } else {
-        if (!outputColVector.noNulls) {
-
-          // Assume it is almost always a performance win to fill all of isNull so we can
-          // safely reset noNulls.
-          Arrays.fill(outputIsNull, false);
-          outputColVector.noNulls = true;
+        for(int i = 0; i != n; i++) {
+          if(vector2[i] == 0) {
+            outputColVector.noNulls = false;
+            outputIsNull[i] = true;
+            outputVector[i] = LongColumnVector.NULL_VALUE;
+          } else {
+            final long result = roundingDivision(repeatedValue1 * scaleFactor, vector2[i]);
+            outputVector[i] = result;
+            if (Math.abs(result) > outputDecimal64AbsMax) {
+              outputColVector.noNulls = false;
+              outputIsNull[i] = true;
+            }
+          }
+        }
+      }
+    } else if (inputColVector2.isRepeating) {
+      final long repeatedValue2 = vector2[0];
+      if(repeatedValue2 == 0) {
+        outputColVector.noNulls = false;
+        outputColVector.isRepeating = true;
+        Arrays.fill(outputIsNull, true);
+        NullUtil.setNullOutputEntriesColScalar(outputColVector, batch.selectedInUse, sel, n);
+        return;
+      }
+      if (batch.selectedInUse) {
+        for(int j = 0; j != n; j++) {
+          int i = sel[j];
+          final long result = roundingDivision(vector1[i] * scaleFactor, repeatedValue2);
+          outputVector[i] = result;
+          if (Math.abs(result) > outputDecimal64AbsMax) {
+            outputColVector.noNulls = false;
+            outputIsNull[i] = true;
+          }
         }
+      } else {
         for(int i = 0; i != n; i++) {
-          final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+          final long result = roundingDivision(vector1[i] * scaleFactor, repeatedValue2);
           outputVector[i] = result;
           if (Math.abs(result) > outputDecimal64AbsMax) {
             outputColVector.noNulls = false;
@@ -199,57 +217,48 @@ public class <ClassName> extends VectorExpression {
           }
         }
       }
-    } else /* there are NULLs in the inputColVector */ {
-
-      /*
-       * Do careful maintenance of the outputColVector.noNulls flag.
-       */
-
+    } else {
       if (batch.selectedInUse) {
         for(int j = 0; j != n; j++) {
           int i = sel[j];
-          if (!inputIsNull[i]) {
-            outputIsNull[i] = false;
-            // The following may override a "false" null setting if an error or overflow occurs.
-            final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+          if(vector2[i] == 0) {
+            outputColVector.noNulls = false;
+            outputIsNull[i] = true;
+            outputVector[i] = LongColumnVector.NULL_VALUE;
+          } else {
+            final long result = roundingDivision(vector1[i] * scaleFactor, vector2[i]);
             outputVector[i] = result;
             if (Math.abs(result) > outputDecimal64AbsMax) {
-              outputIsNull[i] = true;
               outputColVector.noNulls = false;
+              outputIsNull[i] = true;
             }
-          } else {
-            outputIsNull[i] = true;
-            outputColVector.noNulls = false;
           }
         }
       } else {
-        System.arraycopy(inputIsNull, 0, outputIsNull, 0, n);
         for(int i = 0; i != n; i++) {
-          if (!inputIsNull[i]) {
-            outputIsNull[i] = false;
-            // The following may override a "false" null setting if an error or overflow occurs.
-            final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+          if(vector2[i] == 0) {
+            outputColVector.noNulls = false;
+            outputIsNull[i] = true;
+            outputVector[i] = LongColumnVector.NULL_VALUE;
+          } else {
+            final long result = roundingDivision(vector1[i] * scaleFactor, vector2[i]);
             outputVector[i] = result;
             if (Math.abs(result) > outputDecimal64AbsMax) {
-              outputIsNull[i] = true;
               outputColVector.noNulls = false;
+              outputIsNull[i] = true;
             }
-          } else {
-            outputIsNull[i] = true;
-            outputColVector.noNulls = false;
           }
         }
       }
     }
+
+    // Currently, we defer division, etc to regular HiveDecimal so we don't do any null
+    // default value setting here.
   }
 
   @Override
   public String vectorExpressionParameters() {
-    DecimalTypeInfo decimalTypeInfo = (DecimalTypeInfo) inputTypeInfos[0];
-    HiveDecimalWritable writable = new HiveDecimalWritable();
-    writable.deserialize64(value, decimalTypeInfo.scale());
-    return getColumnParamString(0, colNum) + ", decimal64Val " + value +
-        ", decimalVal " + writable.toString();
+    return getColumnParamString(0, colNum1) + ", " + getColumnParamString(1, colNum2);
   }
 
   @Override
@@ -263,6 +272,6 @@ public class <ClassName> extends VectorExpression {
             VectorExpressionDescriptor.ArgumentType.DECIMAL_64)
         .setInputExpressionTypes(
             VectorExpressionDescriptor.InputExpressionType.COLUMN,
-            VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
+            VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
   }
 }
diff --git a/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt b/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt
index d420e22..7b2a043 100644
--- a/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt
+++ b/ql/src/gen/vectorization/ExpressionTemplates/Decimal64ColumnDivideDecimal64Scalar.txt
@@ -43,22 +43,22 @@ public class <ClassName> extends VectorExpression {
     1L,                   // 0
     10L,
     100L,
-    1000L,
-    10000L,
-    100000L,
-    1000000L,
-    10000000L,
-    100000000L,           // 8
-    1000000000L,
-    10000000000L,
-    100000000000L,
-    1000000000000L,
-    10000000000000L,
-    100000000000000L,
-    1000000000000000L,
-    10000000000000000L,   // 16
-    100000000000000000L,
-    1000000000000000000L, // 18
+    1_000L,
+    10_000L,
+    100_000L,
+    1_000_000L,
+    10_000_000L,
+    100_000_000L,           // 8
+    1_000_000_000L,
+    10_000_000_000L,
+    100_000_000_000L,
+    1_000_000_000_000L,
+    10_000_000_000_000L,
+    100_000_000_000_000L,
+    1_000_000_000_000_000L,
+    10_000_000_000_000_000L,   // 16
+    100_000_000_000_000_000L,
+    1_000_000_000_000_000_000L, // 18
   };
 
   private final int colNum;
@@ -81,12 +81,11 @@ public class <ClassName> extends VectorExpression {
   /*
    * Division that rounds up if the subsequent digits are greater than half.
    * Sign of the result will depend on the both x and y.
-   * If x and y have different sign, then the result is multiplied by -1
-   * If x and y have same sign, then the result is unchanged
+   * If x and y have different sign, then the result is multiplied by -1.
+   * If x and y have same sign, the result is always positive.
    */
-  private long roundingDivision(long divident, long divisor) {
+  private long roundingDivision(long divident, long divisor, long absDivisor) {
     final long absDivident = Math.abs(divident);
-    final long absDivisor = Math.abs(divisor);
     final boolean differentSigns = (divident > 0) ^ (divisor > 0);
     final long remainder = absDivident % absDivisor;
     long result = absDivident  / absDivisor;
@@ -128,6 +127,8 @@ public class <ClassName> extends VectorExpression {
     final long outputDecimal64AbsMax =
         HiveDecimalWritable.getDecimal64AbsMax(outputColVector.precision);
     int outputScale = ((DecimalTypeInfo) outputTypeInfo).scale();
+    long scaleFactor = powerOfTenTable[outputScale];
+    long absValue = Math.abs(value);
 
     if (value == 0) {
       // Denominator is zero, convert the batch to nulls
@@ -140,7 +141,7 @@ public class <ClassName> extends VectorExpression {
       if (inputColVector.noNulls || !inputIsNull[0]) {
         outputIsNull[0] = false;
         // The following may override a "false" null setting if an error or overflow occurs.
-        final long result = roundingDivision(vector[0] * powerOfTenTable[outputScale], value);
+        final long result = roundingDivision(vector[0] * scaleFactor, value, absValue);
         if (Math.abs(result) > outputDecimal64AbsMax) {
           outputIsNull[0] = true;
           outputColVector.noNulls = false;
@@ -164,7 +165,7 @@ public class <ClassName> extends VectorExpression {
            for(int j = 0; j != n; j++) {
             final int i = sel[j];
             outputIsNull[i] = false;
-            final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+            final long result = roundingDivision(vector[i] * scaleFactor, value, absValue);
             outputVector[i] = result;
             if (Math.abs(result) > outputDecimal64AbsMax) {
               outputColVector.noNulls = false;
@@ -174,7 +175,7 @@ public class <ClassName> extends VectorExpression {
          } else {
            for(int j = 0; j != n; j++) {
              final int i = sel[j];
-             final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+             final long result = roundingDivision(vector[i] * scaleFactor, value, absValue);
              outputVector[i] = result;
              if (Math.abs(result) > outputDecimal64AbsMax) {
                outputColVector.noNulls = false;
@@ -191,7 +192,7 @@ public class <ClassName> extends VectorExpression {
           outputColVector.noNulls = true;
         }
         for(int i = 0; i != n; i++) {
-          final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+          final long result = roundingDivision(vector[i] * scaleFactor, value, absValue);
           outputVector[i] = result;
           if (Math.abs(result) > outputDecimal64AbsMax) {
             outputColVector.noNulls = false;
@@ -211,7 +212,7 @@ public class <ClassName> extends VectorExpression {
           if (!inputIsNull[i]) {
             outputIsNull[i] = false;
             // The following may override a "false" null setting if an error or overflow occurs.
-            final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+            final long result = roundingDivision(vector[i] * scaleFactor, value, absValue);
             outputVector[i] = result;
             if (Math.abs(result) > outputDecimal64AbsMax) {
               outputIsNull[i] = true;
@@ -228,7 +229,7 @@ public class <ClassName> extends VectorExpression {
           if (!inputIsNull[i]) {
             outputIsNull[i] = false;
             // The following may override a "false" null setting if an error or overflow occurs.
-            final long result = roundingDivision(vector[i] * powerOfTenTable[outputScale], value);
+            final long result = roundingDivision(vector[i] * scaleFactor, value, absValue);
             outputVector[i] = result;
             if (Math.abs(result) > outputDecimal64AbsMax) {
               outputIsNull[i] = true;
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 bc19eb5..ce6adc4 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
@@ -1782,11 +1782,10 @@ import com.google.common.annotations.VisibleForTesting;
         decimal64ColumnScale = returnDecimalTypeInfo.getScale();
         isDecimal64ScaleEstablished = true;
       } else if (genericUdf instanceof GenericUDFOPDivide) {
-        // Check possible addition of long numbers overflow during decimal64 division
+        // Check possible overflow during decimal64 division for intermediate result
         // if yes then skip the optimization
         DecimalTypeInfo leftType = (DecimalTypeInfo)childExprs.get(0).getTypeInfo();
-        DecimalTypeInfo rightType = (DecimalTypeInfo)childExprs.get(1).getTypeInfo();
-        if (leftType.precision() > 17 || rightType.precision() > 17) {
+        if((leftType.precision() + returnDecimalTypeInfo.getScale()) > 18) {
           return null;
         }
       } else if (returnDecimalTypeInfo.getScale() != decimal64ColumnScale) {
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 a4c2475..0c0ce68 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
@@ -48,7 +48,8 @@ import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
   LongScalarDivideLongColumn.class, LongScalarDivideDoubleColumn.class,
   DoubleScalarDivideLongColumn.class, DoubleScalarDivideDoubleColumn.class,
   DecimalColDivideDecimalColumn.class, DecimalColDivideDecimalScalar.class,
-  DecimalScalarDivideDecimalColumn.class, Decimal64ColDivideDecimal64Scalar.class})
+  DecimalScalarDivideDecimalColumn.class, Decimal64ColDivideDecimal64Scalar.class,
+  Decimal64ColDivideDecimal64Column.class})
 public class GenericUDFOPDivide extends GenericUDFBaseNumeric {
 
   public GenericUDFOPDivide() {
diff --git a/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64column.q b/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64column.q
new file mode 100644
index 0000000..34091f3
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64column.q
@@ -0,0 +1,6 @@
+create external table vector_decimal64_div_decimal64column(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
+LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64column;
+create table vector_decimal64_div_decimal64column_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC;
+insert into table vector_decimal64_div_decimal64column_tmp select * from vector_decimal64_div_decimal64column;
+explain vectorization detail select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp;
+select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp;
diff --git a/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64scalar.q b/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64scalar.q
index 02c08ab..220bdae 100644
--- a/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64scalar.q
+++ b/ql/src/test/queries/clientpositive/vector_decimal64_div_decimal64scalar.q
@@ -1,8 +1,8 @@
-create external table cdpd4378(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
-LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE cdpd4378;
-create table cdpd4378_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC;
-insert into table cdpd4378_tmp select * from cdpd4378;
-explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp;
-select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp;
-explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp;
-select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp;
+create external table vector_decimal64_div_decimal64scalar(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
+LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64scalar;
+create table vector_decimal64_div_decimal64scalar_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC;
+insert into table vector_decimal64_div_decimal64scalar_tmp select * from vector_decimal64_div_decimal64scalar;
+explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp;
+select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp;
+explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp;
+select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp;
diff --git a/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64column.q.out b/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64column.q.out
new file mode 100644
index 0000000..ff2b9e1
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64column.q.out
@@ -0,0 +1,170 @@
+PREHOOK: query: create external table vector_decimal64_div_decimal64column(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vector_decimal64_div_decimal64column
+POSTHOOK: query: create external table vector_decimal64_div_decimal64column(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64column
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@vector_decimal64_div_decimal64column
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64column
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column
+PREHOOK: query: create table vector_decimal64_div_decimal64column_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+POSTHOOK: query: create table vector_decimal64_div_decimal64column_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+PREHOOK: query: insert into table vector_decimal64_div_decimal64column_tmp select * from vector_decimal64_div_decimal64column
+PREHOOK: type: QUERY
+PREHOOK: Input: default@vector_decimal64_div_decimal64column
+PREHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+POSTHOOK: query: insert into table vector_decimal64_div_decimal64column_tmp select * from vector_decimal64_div_decimal64column
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@vector_decimal64_div_decimal64column
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_discount_amt SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_discount_amt, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_list_price SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_list_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_sales_price SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_sales_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_wholesale_cost SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_wholesale_cost, type:decimal(7,2), comment:null), ]
+PREHOOK: query: explain vectorization detail select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+PREHOOK: type: QUERY
+PREHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+POSTHOOK: query: explain vectorization detail select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+PLAN VECTORIZATION:
+  enabled: true
+  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Tez
+#### A masked pattern was here ####
+      Edges:
+        Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+      Vertices:
+        Map 1 
+            Map Operator Tree:
+                TableScan
+                  alias: vector_decimal64_div_decimal64column_tmp
+                  Statistics: Num rows: 1000 Data size: 224000 Basic stats: COMPLETE Column stats: COMPLETE
+                  TableScan Vectorization:
+                      native: true
+                      vectorizationSchemaColumns: [0:ss_ext_list_price:decimal(7,2)/DECIMAL_64, 1:ss_ext_wholesale_cost:decimal(7,2)/DECIMAL_64, 2:ss_ext_discount_amt:decimal(7,2)/DECIMAL_64, 3:ss_ext_sales_price:decimal(7,2)/DECIMAL_64, 4:ROW__ID:struct<writeid:bigint,bucketid:int,rowid:bigint>]
+                  Select Operator
+                    expressions: (ss_ext_list_price / ss_ext_discount_amt) (type: decimal(17,10))
+                    outputColumnNames: _col0
+                    Select Vectorization:
+                        className: VectorSelectOperator
+                        native: true
+                        projectedOutputColumnNums: [5]
+                        selectExpressions: Decimal64ColDivideDecimal64Column(col 0:decimal(7,2)/DECIMAL_64, col 2:decimal(7,2)/DECIMAL_64) -> 5:decimal(17,10)/DECIMAL_64
+                    Statistics: Num rows: 1000 Data size: 224000 Basic stats: COMPLETE Column stats: COMPLETE
+                    Group By Operator
+                      aggregations: sum(_col0)
+                      Group By Vectorization:
+                          aggregators: VectorUDAFSumDecimal64ToDecimal(col 5:decimal(17,10)/DECIMAL_64) -> decimal(27,10)
+                          className: VectorGroupByOperator
+                          groupByMode: HASH
+                          native: false
+                          vectorProcessingMode: HASH
+                          projectedOutputColumnNums: [0]
+                      minReductionHashAggr: 0.99
+                      mode: hash
+                      outputColumnNames: _col0
+                      Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+                      Reduce Output Operator
+                        sort order: 
+                        Reduce Sink Vectorization:
+                            className: VectorReduceSinkEmptyKeyOperator
+                            native: true
+                            nativeConditionsMet: hive.vectorized.execution.reducesink.new.enabled IS true, hive.execution.engine tez IN [tez, spark] IS true, No PTF TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
+                            valueColumns: 0:decimal(27,10)
+                        Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+                        value expressions: _col0 (type: decimal(27,10))
+            Execution mode: vectorized, llap
+            LLAP IO: all inputs
+            Map Vectorization:
+                enabled: true
+                enabledConditionsMet: hive.vectorized.use.vectorized.input.format IS true
+                inputFormatFeatureSupport: [DECIMAL_64]
+                featureSupportInUse: [DECIMAL_64]
+                inputFileFormats: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
+                allNative: false
+                usesVectorUDFAdaptor: false
+                vectorized: true
+                rowBatchContext:
+                    dataColumnCount: 4
+                    includeColumns: [0, 2]
+                    dataColumns: ss_ext_list_price:decimal(7,2)/DECIMAL_64, ss_ext_wholesale_cost:decimal(7,2)/DECIMAL_64, ss_ext_discount_amt:decimal(7,2)/DECIMAL_64, ss_ext_sales_price:decimal(7,2)/DECIMAL_64
+                    partitionColumnCount: 0
+                    scratchColumnTypeNames: [decimal(17,10)/DECIMAL_64]
+        Reducer 2 
+            Execution mode: vectorized, llap
+            Reduce Vectorization:
+                enabled: true
+                enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true, hive.execution.engine tez IN [tez, spark] IS true
+                reduceColumnNullOrder: 
+                reduceColumnSortOrder: 
+                allNative: false
+                usesVectorUDFAdaptor: false
+                vectorized: true
+                rowBatchContext:
+                    dataColumnCount: 1
+                    dataColumns: VALUE._col0:decimal(27,10)
+                    partitionColumnCount: 0
+                    scratchColumnTypeNames: []
+            Reduce Operator Tree:
+              Group By Operator
+                aggregations: sum(VALUE._col0)
+                Group By Vectorization:
+                    aggregators: VectorUDAFSumDecimal(col 0:decimal(27,10)) -> decimal(27,10)
+                    className: VectorGroupByOperator
+                    groupByMode: MERGEPARTIAL
+                    native: false
+                    vectorProcessingMode: GLOBAL
+                    projectedOutputColumnNums: [0]
+                mode: mergepartial
+                outputColumnNames: _col0
+                Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+                File Output Operator
+                  compressed: false
+                  File Sink Vectorization:
+                      className: VectorFileSinkOperator
+                      native: false
+                  Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+                  table:
+                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+PREHOOK: type: QUERY
+PREHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+3154.0222743675
diff --git a/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64scalar.q.out b/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64scalar.q.out
index bb21cd9..b537d5a 100644
--- a/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64scalar.q.out
+++ b/ql/src/test/results/clientpositive/llap/vector_decimal64_div_decimal64scalar.q.out
@@ -1,46 +1,46 @@
-PREHOOK: query: create external table cdpd4378(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+PREHOOK: query: create external table vector_decimal64_div_decimal64scalar(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
 PREHOOK: type: CREATETABLE
 PREHOOK: Output: database:default
-PREHOOK: Output: default@cdpd4378
-POSTHOOK: query: create external table cdpd4378(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar
+POSTHOOK: query: create external table vector_decimal64_div_decimal64scalar(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
 POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
-POSTHOOK: Output: default@cdpd4378
-PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE cdpd4378
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64scalar
 PREHOOK: type: LOAD
 #### A masked pattern was here ####
-PREHOOK: Output: default@cdpd4378
-POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE cdpd4378
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64scalar
 POSTHOOK: type: LOAD
 #### A masked pattern was here ####
-POSTHOOK: Output: default@cdpd4378
-PREHOOK: query: create table cdpd4378_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar
+PREHOOK: query: create table vector_decimal64_div_decimal64scalar_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
 PREHOOK: type: CREATETABLE
 PREHOOK: Output: database:default
-PREHOOK: Output: default@cdpd4378_tmp
-POSTHOOK: query: create table cdpd4378_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+POSTHOOK: query: create table vector_decimal64_div_decimal64scalar_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
 POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
-POSTHOOK: Output: default@cdpd4378_tmp
-PREHOOK: query: insert into table cdpd4378_tmp select * from cdpd4378
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+PREHOOK: query: insert into table vector_decimal64_div_decimal64scalar_tmp select * from vector_decimal64_div_decimal64scalar
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378
-PREHOOK: Output: default@cdpd4378_tmp
-POSTHOOK: query: insert into table cdpd4378_tmp select * from cdpd4378
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+POSTHOOK: query: insert into table vector_decimal64_div_decimal64scalar_tmp select * from vector_decimal64_div_decimal64scalar
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378
-POSTHOOK: Output: default@cdpd4378_tmp
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_discount_amt SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_discount_amt, type:decimal(7,2), comment:null), ]
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_list_price SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_list_price, type:decimal(7,2), comment:null), ]
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_sales_price SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_sales_price, type:decimal(7,2), comment:null), ]
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_wholesale_cost SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_wholesale_cost, type:decimal(7,2), comment:null), ]
-PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_discount_amt SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_discount_amt, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_list_price SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_list_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_sales_price SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_sales_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_wholesale_cost SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_wholesale_cost, type:decimal(7,2), comment:null), ]
+PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 PLAN VECTORIZATION:
   enabled: true
@@ -61,7 +61,7 @@ STAGE PLANS:
         Map 1 
             Map Operator Tree:
                 TableScan
-                  alias: cdpd4378_tmp
+                  alias: vector_decimal64_div_decimal64scalar_tmp
                   Statistics: Num rows: 1000 Data size: 448000 Basic stats: COMPLETE Column stats: COMPLETE
                   TableScan Vectorization:
                       native: true
@@ -159,22 +159,22 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
-PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 401098.9228951000
-PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 PLAN VECTORIZATION:
   enabled: true
@@ -195,7 +195,7 @@ STAGE PLANS:
         Map 1 
             Map Operator Tree:
                 TableScan
-                  alias: cdpd4378_tmp
+                  alias: vector_decimal64_div_decimal64scalar_tmp
                   Statistics: Num rows: 1000 Data size: 448000 Basic stats: COMPLETE Column stats: COMPLETE
                   TableScan Vectorization:
                       native: true
@@ -293,12 +293,12 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
-PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 413636.364000
diff --git a/ql/src/test/results/clientpositive/llap/vector_decimal_udf.q.out b/ql/src/test/results/clientpositive/llap/vector_decimal_udf.q.out
index d149e99..a0436b8 100644
--- a/ql/src/test/results/clientpositive/llap/vector_decimal_udf.q.out
+++ b/ql/src/test/results/clientpositive/llap/vector_decimal_udf.q.out
@@ -5776,8 +5776,8 @@ STAGE PLANS:
                     Select Vectorization:
                         className: VectorSelectOperator
                         native: true
-                        projectedOutputColumnNums: [3]
-                        selectExpressions: Decimal64ColDivideDecimal64Scalar(col 0:decimal(15,3)/DECIMAL_64, decimal64Val 0, decimalVal 0) -> 3:decimal(18,6)/DECIMAL_64
+                        projectedOutputColumnNums: [4]
+                        selectExpressions: DecimalColDivideDecimalScalar(col 3:decimal(15,3), val 0)(children: ConvertDecimal64ToDecimal(col 0:decimal(15,3)/DECIMAL_64) -> 3:decimal(15,3)) -> 4:decimal(18,6)
                     Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE
                     File Output Operator
                       compressed: false
@@ -5805,7 +5805,7 @@ STAGE PLANS:
                     includeColumns: [0]
                     dataColumns: key:decimal(15,3)/DECIMAL_64, value:int
                     partitionColumnCount: 0
-                    scratchColumnTypeNames: [decimal(18,6)/DECIMAL_64]
+                    scratchColumnTypeNames: [decimal(15,3), decimal(18,6)]
 
   Stage: Stage-0
     Fetch Operator
@@ -7344,8 +7344,8 @@ STAGE PLANS:
                     Select Vectorization:
                         className: VectorSelectOperator
                         native: true
-                        projectedOutputColumnNums: [5]
-                        selectExpressions: DecimalColModuloDecimalColumn(col 6:decimal(16,3), col 7:decimal(18,6))(children: ConvertDecimal64ToDecimal(col 3:decimal(16,3)/DECIMAL_64)(children: Decimal64ColAddDecimal64Scalar(col 0:decimal(15,3)/DECIMAL_64, decimal64Val 1000, decimalVal 1) -> 3:decimal(16,3)/DECIMAL_64) -> 6:decimal(16,3), ConvertDecimal64ToDecimal(col 4:decimal(18,6)/DECIMAL_64)(children: Decimal64ColDivideDecimal64Scalar(col 0:decimal(15,3)/DECIMAL_64, decimal64Val 2000, [...]
+                        projectedOutputColumnNums: [6]
+                        selectExpressions: DecimalColModuloDecimalColumn(col 7:decimal(16,3), col 5:decimal(18,6))(children: ConvertDecimal64ToDecimal(col 3:decimal(16,3)/DECIMAL_64)(children: Decimal64ColAddDecimal64Scalar(col 0:decimal(15,3)/DECIMAL_64, decimal64Val 1000, decimalVal 1) -> 3:decimal(16,3)/DECIMAL_64) -> 7:decimal(16,3), DecimalColDivideDecimalScalar(col 4:decimal(15,3), val 2)(children: ConvertDecimal64ToDecimal(col 0:decimal(15,3)/DECIMAL_64) -> 4:decimal(15,3)) -> 5:d [...]
                     Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: NONE
                     File Output Operator
                       compressed: false
@@ -7373,7 +7373,7 @@ STAGE PLANS:
                     includeColumns: [0]
                     dataColumns: key:decimal(15,3)/DECIMAL_64, value:int
                     partitionColumnCount: 0
-                    scratchColumnTypeNames: [decimal(16,3)/DECIMAL_64, decimal(18,6)/DECIMAL_64, decimal(18,6), decimal(16,3), decimal(18,6)]
+                    scratchColumnTypeNames: [decimal(16,3)/DECIMAL_64, decimal(15,3), decimal(18,6), decimal(18,6), decimal(16,3)]
 
   Stage: Stage-0
     Fetch Operator
diff --git a/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64column.q.out b/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64column.q.out
new file mode 100644
index 0000000..ac140a3
--- /dev/null
+++ b/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64column.q.out
@@ -0,0 +1,142 @@
+PREHOOK: query: create external table vector_decimal64_div_decimal64column(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vector_decimal64_div_decimal64column
+POSTHOOK: query: create external table vector_decimal64_div_decimal64column(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64column
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@vector_decimal64_div_decimal64column
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64column
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column
+PREHOOK: query: create table vector_decimal64_div_decimal64column_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+POSTHOOK: query: create table vector_decimal64_div_decimal64column_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+PREHOOK: query: insert into table vector_decimal64_div_decimal64column_tmp select * from vector_decimal64_div_decimal64column
+PREHOOK: type: QUERY
+PREHOOK: Input: default@vector_decimal64_div_decimal64column
+PREHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+POSTHOOK: query: insert into table vector_decimal64_div_decimal64column_tmp select * from vector_decimal64_div_decimal64column
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@vector_decimal64_div_decimal64column
+POSTHOOK: Output: default@vector_decimal64_div_decimal64column_tmp
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_discount_amt SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_discount_amt, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_list_price SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_list_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_sales_price SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_sales_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64column_tmp.ss_ext_wholesale_cost SIMPLE [(vector_decimal64_div_decimal64column)vector_decimal64_div_decimal64column.FieldSchema(name:ss_ext_wholesale_cost, type:decimal(7,2), comment:null), ]
+PREHOOK: query: explain vectorization detail select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+PREHOOK: type: QUERY
+PREHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+POSTHOOK: query: explain vectorization detail select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+PLAN VECTORIZATION:
+  enabled: true
+  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: vector_decimal64_div_decimal64column_tmp
+            Statistics: Num rows: 1000 Data size: 224000 Basic stats: COMPLETE Column stats: COMPLETE
+            TableScan Vectorization:
+                native: true
+                vectorizationSchemaColumns: [0:ss_ext_list_price:decimal(7,2)/DECIMAL_64, 1:ss_ext_wholesale_cost:decimal(7,2)/DECIMAL_64, 2:ss_ext_discount_amt:decimal(7,2)/DECIMAL_64, 3:ss_ext_sales_price:decimal(7,2)/DECIMAL_64, 4:ROW__ID:struct<writeid:bigint,bucketid:int,rowid:bigint>]
+            Select Operator
+              expressions: (ss_ext_list_price / ss_ext_discount_amt) (type: decimal(17,10))
+              outputColumnNames: _col0
+              Select Vectorization:
+                  className: VectorSelectOperator
+                  native: true
+                  projectedOutputColumnNums: [5]
+                  selectExpressions: Decimal64ColDivideDecimal64Column(col 0:decimal(7,2)/DECIMAL_64, col 2:decimal(7,2)/DECIMAL_64) -> 5:decimal(17,10)/DECIMAL_64
+              Statistics: Num rows: 1000 Data size: 224000 Basic stats: COMPLETE Column stats: COMPLETE
+              Group By Operator
+                aggregations: sum(_col0)
+                Group By Vectorization:
+                    aggregators: VectorUDAFSumDecimal64ToDecimal(col 5:decimal(17,10)/DECIMAL_64) -> decimal(27,10)
+                    className: VectorGroupByOperator
+                    groupByMode: HASH
+                    native: false
+                    vectorProcessingMode: HASH
+                    projectedOutputColumnNums: [0]
+                minReductionHashAggr: 0.99
+                mode: hash
+                outputColumnNames: _col0
+                Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+                Reduce Output Operator
+                  sort order: 
+                  Reduce Sink Vectorization:
+                      className: VectorReduceSinkOperator
+                      native: false
+                      nativeConditionsMet: hive.vectorized.execution.reducesink.new.enabled IS true, No PTF TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
+                      nativeConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false
+                  Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+                  value expressions: _col0 (type: decimal(27,10))
+      Execution mode: vectorized
+      Map Vectorization:
+          enabled: true
+          enabledConditionsMet: hive.vectorized.use.vectorized.input.format IS true
+          inputFormatFeatureSupport: [DECIMAL_64]
+          featureSupportInUse: [DECIMAL_64]
+          inputFileFormats: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
+          allNative: false
+          usesVectorUDFAdaptor: false
+          vectorized: true
+          rowBatchContext:
+              dataColumnCount: 4
+              includeColumns: [0, 2]
+              dataColumns: ss_ext_list_price:decimal(7,2)/DECIMAL_64, ss_ext_wholesale_cost:decimal(7,2)/DECIMAL_64, ss_ext_discount_amt:decimal(7,2)/DECIMAL_64, ss_ext_sales_price:decimal(7,2)/DECIMAL_64
+              partitionColumnCount: 0
+              scratchColumnTypeNames: [decimal(17,10)/DECIMAL_64]
+      Reduce Vectorization:
+          enabled: false
+          enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true
+          enableConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false
+      Reduce Operator Tree:
+        Group By Operator
+          aggregations: sum(VALUE._col0)
+          mode: mergepartial
+          outputColumnNames: _col0
+          Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+          File Output Operator
+            compressed: false
+            Statistics: Num rows: 1 Data size: 112 Basic stats: COMPLETE Column stats: COMPLETE
+            table:
+                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+PREHOOK: type: QUERY
+PREHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(ss_ext_list_price/ss_ext_discount_amt) from vector_decimal64_div_decimal64column_tmp
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@vector_decimal64_div_decimal64column_tmp
+#### A masked pattern was here ####
+3154.0222743675
diff --git a/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64scalar.q.out b/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64scalar.q.out
index e080068..0a8c0f3 100644
--- a/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64scalar.q.out
+++ b/ql/src/test/results/clientpositive/vector_decimal64_div_decimal64scalar.q.out
@@ -1,46 +1,46 @@
-PREHOOK: query: create external table cdpd4378(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+PREHOOK: query: create external table vector_decimal64_div_decimal64scalar(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
 PREHOOK: type: CREATETABLE
 PREHOOK: Output: database:default
-PREHOOK: Output: default@cdpd4378
-POSTHOOK: query: create external table cdpd4378(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar
+POSTHOOK: query: create external table vector_decimal64_div_decimal64scalar(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE
 POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
-POSTHOOK: Output: default@cdpd4378
-PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE cdpd4378
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64scalar
 PREHOOK: type: LOAD
 #### A masked pattern was here ####
-PREHOOK: Output: default@cdpd4378
-POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE cdpd4378
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/decimal64table.csv' OVERWRITE INTO TABLE vector_decimal64_div_decimal64scalar
 POSTHOOK: type: LOAD
 #### A masked pattern was here ####
-POSTHOOK: Output: default@cdpd4378
-PREHOOK: query: create table cdpd4378_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar
+PREHOOK: query: create table vector_decimal64_div_decimal64scalar_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
 PREHOOK: type: CREATETABLE
 PREHOOK: Output: database:default
-PREHOOK: Output: default@cdpd4378_tmp
-POSTHOOK: query: create table cdpd4378_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+POSTHOOK: query: create table vector_decimal64_div_decimal64scalar_tmp(ss_ext_list_price decimal(7,2), ss_ext_wholesale_cost decimal(7,2), ss_ext_discount_amt decimal(7,2), ss_ext_sales_price decimal(7,2)) stored as ORC
 POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:default
-POSTHOOK: Output: default@cdpd4378_tmp
-PREHOOK: query: insert into table cdpd4378_tmp select * from cdpd4378
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+PREHOOK: query: insert into table vector_decimal64_div_decimal64scalar_tmp select * from vector_decimal64_div_decimal64scalar
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378
-PREHOOK: Output: default@cdpd4378_tmp
-POSTHOOK: query: insert into table cdpd4378_tmp select * from cdpd4378
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar
+PREHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+POSTHOOK: query: insert into table vector_decimal64_div_decimal64scalar_tmp select * from vector_decimal64_div_decimal64scalar
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378
-POSTHOOK: Output: default@cdpd4378_tmp
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_discount_amt SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_discount_amt, type:decimal(7,2), comment:null), ]
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_list_price SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_list_price, type:decimal(7,2), comment:null), ]
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_sales_price SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_sales_price, type:decimal(7,2), comment:null), ]
-POSTHOOK: Lineage: cdpd4378_tmp.ss_ext_wholesale_cost SIMPLE [(cdpd4378)cdpd4378.FieldSchema(name:ss_ext_wholesale_cost, type:decimal(7,2), comment:null), ]
-PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar
+POSTHOOK: Output: default@vector_decimal64_div_decimal64scalar_tmp
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_discount_amt SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_discount_amt, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_list_price SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_list_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_sales_price SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_sales_price, type:decimal(7,2), comment:null), ]
+POSTHOOK: Lineage: vector_decimal64_div_decimal64scalar_tmp.ss_ext_wholesale_cost SIMPLE [(vector_decimal64_div_decimal64scalar)vector_decimal64_div_decimal64scalar.FieldSchema(name:ss_ext_wholesale_cost, type:decimal(7,2), comment:null), ]
+PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 PLAN VECTORIZATION:
   enabled: true
@@ -55,7 +55,7 @@ STAGE PLANS:
     Map Reduce
       Map Operator Tree:
           TableScan
-            alias: cdpd4378_tmp
+            alias: vector_decimal64_div_decimal64scalar_tmp
             Statistics: Num rows: 1000 Data size: 448000 Basic stats: COMPLETE Column stats: COMPLETE
             TableScan Vectorization:
                 native: true
@@ -131,22 +131,22 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
-PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from cdpd4378_tmp
+POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.268767) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 401098.9228951000
-PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+PREHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+POSTHOOK: query: explain vectorization detail select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 PLAN VECTORIZATION:
   enabled: true
@@ -161,7 +161,7 @@ STAGE PLANS:
     Map Reduce
       Map Operator Tree:
           TableScan
-            alias: cdpd4378_tmp
+            alias: vector_decimal64_div_decimal64scalar_tmp
             Statistics: Num rows: 1000 Data size: 448000 Basic stats: COMPLETE Column stats: COMPLETE
             TableScan Vectorization:
                 native: true
@@ -237,12 +237,12 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
-PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+PREHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 PREHOOK: type: QUERY
-PREHOOK: Input: default@cdpd4378_tmp
+PREHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
-POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from cdpd4378_tmp
+POSTHOOK: query: select sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2.2) from vector_decimal64_div_decimal64scalar_tmp
 POSTHOOK: type: QUERY
-POSTHOOK: Input: default@cdpd4378_tmp
+POSTHOOK: Input: default@vector_decimal64_div_decimal64scalar_tmp
 #### A masked pattern was here ####
 413636.364000
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 83cd48c..82fc141 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
@@ -317,6 +317,7 @@ public class GenVectorCode extends Task {
       {"Decimal64ColumnArithmeticDecimal64Column", "Subtract", "-"},
 
       {"Decimal64ColumnDivideDecimal64Scalar", "Divide", "/"},
+      {"Decimal64ColumnDivideDecimal64Column", "Divide", "/"},
 
       {"ColumnCompareScalar", "Equal", "long", "long", "=="},
       {"ColumnCompareScalar", "Equal", "long", "double", "=="},
@@ -1418,6 +1419,8 @@ public class GenVectorCode extends Task {
         generateDecimal64ColumnArithmeticDecimal64Column(tdesc);
       } else if (tdesc[0].equals("Decimal64ColumnDivideDecimal64Scalar")) {
         generateDecimal64ColumnArithmeticDecimal64Scalar(tdesc);
+      } else if (tdesc[0].equals("Decimal64ColumnDivideDecimal64Column")) {
+        generateDecimal64ColumnArithmeticDecimal64Column(tdesc);
       } else if (tdesc[0].equals("ColumnUnaryMinus")) {
         generateColumnUnaryMinus(tdesc);
       } else if (tdesc[0].equals("ColumnUnaryFunc")) {