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 2013/06/09 09:17:15 UTC
svn commit: r1491154 - in /hive/branches/vectorization/ql/src:
java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java
test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java
Author: hashutosh
Date: Sun Jun 9 07:17:15 2013
New Revision: 1491154
URL: http://svn.apache.org/r1491154
Log:
HIVE-4688 : NPE in writing null values. (Jitendra Nath Pandey via Ashutosh Chauhan)
Added:
hive/branches/vectorization/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java
Modified:
hive/branches/vectorization/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java
Modified: hive/branches/vectorization/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java
URL: http://svn.apache.org/viewvc/hive/branches/vectorization/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java?rev=1491154&r1=1491153&r2=1491154&view=diff
==============================================================================
--- hive/branches/vectorization/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java (original)
+++ hive/branches/vectorization/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java Sun Jun 9 07:17:15 2013
@@ -43,6 +43,7 @@ import org.apache.hadoop.io.BooleanWrita
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
/**
@@ -112,11 +113,11 @@ public final class VectorExpressionWrite
} else if (!lcv.noNulls && !lcv.isRepeating && !lcv.isNull[row]) {
return writeValue(lcv.vector[row]);
} else if (!lcv.noNulls && !lcv.isRepeating && lcv.isNull[row]) {
- return null;
+ return NullWritable.get();
} else if (!lcv.noNulls && lcv.isRepeating && !lcv.isNull[0]) {
return writeValue(lcv.vector[0]);
} else if (!lcv.noNulls && lcv.isRepeating && lcv.isNull[0]) {
- return null;
+ return NullWritable.get();
}
throw new HiveException(
String.format(
@@ -140,11 +141,11 @@ public final class VectorExpressionWrite
} else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
return writeValue(dcv.vector[row]);
} else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
- return null;
+ return NullWritable.get();
} else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
return writeValue(dcv.vector[0]);
} else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
- return null;
+ return NullWritable.get();
}
throw new HiveException(
String.format(
@@ -168,11 +169,11 @@ public final class VectorExpressionWrite
} else if (!bcv.noNulls && !bcv.isRepeating && !bcv.isNull[row]) {
return writeValue(bcv.vector[row], bcv.start[row], bcv.length[row]);
} else if (!bcv.noNulls && !bcv.isRepeating && bcv.isNull[row]) {
- return null;
+ return NullWritable.get();
} else if (!bcv.noNulls && bcv.isRepeating && !bcv.isNull[0]) {
return writeValue(bcv.vector[0], bcv.start[0], bcv.length[0]);
} else if (!bcv.noNulls && bcv.isRepeating && bcv.isNull[0]) {
- return null;
+ return NullWritable.get();
}
throw new HiveException(
String.format(
Added: hive/branches/vectorization/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java
URL: http://svn.apache.org/viewvc/hive/branches/vectorization/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java?rev=1491154&view=auto
==============================================================================
--- hive/branches/vectorization/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java (added)
+++ hive/branches/vectorization/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java Sun Jun 9 07:17:15 2013
@@ -0,0 +1,206 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+
+import java.sql.Timestamp;
+import java.util.Random;
+
+import junit.framework.Assert;
+
+import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.TimestampUtils;
+import org.apache.hadoop.hive.ql.exec.vector.util.VectorizedRowGroupGenUtil;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc;
+import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
+import org.apache.hadoop.hive.serde2.io.ByteWritable;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.ShortWritable;
+import org.apache.hadoop.hive.serde2.io.TimestampWritable;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.io.BooleanWritable;
+import org.apache.hadoop.io.FloatWritable;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.NullWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.Writable;
+import org.junit.Test;
+
+public class TestVectorExpressionWriters {
+
+ private final int vectorSize = 5;
+
+ private VectorExpressionWriter getWriter(TypeInfo colTypeInfo) throws HiveException {
+ ExprNodeDesc columnDesc = new ExprNodeColumnDesc();
+ columnDesc.setTypeInfo(colTypeInfo);
+ VectorExpressionWriter vew = VectorExpressionWriterFactory
+ .genVectorExpressionWritable(columnDesc);
+ return vew;
+ }
+
+ private Writable getWritableValue(TypeInfo ti, double value) {
+ if (ti.equals(TypeInfoFactory.floatTypeInfo)) {
+ return new FloatWritable((float) value);
+ } else if (ti.equals(TypeInfoFactory.doubleTypeInfo)) {
+ return new DoubleWritable(value);
+ }
+ return null;
+ }
+
+ private Writable getWritableValue(TypeInfo ti, byte[] value) {
+ if (ti.equals(TypeInfoFactory.stringTypeInfo)) {
+ return new Text(value);
+ }
+ return null;
+ }
+
+ private Writable getWritableValue(TypeInfo ti, long value) {
+ if (ti.equals(TypeInfoFactory.byteTypeInfo)) {
+ return new ByteWritable((byte) value);
+ } else if (ti.equals(TypeInfoFactory.shortTypeInfo)) {
+ return new ShortWritable((short) value);
+ } else if (ti.equals(TypeInfoFactory.intTypeInfo)) {
+ return new IntWritable( (int) value);
+ } else if (ti.equals(TypeInfoFactory.longTypeInfo)) {
+ return new LongWritable( (long) value);
+ } else if (ti.equals(TypeInfoFactory.booleanTypeInfo)) {
+ return new BooleanWritable( value == 0 ? false : true);
+ } else if (ti.equals(TypeInfoFactory.timestampTypeInfo)) {
+ Timestamp ts = new Timestamp(value);
+ TimestampUtils.assignTimeInNanoSec(value, ts);
+ TimestampWritable tw = new TimestampWritable(ts);
+ return tw;
+ }
+ return null;
+ }
+
+ private void testWriterDouble(TypeInfo type) throws HiveException {
+ DoubleColumnVector dcv = VectorizedRowGroupGenUtil.generateDoubleColumnVector(true, false,
+ this.vectorSize, new Random(10));
+ dcv.isNull[2] = true;
+ VectorExpressionWriter vew = getWriter(type);
+ for (int i = 0; i < vectorSize; i++) {
+ Writable w = (Writable) vew.writeValue(dcv, i);
+ if (!(w instanceof NullWritable)) {
+ Writable expected = getWritableValue(type, dcv.vector[i]);
+ Assert.assertEquals(expected, w);
+ } else {
+ Assert.assertTrue(dcv.isNull[i]);
+ }
+ }
+ }
+
+ private void testWriterLong(TypeInfo type) throws HiveException {
+ LongColumnVector lcv = VectorizedRowGroupGenUtil.generateLongColumnVector(true, false,
+ vectorSize, new Random(10));
+ lcv.isNull[3] = true;
+ VectorExpressionWriter vew = getWriter(type);
+ for (int i = 0; i < vectorSize; i++) {
+ Writable w = (Writable) vew.writeValue(lcv, i);
+ if (!(w instanceof NullWritable)) {
+ Writable expected = getWritableValue(type, lcv.vector[i]);
+ if (expected instanceof TimestampWritable) {
+ TimestampWritable t1 = (TimestampWritable) expected;
+ TimestampWritable t2 = (TimestampWritable) w;
+ Assert.assertTrue(t1.getNanos() == t2.getNanos());
+ Assert.assertTrue(t1.getSeconds() == t2.getSeconds());
+ continue;
+ }
+ Assert.assertEquals(expected, w);
+ } else {
+ Assert.assertTrue(lcv.isNull[i]);
+ }
+ }
+ }
+
+ private void testWriterBytes(TypeInfo type) throws HiveException {
+ Text t1 = new Text("alpha");
+ Text t2 = new Text("beta");
+ BytesColumnVector bcv = new BytesColumnVector(vectorSize);
+ bcv.noNulls = false;
+ bcv.initBuffer();
+ bcv.setVal(0, t1.getBytes(), 0, t1.getLength());
+ bcv.isNull[1] = true;
+ bcv.setVal(2, t2.getBytes(), 0, t2.getLength());
+ bcv.isNull[3] = true;
+ bcv.setVal(4, t1.getBytes(), 0, t1.getLength());
+ VectorExpressionWriter vew = getWriter(type);
+ for (int i = 0; i < vectorSize; i++) {
+ Writable w = (Writable) vew.writeValue(bcv, i);
+ if (!(w instanceof NullWritable)) {
+ byte [] val = new byte[bcv.length[i]];
+ System.arraycopy(bcv.vector[i], bcv.start[i], val, 0, bcv.length[i]);
+ Writable expected = getWritableValue(type, val);
+ Assert.assertEquals(expected, w);
+ } else {
+ Assert.assertTrue(bcv.isNull[i]);
+ }
+ }
+ }
+
+ @Test
+ public void testVectorExpressionWriterDouble() throws HiveException {
+ testWriterDouble(TypeInfoFactory.doubleTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterFloat() throws HiveException {
+ testWriterDouble(TypeInfoFactory.floatTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterLong() throws HiveException {
+ testWriterLong(TypeInfoFactory.longTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterInt() throws HiveException {
+ testWriterLong(TypeInfoFactory.intTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterShort() throws HiveException {
+ testWriterLong(TypeInfoFactory.shortTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterBoolean() throws HiveException {
+ testWriterLong(TypeInfoFactory.booleanTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterTimestamp() throws HiveException {
+ testWriterLong(TypeInfoFactory.timestampTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterBye() throws HiveException {
+ testWriterLong(TypeInfoFactory.byteTypeInfo);
+ }
+
+ @Test
+ public void testVectorExpressionWriterBytes() throws HiveException {
+ testWriterBytes(TypeInfoFactory.stringTypeInfo);
+ }
+}