Uploaded image for project: 'Lucene - Core'
  1. Lucene - Core
  2. LUCENE-8666

NPE in o.a.l.codecs.perfield.PerFieldPostingsFormat

Details

    • Bug
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 7.5, 9.0
    • None
    • core/codecs
    • New

    Description

      Requesting this URL in SOLR gives a 500 error with a stack trace pointing to Lucene:

      http://localhost:8983/solr/films/select?q=\{!complexphrase}genre:"-om*"

      The stack trace is (cut down to the reasonably relevant part):

      {{java.lang.NullPointerException\n\tat java.util.TreeMap.getEntry(TreeMap.java:347)
      at java.util.TreeMap.get(TreeMap.java:278)
      at org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsReader.terms(PerFieldPostingsFormat.java:311)
      at org.apache.lucene.index.CodecReader.terms(CodecReader.java:106)
      at org.apache.lucene.index.FilterLeafReader.terms(FilterLeafReader.java:351)
      at org.apache.lucene.index.ExitableDirectoryReader$ExitableFilterAtomicReader.terms(ExitableDirectoryReader.java:91)
      at org.apache.lucene.search.spans.SpanNearQuery$SpanNearWeight.getSpans(SpanNearQuery.java:208)
      at org.apache.lucene.search.spans.SpanNotQuery$SpanNotWeight.getSpans(SpanNotQuery.java:127)
      at org.apache.lucene.search.spans.SpanWeight.scorer(SpanWeight.java:135)
      at org.apache.lucene.search.spans.SpanWeight.scorer(SpanWeight.java:46)
      at org.apache.lucene.search.Weight.bulkScorer(Weight.java:177)
      at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:649)
      at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:443)
      at org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:200)
      at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1604)}}The error is actually a bit deeper and can be traced back to the o.a.l.queryparser.complexPhrase.ComplexPhraseQueryParser class.

      Handling this query involves constructing a SpanQuery, which happens in the rewrite method of ComplexPhraseQueryParser. In particular, the expression is decomposed into a BooleanQuery, which has exactly one clause, namely the negative clause -genre:”om*”. The rewrite method then further transforms this into a SpanQuery; in this case, it goes into the path that handles complex queries with both positive and negative clauses. It extracts the subset of positive clauses - note that this set of clauses is empty for this query. The positive clauses are then combined into a SpanNearQuery (around line 340), which is then used to build a SpanNotQuery. Further down the line, the field attribute of the SpanNearQuery is accessed and used as an index into a TreeMap. But since we had an empty set of positive clauses, the SpanNearQuery does not have its field attribute set, so we get a null here - this leads to an exception. A possible fix would be to detect the situation where we have an empty set of positive clauses and include a single synthetic clause that matches either everything or nothing. See attached file 0001-Fix-NullPointerException.patch.

      This bug was found using Diffblue Microservices Testing. Find more information on this test campaign.

      Attachments

        1. home.zip
          376 kB
          Johannes Kloos
        2. 0001-Fix-NullPointerException.patch
          2 kB
          Johannes Kloos

        Activity

          People

            Unassigned Unassigned
            jkloos Johannes Kloos
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: