diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDesc.java index 0fe9eda..15267b9 100755 --- ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDesc.java @@ -98,21 +98,22 @@ public String getName() { // This wraps an instance of an ExprNodeDesc, and makes equals work like isSame, see comment on // isSame - public static class ExprNodeDescEqualityWrapper { - private ExprNodeDesc exprNodeDesc; + public final static class ExprNodeDescEqualityWrapper { + private final ExprNodeDesc exprNodeDesc; + // beware of any implementation whose hashcode is mutable by reference + // inserting into a Map and then changing the hashcode can make it + // disappear out of the Map during lookups + private final int hashcode; public ExprNodeDescEqualityWrapper(ExprNodeDesc exprNodeDesc) { this.exprNodeDesc = exprNodeDesc; + this.hashcode = exprNodeDesc == null ? 0 : exprNodeDesc.hashCode(); } public ExprNodeDesc getExprNodeDesc() { return exprNodeDesc; } - public void setExprNodeDesc(ExprNodeDesc exprNodeDesc) { - this.exprNodeDesc = exprNodeDesc; - } - @Override public boolean equals(Object other) { @@ -125,7 +126,7 @@ public boolean equals(Object other) { @Override public int hashCode() { - return exprNodeDesc == null ? 0 : exprNodeDesc.hashCode(); + return hashcode; } /* helper function to allow Set()/Collection() operations with ExprNodeDesc */