diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/GroupByOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/GroupByOperator.java index 792d87f..77ac7fb 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/GroupByOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/GroupByOperator.java @@ -626,9 +626,9 @@ protected void updateAggregations(AggregationBuffer[] aggs, Object row, if (lastInvoke[ai] == null) { lastInvoke[ai] = new Object[o.length]; } - if (ObjectInspectorUtils.compare(o, + if (!ObjectInspectorUtils.equals(o, aggregationParameterObjectInspectors[ai], lastInvoke[ai], - aggregationParameterStandardObjectInspectors[ai]) != 0) { + aggregationParameterStandardObjectInspectors[ai])) { aggregationEvaluators[ai].aggregate(aggs[ai], o); for (int pi = 0; pi < o.length; pi++) { lastInvoke[ai][pi] = ObjectInspectorUtils.copyToStandardObject( @@ -676,10 +676,10 @@ protected void updateAggregations(AggregationBuffer[] aggs, Object row, if (lastInvoke[i] == null) { lastInvoke[i] = new Object[o.length]; } - if (ObjectInspectorUtils.compare(o, + if (!ObjectInspectorUtils.equals(o, aggregationParameterObjectInspectors[i], lastInvoke[i], - aggregationParameterStandardObjectInspectors[i]) != 0) { + aggregationParameterStandardObjectInspectors[i])) { aggregationEvaluators[i].aggregate(aggs[i], o); for (int pi = 0; pi < o.length; pi++) { lastInvoke[i][pi] = ObjectInspectorUtils.copyToStandardObject( diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFArrayContains.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFArrayContains.java index 510f367..e961f95 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFArrayContains.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFArrayContains.java @@ -117,8 +117,8 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { for (int i=0; i fields1 = soi1.getAllStructFieldRefs(); + List fields2 = soi2.getAllStructFieldRefs(); + int size1 = fields1.size(); + int size2 = fields2.size(); + if (size1 != size2) { + return false; + } + for (int i = 0; i < size1; i++) { + if (!equals(soi1.getStructFieldData(o1, fields1.get(i)), fields1 + .get(i).getFieldObjectInspector(), soi2.getStructFieldData(o2, + fields2.get(i)), fields2.get(i).getFieldObjectInspector(), mapEqualComparer)) { + return false; + } + } + return true; + } + case LIST: { + ListObjectInspector loi1 = (ListObjectInspector) oi1; + ListObjectInspector loi2 = (ListObjectInspector) oi2; + int size1 = loi1.getListLength(o1); + int size2 = loi2.getListLength(o2); + if (size1 != size2) { + return false; + } + for (int i = 0; i < size1; i++) { + if (!equals(loi1.getListElement(o1, i), loi1 + .getListElementObjectInspector(), loi2.getListElement(o2, i), loi2 + .getListElementObjectInspector(), mapEqualComparer)) { + return false; + } + } + return true; + } + case MAP: { + if (mapEqualComparer == null) { + throw new RuntimeException("Compare on map type not supported!"); + } + MapObjectInspector moi1 = (MapObjectInspector) oi1; + MapObjectInspector moi2 = (MapObjectInspector) oi2; + int size1 = moi1.getMapSize(o1); + int size2 = moi2.getMapSize(o2); + if (size1 != size2) { + return false; + } + return mapEqualComparer.compare(o1, moi1, o2, moi2) == 0; + } + case UNION: { + UnionObjectInspector uoi1 = (UnionObjectInspector) oi1; + UnionObjectInspector uoi2 = (UnionObjectInspector) oi2; + byte tag1 = uoi1.getTag(o1); + byte tag2 = uoi2.getTag(o2); + if (tag1 != tag2) { + return false; + } + return equals(uoi1.getField(o1), + uoi1.getObjectInspectors().get(tag1), + uoi2.getField(o2), uoi2.getObjectInspectors().get(tag2), + mapEqualComparer); + } + default: + throw new RuntimeException("Compare on unknown type: " + + oi1.getCategory()); + } + } + /** * Get the list of field names as csv from a StructObjectInspector. */ diff --git serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableSerDe.java serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableSerDe.java index cefb72e..7b6bdc0 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableSerDe.java +++ serde/src/test/org/apache/hadoop/hive/serde2/binarysortable/TestBinarySortableSerDe.java @@ -112,7 +112,7 @@ private void testBinarySortableSerDe(Object[] rows, ObjectInspector rowOI, Object[] deserialized = new Object[rows.length]; for (int i = 0; i < rows.length; i++) { deserialized[i] = serde.deserialize(bytes[i]); - if (0 != ObjectInspectorUtils.compare(rows[i], rowOI, deserialized[i], + if (!ObjectInspectorUtils.equals(rows[i], rowOI, deserialized[i], serdeOI)) { System.out.println("structs[" + i + "] = " + SerDeUtils.getJSONString(rows[i], rowOI)); diff --git serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/TestLazyBinarySerDe.java serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/TestLazyBinarySerDe.java index 02ae6f8..7ec3e65 100644 --- serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/TestLazyBinarySerDe.java +++ serde/src/test/org/apache/hadoop/hive/serde2/lazybinary/TestLazyBinarySerDe.java @@ -129,7 +129,7 @@ private void testLazyBinarySerDe(Object[] rows, ObjectInspector rowOI, Object[] deserialized = new Object[rows.length]; for (int i = 0; i < rows.length; i++) { deserialized[i] = serde.deserialize(bytes[i]); - if (0 != ObjectInspectorUtils.compare(rows[i], rowOI, deserialized[i], + if (!ObjectInspectorUtils.equals(rows[i], rowOI, deserialized[i], serdeOI)) { System.out.println("structs[" + i + "] = " + SerDeUtils.getJSONString(rows[i], rowOI)); @@ -462,9 +462,9 @@ void testLazyBinaryMap(Random r) throws Throwable { boolean bEqual = false; for (Map.Entry entryoutput : outputmp.entrySet()) { // find the same key - if (0 == ObjectInspectorUtils.compare(entryoutput.getKey(), + if (ObjectInspectorUtils.equals(entryoutput.getKey(), lazympkeyoi, entryinput.getKey(), inputmpkeyoi)) { - if (0 != ObjectInspectorUtils.compare(entryoutput.getValue(), + if (!ObjectInspectorUtils.equals(entryoutput.getValue(), lazympvalueoi, entryinput.getValue(), inputmpvalueoi)) { assertEquals(entryoutput.getValue(), entryinput.getValue()); } else {