diff --git itests/custom-serde/src/main/java/org/apache/hadoop/hive/serde2/CustomNonSettableUnionObjectInspector1.java itests/custom-serde/src/main/java/org/apache/hadoop/hive/serde2/CustomNonSettableUnionObjectInspector1.java index 61179ba294..3818003765 100644 --- itests/custom-serde/src/main/java/org/apache/hadoop/hive/serde2/CustomNonSettableUnionObjectInspector1.java +++ itests/custom-serde/src/main/java/org/apache/hadoop/hive/serde2/CustomNonSettableUnionObjectInspector1.java @@ -50,7 +50,7 @@ public Object getObject() { } @Override - public byte getTag() { + public int getTag() { return tag; } @@ -63,7 +63,7 @@ public String toString() { /** * Return the tag of the object. */ - public byte getTag(Object o) { + public int getTag(Object o) { if (o == null) { return -1; } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java index caaf543e27..0abc236146 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java @@ -415,13 +415,13 @@ private void populateCachedDistributionKeys(Object row) throws HiveException { private void populateCachedDistinctKeys(Object row, int index) throws HiveException { StandardUnion union; cachedKeys[index][numDistributionKeys] = union = new StandardUnion( - (byte)index, new Object[distinctColIndices.get(index).size()]); + index, new Object[distinctColIndices.get(index).size()]); Object[] distinctParameters = (Object[]) union.getObject(); for (int distinctParamI = 0; distinctParamI < distinctParameters.length; distinctParamI++) { distinctParameters[distinctParamI] = keyEval[distinctColIndices.get(index).get(distinctParamI)].evaluate(row); } - union.setTag((byte) index); + union.setTag(index); } protected final int computeMurmurHash(HiveKey firstKey) { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAssignRow.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAssignRow.java index e96619cf86..51fcb201c8 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAssignRow.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAssignRow.java @@ -609,7 +609,7 @@ private void assignRowColumn( final UnionColumnVector unionColumnVector = (UnionColumnVector) columnVector; final UnionTypeInfo unionTypeInfo = (UnionTypeInfo) targetTypeInfo; final List objectTypeInfos = unionTypeInfo.getAllUnionObjectTypeInfos(); - final byte tag = union.getTag(); + final int tag = union.getTag(); unionColumnVector.tags[batchIndex] = tag; assignRowColumn(unionColumnVector.fields[tag], batchIndex, objectTypeInfos.get(tag), union.getObject()); } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java index 8ea625e466..72007d1eae 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java @@ -1297,8 +1297,8 @@ private Object convertUnionRowColumn( final Object union = unionOI.create(); final int tag = deserializeRead.currentInt; - unionOI.setFieldAndTag(union, new StandardUnion((byte) tag, - convertComplexFieldRowColumn(unionColumnVector.fields[tag], batchIndex, fields[tag])), (byte) tag); + unionOI.setFieldAndTag(union, new StandardUnion(tag, + convertComplexFieldRowColumn(unionColumnVector.fields[tag], batchIndex, fields[tag])), tag); deserializeRead.finishComplexVariableFieldsType(); return union; } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExtractRow.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExtractRow.java index 152d75b949..b77eb6156d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExtractRow.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExtractRow.java @@ -444,7 +444,7 @@ public Object extractRowColumn( final UnionObjectInspector unionInspector = (UnionObjectInspector) objectInspector; final List unionInspectors = unionInspector.getObjectInspectors(); final UnionColumnVector unionColumnVector = (UnionColumnVector) colVector; - final byte tag = (byte) unionColumnVector.tags[adjustedIndex]; + final int tag = unionColumnVector.tags[adjustedIndex]; final Object object = extractRowColumn( unionColumnVector.fields[tag], objectTypeInfos.get(tag), diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java index 55dc461985..1497b4a864 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java @@ -1669,7 +1669,7 @@ public Object writeValue(ColumnVector column, int row) return null; } - unionOI.setFieldAndTag(obj, value, (byte) tag); + unionOI.setFieldAndTag(obj, value, tag); return obj; } @@ -1693,7 +1693,7 @@ public Object setValue(Object union, ColumnVector column, int row) return null; } - unionOI.setFieldAndTag(union, value, (byte) tag); + unionOI.setFieldAndTag(union, value, tag); return union; } }.init(fieldObjInspector); diff --git ql/src/java/org/apache/hadoop/hive/ql/io/BatchToRowReader.java ql/src/java/org/apache/hadoop/hive/ql/io/BatchToRowReader.java index 2b005c40fd..8d4dffaa88 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/BatchToRowReader.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/BatchToRowReader.java @@ -113,7 +113,7 @@ public BatchToRowReader(RecordReader vrbReader protected abstract void setStructCol(StructType structObj, int i, Object value); protected abstract Object getStructCol(StructType structObj, int i); protected abstract UnionType createUnionObject(List childrenTypes, Object previous); - protected abstract void setUnion(UnionType unionObj, byte tag, Object object); + protected abstract void setUnion(UnionType unionObj, int tag, Object object); protected abstract Object getUnionField(UnionType unionObj); @Override @@ -493,7 +493,7 @@ private UnionType nextUnion( List childrenTypes = schema.getAllUnionObjectTypeInfos(); UnionType result = createUnionObject(childrenTypes, previous); UnionColumnVector union = (UnionColumnVector) vector; - byte tag = (byte) union.tags[row]; + int tag = union.tags[row]; setUnion(result, tag, nextValue(union.fields[tag], row, childrenTypes.get(tag), getUnionField(result))); return result; diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcOiBatchToRowReader.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcOiBatchToRowReader.java index c9ff592d4e..91026b5913 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcOiBatchToRowReader.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcOiBatchToRowReader.java @@ -65,7 +65,7 @@ protected Object getUnionField(OrcUnion unionObj) { } @Override - protected void setUnion(OrcUnion unionObj, byte tag, Object object) { + protected void setUnion(OrcUnion unionObj, int tag, Object object) { unionObj.set(tag, object); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcUnion.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcUnion.java index b87e00d007..a0fb42299c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcUnion.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/OrcUnion.java @@ -31,16 +31,16 @@ * An in-memory representation of a union type. */ final class OrcUnion implements UnionObject { - private byte tag; + private int tag; private Object object; - void set(byte tag, Object object) { + void set(int tag, Object object) { this.tag = tag; this.object = object; } @Override - public byte getTag() { + public int getTag() { return tag; } @@ -108,7 +108,7 @@ protected OrcUnionObjectInspector() { } @Override - public byte getTag(Object obj) { + public int getTag(Object obj) { return ((OrcUnion) obj).tag; } diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java index 5b001a0bbc..5603157c68 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java @@ -486,7 +486,7 @@ static OrcUnion nextUnion(ColumnVector vector, result = (OrcUnion) previous; } UnionColumnVector union = (UnionColumnVector) vector; - byte tag = (byte) union.tags[row]; + int tag = union.tags[row]; result.set(tag, nextValue(union.fields[tag], row, childrenTypes.get(tag), result.getObject())); return result; diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFExtractUnion.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFExtractUnion.java index 4783c5baba..dafa8d714d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFExtractUnion.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFExtractUnion.java @@ -255,7 +255,7 @@ private Object convertStruct(Object struct, ObjectInspector inspector) { private Object convertUnion(Object union, ObjectInspector inspector) { UnionObjectInspector unionOI = (UnionObjectInspector) inspector; List childOIs = unionOI.getObjectInspectors(); - byte tag = unionOI.getTag(union); + int tag = unionOI.getTag(union); Object value = unionOI.getField(union); List result = new ArrayList<>(childOIs.size()); for (int i = 0; i < childOIs.size(); i++) { diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUnion.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUnion.java index 552887ee76..988ed63d29 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUnion.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUnion.java @@ -49,7 +49,7 @@ public ObjectInspector initialize(ObjectInspector[] arguments) @Override public Object evaluate(DeferredObject[] arguments) throws HiveException { - byte tag = (byte)((IntObjectInspector)tagOI).get(arguments[0].get()); + int tag = ((IntObjectInspector)tagOI).get(arguments[0].get()); return new StandardUnion(tag, arguments[tag + 1].get()); } diff --git ql/src/test/org/apache/hadoop/hive/ql/TestDistinct.java ql/src/test/org/apache/hadoop/hive/ql/TestDistinct.java new file mode 100644 index 0000000000..f3ca3cac50 --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/TestDistinct.java @@ -0,0 +1,44 @@ +package org.apache.hadoop.hive.ql; + +import org.apache.hadoop.hive.conf.HiveConf; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; + +public class TestDistinct extends TxnCommandsBaseForTests { + private static final Logger LOG = LoggerFactory.getLogger(TestDistinct.class); + private static final String TEST_DATA_DIR = new File(System.getProperty("java.io.tmpdir") + + File.separator + TestDistinct.class.getCanonicalName() + "-" + System.currentTimeMillis() + ).getPath().replaceAll("\\\\", "/"); + + @Override + String getTestDataDir() { + return TEST_DATA_DIR; + } + + @Test + public void testDistinct() throws Exception { + runStatementOnDriver("drop table if exists t"); + StringBuilder sbTable = new StringBuilder("create table t(a int"); + StringBuilder sbSelect = new StringBuilder("select count(distinct a)"); + StringBuilder sbInsert = new StringBuilder("insert into t values(1"); + for(int i = 0; i < 128; i++) { + sbTable.append(", a").append(i).append(" int"); + sbSelect.append(", count(distinct a").append(i).append(")"); + sbInsert.append(",1"); + } + sbTable.append(")"); + sbSelect.append(" from t"); + sbInsert.append(")"); + + runStatementOnDriver(sbTable.toString()); + runStatementOnDriver(sbInsert.toString()); + runStatementOnDriver(sbInsert.toString());//make 2 rows + + HiveConf.setVar(hiveConf, HiveConf.ConfVars.HIVEFETCHTASKCONVERSION, "none"); + runStatementOnDriver(sbSelect.toString()); + } + +} diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java index fa5c775a98..3a3692f816 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorRandomRowSource.java @@ -882,7 +882,7 @@ public Object randomWritable(TypeInfo typeInfo, ObjectInspector objectInspector, (StandardUnionObjectInspector) objectInspector; final List objectInspectorList = unionObjectInspector.getObjectInspectors(); final int unionCount = objectInspectorList.size(); - final byte tag = (byte) r.nextInt(unionCount); + final int tag = r.nextInt(unionCount); final ObjectInspector fieldObjectInspector = objectInspectorList.get(tag); final TypeInfo fieldTypeInfo = diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorVerifyFast.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorVerifyFast.java index ec5ad2327d..149143087f 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorVerifyFast.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/VectorVerifyFast.java @@ -501,7 +501,7 @@ public static void serializeWrite(SerializeWrite serializeWrite, List fieldTypeInfos = unionTypeInfo.getAllUnionObjectTypeInfos(); final int size = fieldTypeInfos.size(); StandardUnionObjectInspector.StandardUnion standardUnion = (StandardUnionObjectInspector.StandardUnion) object; - byte tag = standardUnion.getTag(); + int tag = standardUnion.getTag(); serializeWrite.beginUnion(tag); serializeWrite(serializeWrite, fieldTypeInfos.get(tag), standardUnion.getObject()); serializeWrite.finishUnion(); @@ -685,7 +685,7 @@ private static Object getComplexField(DeserializeRead deserializeRead, unionObj = null; } else { // Get the union value. - unionObj = new StandardUnionObjectInspector.StandardUnion((byte) tag, getComplexField(deserializeRead, unionTypeInfos.get(tag))); + unionObj = new StandardUnionObjectInspector.StandardUnion(tag, getComplexField(deserializeRead, unionTypeInfos.get(tag))); } } diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VerifyFastRow.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VerifyFastRow.java index f257363691..7cd8d8573b 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VerifyFastRow.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VerifyFastRow.java @@ -506,7 +506,7 @@ public static void serializeWrite(SerializeWrite serializeWrite, List fieldTypeInfos = unionTypeInfo.getAllUnionObjectTypeInfos(); final int size = fieldTypeInfos.size(); StandardUnionObjectInspector.StandardUnion standardUnion = (StandardUnionObjectInspector.StandardUnion) object; - byte tag = standardUnion.getTag(); + int tag = standardUnion.getTag(); serializeWrite.beginUnion(tag); serializeWrite(serializeWrite, fieldTypeInfos.get(tag), standardUnion.getObject()); serializeWrite.finishUnion(); @@ -692,7 +692,7 @@ private static Object getComplexField(DeserializeRead deserializeRead, unionObj = null; } else { // Get the union value. - unionObj = new StandardUnionObjectInspector.StandardUnion((byte) tag, getComplexField(deserializeRead, unionTypeInfos.get(tag))); + unionObj = new StandardUnionObjectInspector.StandardUnion(tag, getComplexField(deserializeRead, unionTypeInfos.get(tag))); } } diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnion.java ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnion.java index 3adc5ca349..6be29b5f5c 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnion.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnion.java @@ -86,7 +86,7 @@ public void evaluate_UnionAndTagArguments_MatchesTag() throws HiveException { PrimitiveObjectInspectorFactory.writableLongObjectInspector)); when(tagOI.getWritableConstantValue()).thenReturn(new IntWritable(0)); when(deferredObject.get()).thenReturn(value); - when(unionOI.getTag(value)).thenReturn((byte) 0); + when(unionOI.getTag(value)).thenReturn(0); when(unionOI.getField(value)).thenReturn("foo"); underTest.initialize(new ObjectInspector[] { unionOI, tagOI }); @@ -103,7 +103,7 @@ public void evaluate_UnionAndTagArguments_NotMatchesTag() throws HiveException { PrimitiveObjectInspectorFactory.writableLongObjectInspector)); when(tagOI.getWritableConstantValue()).thenReturn(new IntWritable(0)); when(deferredObject.get()).thenReturn(value); - when(unionOI.getTag(value)).thenReturn((byte) 1); + when(unionOI.getTag(value)).thenReturn(1); underTest.initialize(new ObjectInspector[] { unionOI, tagOI }); Object result = underTest.evaluate(new DeferredObject[] { deferredObject }); diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnionValueConverter.java ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnionValueConverter.java index 4189485dd0..5a1fe54a2f 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnionValueConverter.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFExtractUnionValueConverter.java @@ -43,7 +43,7 @@ PrimitiveObjectInspectorFactory.javaStringObjectInspector, PrimitiveObjectInspectorFactory.javaIntObjectInspector)); - private final Object union = new StandardUnion((byte) 0, "foo"); + private final Object union = new StandardUnion(0, "foo"); private final ValueConverter underTest = new ValueConverter(); diff --git serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java index 34da50de83..a91c387919 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java +++ serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroDeserializer.java @@ -326,7 +326,7 @@ private Object deserializeUnion(Object datum, Schema fileSchema, Schema recordSc int rsTag = GenericData.get().resolveUnion(recordSchema, datum); // Determine index of value from recordSchema Object desered = worker(datum, fileSchema == null ? null : fileSchema.getTypes().get(fsTag), recordSchema.getTypes().get(rsTag), columnType.getAllUnionObjectTypeInfos().get(rsTag)); - return new StandardUnionObjectInspector.StandardUnion((byte)rsTag, desered); + return new StandardUnionObjectInspector.StandardUnion(rsTag, desered); } private Object deserializeList(Object datum, Schema fileSchema, Schema recordSchema, diff --git serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroLazyObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroLazyObjectInspector.java index e1e4d8bc5e..829538fed6 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroLazyObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroLazyObjectInspector.java @@ -469,7 +469,7 @@ private Object toLazyUnionObject(Object obj, ObjectInspector objectInspector) { LazyUnionObjectInspector lazyUnionOI = (LazyUnionObjectInspector) objectInspector; // Grab the tag and the field - byte tag = standardUnion.getTag(); + int tag = standardUnion.getTag(); Object field = standardUnion.getObject(); ObjectInspector fieldOI = lazyUnionOI.getObjectInspectors().get(tag); diff --git serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerializer.java serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerializer.java index b4c9c22b30..d970ea7a69 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerializer.java +++ serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroSerializer.java @@ -225,7 +225,7 @@ private Object serializePrimitive(TypeInfo typeInfo, PrimitiveObjectInspector fi } private Object serializeUnion(UnionTypeInfo typeInfo, UnionObjectInspector fieldOI, Object structFieldData, Schema schema) throws AvroSerdeException { - byte tag = fieldOI.getTag(structFieldData); + int tag = fieldOI.getTag(structFieldData); // Invariant that Avro's tag ordering must match Hive's. return serialize(typeInfo.getAllUnionObjectTypeInfos().get(tag), diff --git serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/BinarySortableSerDe.java serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/BinarySortableSerDe.java index a48d4fe9cf..4ad904e61f 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/BinarySortableSerDe.java +++ serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/BinarySortableSerDe.java @@ -596,7 +596,7 @@ static Object deserialize(InputByteBuffer buffer, TypeInfo type, StandardUnion r = reuse == null ? new StandardUnion() : (StandardUnion) reuse; // Read the tag - byte tag = buffer.read(invert); + int tag = deserializeInt(buffer, invert); r.setTag(tag); r.setObject(deserialize(buffer, utype.getAllUnionObjectTypeInfos().get(tag), invert, nullMarker, notNullMarker, null)); @@ -874,8 +874,8 @@ static void serialize(ByteStream.Output buffer, Object o, ObjectInspector oi, } case UNION: { UnionObjectInspector uoi = (UnionObjectInspector) oi; - byte tag = uoi.getTag(o); - writeByte(buffer, tag, invert); + int tag = uoi.getTag(o); + serializeInt(buffer, tag, invert); serialize(buffer, uoi.getField(o), uoi.getObjectInspectors().get(tag), invert, nullMarker, notNullMarker); return; diff --git serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableDeserializeRead.java serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableDeserializeRead.java index 461043d587..2ced1d7fd0 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableDeserializeRead.java +++ serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableDeserializeRead.java @@ -248,12 +248,7 @@ private boolean readPrimitive(Field field) throws IOException { return true; case INT: { - final boolean invert = columnSortOrderIsDesc[fieldIndex]; - int v = inputByteBuffer.read(invert) ^ 0x80; - for (int i = 0; i < 3; i++) { - v = (v << 8) + (inputByteBuffer.read(invert) & 0xff); - } - currentInt = v; + currentInt = readInt(fieldIndex); } return true; case LONG: @@ -482,7 +477,14 @@ private boolean readPrimitive(Field field) throws IOException { throw new RuntimeException("Unexpected primitive type category " + field.primitiveCategory); } } - + private int readInt(int fieldIndex) throws IOException { + final boolean invert = columnSortOrderIsDesc[fieldIndex]; + int v = inputByteBuffer.read(invert) ^ 0x80; + for (int i = 0; i < 3; i++) { + v = (v << 8) + (inputByteBuffer.read(invert) & 0xff); + } + return v; + } /* * Reads through an undesired field. * @@ -661,7 +663,7 @@ public boolean readComplexField() throws IOException { if (current.category == Category.UNION) { if (current.index == 0) { - current.tag = inputByteBuffer.read(columnSortOrderIsDesc[root.index]); + current.tag = readInt(root.index); currentInt = current.tag; return true; } diff --git serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java index 2f987bf1af..d4e60a095b 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java +++ serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java @@ -415,7 +415,7 @@ public void finishStruct() { @Override public void beginUnion(int tag) throws IOException { beginElement(); - BinarySortableSerDe.writeByte(output, (byte) tag, columnSortOrderIsDesc[index]); + BinarySortableSerDe.serializeInt(output, tag, columnSortOrderIsDesc[index]); level++; } diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe.java index fb194c8a74..775983acac 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe.java @@ -362,8 +362,8 @@ public static void serialize(ByteStream.Output out, Object obj, if (ois == null) { out.write(nullSequence.getBytes(), 0, nullSequence.getLength()); } else { - LazyUtils.writePrimitiveUTF8(out, new Byte(uoi.getTag(obj)), - PrimitiveObjectInspectorFactory.javaByteObjectInspector, + LazyUtils.writePrimitiveUTF8(out, uoi.getTag(obj), + PrimitiveObjectInspectorFactory.javaIntObjectInspector, escaped, escapeChar, needsEscape); out.write(separator); serialize(out, uoi.getField(obj), ois.get(uoi.getTag(obj)), diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUnion.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUnion.java index d22bc254ef..00717461d8 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUnion.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUnion.java @@ -43,7 +43,7 @@ /** * Tag of the Union */ - private byte tag; + private int tag; /** * Whether init() has been called on the field or not. @@ -63,7 +63,7 @@ public LazyUnion(LazyUnionObjectInspector oi) { } // exceptional use case for avro - public LazyUnion(LazyUnionObjectInspector oi, byte tag, Object field) { + public LazyUnion(LazyUnionObjectInspector oi, int tag, Object field) { super(oi); this.field = field; this.tag = tag; @@ -172,7 +172,7 @@ public Object getField() { * * @return The tag byte */ - public byte getTag() { + public int getTag() { if (fieldSet) { return tag; } diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/VerifyLazy.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/VerifyLazy.java index 17c0357da6..73567ffd11 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/VerifyLazy.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/VerifyLazy.java @@ -104,8 +104,8 @@ public static boolean lazyCompareStruct(StructTypeInfo structTypeInfo, List unionFieldObjectI /** * Return the tag of the object. */ - public byte getTag(Object o) { + public int getTag(Object o) { if (o == null) { return -1; } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java index 9129177375..ad1c54dbee 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java @@ -478,10 +478,10 @@ public Object convert(Object input) { } Object inputFieldValue = inputOI.getField(input); - byte inputFieldTag = inputOI.getTag(input); + int inputFieldTag = inputOI.getTag(input); Object outputFieldValue = null; - int inputFieldTagIndex = ((Byte)inputFieldTag).intValue(); + int inputFieldTagIndex = inputFieldTag; if (inputFieldTagIndex >= 0 && inputFieldTagIndex < fieldConverters.size()) { outputFieldValue = fieldConverters.get(inputFieldTagIndex).convert(inputFieldValue); diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java index a442cb1228..99b42aa8d9 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java @@ -778,7 +778,7 @@ public static int hashCode(Object o, ObjectInspector objIns) { case UNION: UnionObjectInspector uOI = (UnionObjectInspector)objIns; - byte tag = uOI.getTag(o); + int tag = uOI.getTag(o); return hashCode(uOI.getField(o), uOI.getObjectInspectors().get(tag)); default: @@ -916,7 +916,7 @@ public static int hashCodeMurmur(Object o, ObjectInspector objIns, ByteBuffer by case UNION: UnionObjectInspector uOI = (UnionObjectInspector)objIns; - byte tag = uOI.getTag(o); + int tag = uOI.getTag(o); return hashCodeMurmur(uOI.getField(o), uOI.getObjectInspectors().get(tag), byteBuffer); default: @@ -1201,8 +1201,8 @@ public static int compare(Object o1, ObjectInspector oi1, Object o2, case UNION: { UnionObjectInspector uoi1 = (UnionObjectInspector) oi1; UnionObjectInspector uoi2 = (UnionObjectInspector) oi2; - byte tag1 = uoi1.getTag(o1); - byte tag2 = uoi2.getTag(o2); + int tag1 = uoi1.getTag(o1); + int tag2 = uoi2.getTag(o2); if (tag1 != tag2) { return tag1 - tag2; } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/SettableUnionObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/SettableUnionObjectInspector.java index 61f6e758f9..171fd74943 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/SettableUnionObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/SettableUnionObjectInspector.java @@ -30,5 +30,5 @@ public abstract Object create(); /* Sets the field and tag in the union. Returns the union. */ - public abstract Object setFieldAndTag(Object union, Object field, byte tag); + public abstract Object setFieldAndTag(Object union, Object field, int tag); } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardUnionObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardUnionObjectInspector.java index 002514f304..edad76a09c 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardUnionObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/StandardUnionObjectInspector.java @@ -18,7 +18,6 @@ package org.apache.hadoop.hive.serde2.objectinspector; -import java.util.ArrayList; import java.util.List; /** @@ -46,13 +45,14 @@ public StandardUnionObjectInspector(List ois) { } public static class StandardUnion implements UnionObject { - protected byte tag; + protected int tag; protected Object object; public StandardUnion() { } - public StandardUnion(byte tag, Object object) { + public StandardUnion(int tag, Object object) { + assert tag >= 0; this.tag = tag; this.object = object; } @@ -61,7 +61,7 @@ public void setObject(Object o) { this.object = o; } - public void setTag(byte tag) { + public void setTag(int tag) { this.tag = tag; } @@ -71,7 +71,7 @@ public Object getObject() { } @Override - public byte getTag() { + public int getTag() { return tag; } @@ -109,7 +109,7 @@ public boolean equals(Object obj) { /** * Return the tag of the object. */ - public byte getTag(Object o) { + public int getTag(Object o) { if (o == null) { return -1; } @@ -148,11 +148,11 @@ public Object create() { } @Override - public Object setFieldAndTag(Object union, Object field, byte tag) { + public Object setFieldAndTag(Object union, Object field, int tag) { StandardUnion unionObject = (StandardUnion) union; unionObject.setObject(field); if (field == null) { - unionObject.setTag((byte) -1); + unionObject.setTag(-1); } else { unionObject.setTag(tag); } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ThriftUnionObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ThriftUnionObjectInspector.java index cdfaee28bb..0250ebbc4c 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ThriftUnionObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ThriftUnionObjectInspector.java @@ -52,7 +52,7 @@ public boolean shouldIgnoreField(String name) { } @Override - public byte getTag(final Object o) { + public int getTag(final Object o) { if (o == null) { return -1; } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObject.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObject.java index 9ea3b48a96..9f6f1625b9 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObject.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObject.java @@ -34,7 +34,7 @@ * * @return the tag byte */ - byte getTag(); + int getTag(); /** * Get the Object. diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObjectInspector.java index dc0b1b15f2..2aeae1357e 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObjectInspector.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/UnionObjectInspector.java @@ -44,7 +44,7 @@ /** * Return the tag of the object. */ - byte getTag(Object o); + int getTag(Object o); /** * Return the field based on the tag associated with the Object. diff --git serde/src/test/org/apache/hadoop/hive/serde2/SerdeRandomRowSource.java serde/src/test/org/apache/hadoop/hive/serde2/SerdeRandomRowSource.java index 749d8accf7..99e5794fc7 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/SerdeRandomRowSource.java +++ serde/src/test/org/apache/hadoop/hive/serde2/SerdeRandomRowSource.java @@ -740,7 +740,7 @@ public Object randomWritable(TypeInfo typeInfo, ObjectInspector objectInspector, (StandardUnionObjectInspector) objectInspector; final List objectInspectorList = unionObjectInspector.getObjectInspectors(); final int unionCount = objectInspectorList.size(); - final byte tag = (byte) r.nextInt(unionCount); + final int tag = r.nextInt(unionCount); final ObjectInspector fieldObjectInspector = objectInspectorList.get(tag); final TypeInfo fieldTypeInfo = diff --git serde/src/test/org/apache/hadoop/hive/serde2/VerifyFast.java serde/src/test/org/apache/hadoop/hive/serde2/VerifyFast.java index 22aadbb843..dcfc3ebad9 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/VerifyFast.java +++ serde/src/test/org/apache/hadoop/hive/serde2/VerifyFast.java @@ -505,7 +505,7 @@ public static void serializeWrite(SerializeWrite serializeWrite, List fieldTypeInfos = unionTypeInfo.getAllUnionObjectTypeInfos(); final int size = fieldTypeInfos.size(); StandardUnion standardUnion = (StandardUnion) object; - byte tag = standardUnion.getTag(); + int tag = standardUnion.getTag(); serializeWrite.beginUnion(tag); serializeWrite(serializeWrite, fieldTypeInfos.get(tag), standardUnion.getObject()); serializeWrite.finishUnion(); @@ -691,7 +691,7 @@ private static Object getComplexField(DeserializeRead deserializeRead, unionObj = null; } else { // Get the union value. - unionObj = new StandardUnion((byte) tag, getComplexField(deserializeRead, unionTypeInfos.get(tag))); + unionObj = new StandardUnion(tag, getComplexField(deserializeRead, unionTypeInfos.get(tag))); } } diff --git serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableFast.java serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableFast.java index 62741d38d0..dc79f284e4 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableFast.java +++ serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableFast.java @@ -414,7 +414,7 @@ private void testBinarySortableFastCase( Arrays.fill(columnNotNullMarker, BinarySortableSerDe.ONE); /* - * Acending. + * Ascending. */ testBinarySortableFast(source, rows, columnSortOrderIsDesc, columnNullMarker, columnNotNullMarker, diff --git serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java index 32fab314a5..8b8f65e9e6 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java +++ serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestObjectInspectorConverters.java @@ -295,9 +295,9 @@ public void testObjectInspectorConverters() throws Throwable { Converter unionConverter0 = ObjectInspectorConverters.getConverter(ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectors), ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectors2)); - Object convertedObject0 = unionConverter0.convert(new StandardUnion((byte)0, 1)); + Object convertedObject0 = unionConverter0.convert(new StandardUnion(0, 1)); StandardUnion expectedObject0 = new StandardUnion(); - expectedObject0.setTag((byte) 0); + expectedObject0.setTag(0); expectedObject0.setObject("1"); assertEquals(expectedObject0, convertedObject0); @@ -305,9 +305,9 @@ public void testObjectInspectorConverters() throws Throwable { Converter unionConverter1 = ObjectInspectorConverters.getConverter(ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectors), ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectors2)); - Object convertedObject1 = unionConverter1.convert(new StandardUnion((byte)1, "1")); + Object convertedObject1 = unionConverter1.convert(new StandardUnion(1, "1")); StandardUnion expectedObject1 = new StandardUnion(); - expectedObject1.setTag((byte) 1); + expectedObject1.setTag(1); expectedObject1.setObject(1); assertEquals(expectedObject1, convertedObject1); @@ -315,9 +315,9 @@ public void testObjectInspectorConverters() throws Throwable { Converter unionConverter2 = ObjectInspectorConverters.getConverter(ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectors), ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectors2)); - Object convertedObject2 = unionConverter2.convert(new StandardUnion((byte)2, true)); + Object convertedObject2 = unionConverter2.convert(new StandardUnion(2, true)); StandardUnion expectedObject2 = new StandardUnion(); - expectedObject2.setTag((byte) 2); + expectedObject2.setTag(2); expectedObject2.setObject(true); assertEquals(expectedObject2, convertedObject2); @@ -347,9 +347,9 @@ public void testObjectInspectorConverters() throws Throwable { Converter unionConverterExtra = ObjectInspectorConverters.getConverter(ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectorsExtra), ObjectInspectorFactory.getStandardUnionObjectInspector(fieldObjectInspectorsExtra2)); - Object convertedObjectExtra = unionConverterExtra.convert(new StandardUnion((byte)2, true)); + Object convertedObjectExtra = unionConverterExtra.convert(new StandardUnion(2, true)); StandardUnion expectedObjectExtra = new StandardUnion(); - expectedObjectExtra.setTag((byte) -1); + expectedObjectExtra.setTag(-1); expectedObjectExtra.setObject(null); assertEquals(expectedObjectExtra, convertedObjectExtra); // we should get back null diff --git serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java index 17b844c948..5ca1961c61 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java +++ serde/src/test/org/apache/hadoop/hive/serde2/objectinspector/TestStandardObjectInspectors.java @@ -478,25 +478,25 @@ public void testStandardUnionObjectInspector() throws Throwable { assertEquals(-1, uoi1.getTag(null)); // Union - UnionObject union = new StandardUnion((byte) 0, 1); + UnionObject union = new StandardUnion(0, 1); assertEquals(0, uoi1.getTag(union)); assertEquals(1, uoi1.getField(union)); assertEquals("{0:1}", SerDeUtils.getJSONString(union, uoi1)); assertEquals(0, ObjectInspectorUtils.compare(union, uoi1, - new StandardUnion((byte) 0, 1), uoi2)); + new StandardUnion(0, 1), uoi2)); assertTrue(ObjectInspectorUtils.copyToStandardObject( union, uoi1).equals(1)); - union = new StandardUnion((byte) 1, "two"); + union = new StandardUnion(1, "two"); assertEquals(1, uoi1.getTag(union)); assertEquals("two", uoi1.getField(union)); assertEquals("{1:\"two\"}", SerDeUtils.getJSONString(union, uoi1)); assertEquals(0, ObjectInspectorUtils.compare(union, uoi1, - new StandardUnion((byte) 1, "two"), uoi2)); + new StandardUnion(1, "two"), uoi2)); assertTrue(ObjectInspectorUtils.copyToStandardObject( union, uoi1).equals("two")); - union = new StandardUnion((byte) 2, true); + union = new StandardUnion(2, true); assertEquals(2, uoi1.getTag(union)); assertEquals(true, uoi1.getField(union)); assertEquals("{2:true}", SerDeUtils.getJSONString(union, uoi1));