[ https://issues.apache.org/jira/browse/LUCENE-10431?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17498799#comment-17498799 ]
Alan Woodward commented on LUCENE-10431: ---------------------------------------- I think the issue is that BooleanQuery is expecting all its subqueries to be immutable, but MultiTermQuery isn't - you can set the rewrite method, which changes the hash. I think ideally we'd make MTQ properly immutable and have the rewrite method as part of the constructor, especially as there are already cases like FuzzyQuery that have specific rewrite methods that shouldn't be externally settable, but that is a pretty big change. A more immediate fix would be to remove the rewrite method from MTQ's hash calculation. > AssertionError in BooleanQuery.hashCode() > ----------------------------------------- > > Key: LUCENE-10431 > URL: https://issues.apache.org/jira/browse/LUCENE-10431 > Project: Lucene - Core > Issue Type: Bug > Affects Versions: 8.11.1 > Reporter: Michael Bien > Priority: Major > > Hello devs, > the constructor of BooleanQuery can under some circumstances trigger a hash > code computation before "clauseSets" is fully filled. Since BooleanClause is > using its query field for the hash code too, it can happen that the "wrong" > hash code is stored, since adding the clause to the set triggers its > hashCode(). > If assertions are enabled the check in BooleanQuery, which recomputes the > hash code, will notice it and throw an error. > exception: > {code:java} > java.lang.AssertionError > at org.apache.lucene.search.BooleanQuery.hashCode(BooleanQuery.java:614) > at java.base/java.util.Objects.hashCode(Objects.java:103) > at java.base/java.util.HashMap$Node.hashCode(HashMap.java:298) > at java.base/java.util.AbstractMap.hashCode(AbstractMap.java:527) > at org.apache.lucene.search.Multiset.hashCode(Multiset.java:119) > at java.base/java.util.EnumMap.entryHashCode(EnumMap.java:717) > at java.base/java.util.EnumMap.hashCode(EnumMap.java:709) > at java.base/java.util.Arrays.hashCode(Arrays.java:4498) > at java.base/java.util.Objects.hash(Objects.java:133) > at > org.apache.lucene.search.BooleanQuery.computeHashCode(BooleanQuery.java:597) > at org.apache.lucene.search.BooleanQuery.hashCode(BooleanQuery.java:611) > at java.base/java.util.HashMap.hash(HashMap.java:340) > at java.base/java.util.HashMap.put(HashMap.java:612) > at org.apache.lucene.search.Multiset.add(Multiset.java:82) > at org.apache.lucene.search.BooleanQuery.<init>(BooleanQuery.java:154) > at org.apache.lucene.search.BooleanQuery.<init>(BooleanQuery.java:42) > at > org.apache.lucene.search.BooleanQuery$Builder.build(BooleanQuery.java:133) > {code} > I noticed this while trying to upgrade the NetBeans maven indexer modules > from lucene 5.x to 8.x https://github.com/apache/netbeans/pull/3558 -- This message was sent by Atlassian Jira (v8.20.1#820001) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For additional commands, e-mail: issues-h...@lucene.apache.org