Author: hashutosh
Date: Sat Jul 26 15:44:16 2014
New Revision: 1613663

URL: http://svn.apache.org/r1613663
Log:
HIVE-7514 : Vectorization does not handle constant expression whose value is 
NULL (Hari Sankar via Jitendra Nath Pandey)

Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConstantVectorExpression.java
    
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java?rev=1613663&r1=1613662&r2=1613663&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
 Sat Jul 26 15:44:16 2014
@@ -717,13 +717,15 @@ public class VectorizationContext {
 
   private VectorExpression getConstantVectorExpression(Object constantValue, 
TypeInfo typeInfo,
       Mode mode) throws HiveException {
-    String type = typeInfo.getTypeName();
+    String type =  typeInfo.getTypeName();
     String colVectorType = getNormalizedTypeName(type);
     int outCol = -1;
     if (mode == Mode.PROJECTION) {
       outCol = ocm.allocateOutputColumn(colVectorType);
     }
-    if (decimalTypePattern.matcher(type).matches()) {
+    if (constantValue == null) {
+       return new ConstantVectorExpression(outCol, type, true);
+    } else if (decimalTypePattern.matcher(type).matches()) {
       VectorExpression ve = new ConstantVectorExpression(outCol, (Decimal128) 
constantValue);
       ve.setOutputType(typeInfo.getTypeName());
       return ve;

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConstantVectorExpression.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConstantVectorExpression.java?rev=1613663&r1=1613662&r2=1613663&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConstantVectorExpression.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConstantVectorExpression.java
 Sat Jul 26 15:44:16 2014
@@ -41,6 +41,7 @@ public class ConstantVectorExpression ex
   private double doubleValue = 0;
   private byte[] bytesValue = null;
   private Decimal128 decimalValue = null;
+  private boolean isNullValue = false;
 
   private Type type;
   private int bytesValueLength = 0;
@@ -74,34 +75,58 @@ public class ConstantVectorExpression ex
     this(outputColumn, "decimal");
     setDecimalValue(value);
   }
-
+  
+  /*
+   * Support for null constant object
+   */
+  public ConstantVectorExpression(int outputColumn, String typeString, boolean 
isNull) {
+       this(outputColumn, typeString);
+       isNullValue = isNull;
+  }
+  
   private void evaluateLong(VectorizedRowBatch vrg) {
     LongColumnVector cv = (LongColumnVector) vrg.cols[outputColumn];
     cv.isRepeating = true;
-    cv.noNulls = true;
-    cv.vector[0] = longValue;
+    cv.noNulls = !isNullValue;
+    if (!isNullValue) {
+       cv.vector[0] = longValue;
+    } else {
+       cv.isNull[0] = true;
+    }
   }
 
   private void evaluateDouble(VectorizedRowBatch vrg) {
     DoubleColumnVector cv = (DoubleColumnVector) vrg.cols[outputColumn];
     cv.isRepeating = true;
-    cv.noNulls = true;
-    cv.vector[0] = doubleValue;
+    cv.noNulls = !isNullValue;
+    if (!isNullValue) {
+       cv.vector[0] = doubleValue;
+    } else {
+       cv.isNull[0] = true;
+    }    
   }
 
   private void evaluateBytes(VectorizedRowBatch vrg) {
     BytesColumnVector cv = (BytesColumnVector) vrg.cols[outputColumn];
     cv.isRepeating = true;
-    cv.noNulls = true;
+    cv.noNulls = !isNullValue;
     cv.initBuffer();
-    cv.setVal(0, bytesValue, 0, bytesValueLength);
+    if (!isNullValue) {
+       cv.setVal(0, bytesValue, 0, bytesValueLength);
+    } else {
+       cv.isNull[0] = true;
+    }
   }
 
   private void evaluateDecimal(VectorizedRowBatch vrg) {
     DecimalColumnVector dcv = (DecimalColumnVector) vrg.cols[outputColumn];
     dcv.isRepeating = true;
-    dcv.noNulls = true;
-    dcv.vector[0].update(decimalValue);
+    dcv.noNulls = !isNullValue;
+    if (!isNullValue) {
+       dcv.vector[0].update(decimalValue);
+    } else {
+       dcv.isNull[0] = true;
+    }
   }
 
   @Override

Modified: 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java?rev=1613663&r1=1613662&r2=1613663&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java
 (original)
+++ 
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java
 Sat Jul 26 15:44:16 2014
@@ -45,28 +45,36 @@ public class TestConstantVectorExpressio
     ConstantVectorExpression bytesCve = new ConstantVectorExpression(2, 
str.getBytes());
     Decimal128 decVal = new Decimal128(25.8, (short) 1);
     ConstantVectorExpression decimalCve = new ConstantVectorExpression(3, 
decVal);
-
+    ConstantVectorExpression nullCve = new ConstantVectorExpression(4, 
"string", true);
+    
     int size = 20;
-    VectorizedRowBatch vrg = 
VectorizedRowGroupGenUtil.getVectorizedRowBatch(size, 4, 0);
+    VectorizedRowBatch vrg = 
VectorizedRowGroupGenUtil.getVectorizedRowBatch(size, 5, 0);
 
     LongColumnVector lcv = (LongColumnVector) vrg.cols[0];
     DoubleColumnVector dcv = new DoubleColumnVector(size);
     BytesColumnVector bcv = new BytesColumnVector(size);
     DecimalColumnVector dv = new DecimalColumnVector(5, 1);
+    BytesColumnVector bcvn = new BytesColumnVector(size);
     vrg.cols[1] = dcv;
     vrg.cols[2] = bcv;
     vrg.cols[3] = dv;
+    vrg.cols[4] = bcvn;
 
     longCve.evaluate(vrg);
     doubleCve.evaluate(vrg);
     bytesCve.evaluate(vrg);  
     decimalCve.evaluate(vrg);
+    nullCve.evaluate(vrg);
     assertTrue(lcv.isRepeating);
     assertTrue(dcv.isRepeating);
     assertTrue(bcv.isRepeating);
     assertEquals(17, lcv.vector[0]);
     assertTrue(17.34 == dcv.vector[0]);
     
+    assertTrue(bcvn.isRepeating);
+    assertTrue(bcvn.isNull[0]);
+    assertTrue(!bcvn.noNulls);
+    
     byte[] alphaBytes = "alpha".getBytes();
     assertTrue(bcv.length[0] == alphaBytes.length);
     assertTrue(sameFirstKBytes(alphaBytes, bcv.vector[0], alphaBytes.length)); 


Reply via email to