diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java index 73683ff..57c517b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java @@ -66,7 +66,7 @@ public KeyWrapper getKeyWrapper() { transient ListObjectsEqualComparer newKeyStructEqualComparer; class ListKeyWrapper extends KeyWrapper { - int hashcode; + int hashcode = -1; Object[] keys; // decide whether this is already in hashmap (keys in hashmap are deepcopied // version, and we need to use 'currentKeyObjectInspector'). @@ -102,7 +102,11 @@ public boolean equals(Object obj) { if (!(obj instanceof ListKeyWrapper)) { return false; } - Object[] copied_in_hashmap = ((ListKeyWrapper) obj).keys; + ListKeyWrapper other = ((ListKeyWrapper) obj); + if (other.hashcode != this.hashcode && this.hashcode != -1 && other.hashcode != -1) { + return false; + } + Object[] copied_in_hashmap = other.keys; return equalComparer.areEqual(copied_in_hashmap, keys); } @@ -117,6 +121,7 @@ public void getNewKey(Object row, ObjectInspector rowInspector) throws HiveExcep for (int i = 0; i < keyFields.length; i++) { keys[i] = keyFields[i].evaluate(row); } + hashcode = -1; } @Override diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/TestKeyWrapperFactory.java ql/src/test/org/apache/hadoop/hive/ql/exec/TestKeyWrapperFactory.java index 4de6dd0..03c4ed6 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/TestKeyWrapperFactory.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/TestKeyWrapperFactory.java @@ -110,4 +110,12 @@ public void testDifferentWrapperTypesUnequal() { assertFalse(w3.equals(w4)); assertFalse(w4.equals(w3)); } + + @Test + public void testUnsetHashCode() { + KeyWrapper w1 = factory.getKeyWrapper(); + KeyWrapper w2 = w1.copyKey(); + w1.setHashKey(); + assertTrue(w1.equals(w2)); + } }