Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1133885) +++ lucene/CHANGES.txt (working copy) @@ -468,6 +468,11 @@ * LUCENE-3102: CachingCollector.replay was failing to call setScorer per-segment (Martijn van Groningen via Mike McCandless) +* LUCENE-3183: Fix rare corner case where seeking to empty term + (field="", term="") with terms index interval 1 could hit + ArrayIndexOutOfBoundsException (selckin, Robert Muir, Mike + McCandless) + New Features * LUCENE-3140: Added experimental FST implementation to Lucene. Index: lucene/src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestIndexWriter.java (revision 1133885) +++ lucene/src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) @@ -73,6 +73,7 @@ import org.apache.lucene.util.ThreadInterruptedException; import org.apache.lucene.util.UnicodeUtil; import org.apache.lucene.util._TestUtil; +import org.apache.lucene.index.codecs.preflexrw.PreFlexRWCodec; public class TestIndexWriter extends LuceneTestCase { @@ -1763,4 +1764,19 @@ reader.close(); dir.close(); } + + // LUCENE-3183 + public void testEmptyFieldNameTIIOne() throws IOException { + Directory dir = newDirectory(); + IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)) + .setCodecProvider(_TestUtil.alwaysCodec(new PreFlexRWCodec())); + iwc.setTermIndexInterval(1); + iwc.setReaderTermsIndexDivisor(1); + IndexWriter writer = new IndexWriter(dir, iwc); + Document doc = new Document(); + doc.add(newField("", "a b c", Field.Store.NO, Field.Index.ANALYZED)); + writer.addDocument(doc); + writer.close(); + dir.close(); + } } Index: lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java (revision 1133885) +++ lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java (working copy) @@ -61,6 +61,7 @@ int skipInterval; int newSuffixStart; int maxSkipLevels; + private boolean first = true; SegmentTermEnum(IndexInput i, FieldInfos fis, boolean isi) throws CorruptIndexException, IOException { @@ -123,6 +124,7 @@ prevBuffer.reset(); //System.out.println(" ste doSeek prev=" + prevBuffer.toTerm() + " this=" + this); termInfo.set(ti); + first = p == -1; } /** Increments the enumeration to the next element. True if one exists.*/ @@ -158,6 +160,13 @@ final int scanTo(Term term) throws IOException { scanBuffer.set(term); int count = 0; + if (first) { + // Always force initial next() in case term is + // Term("", "") + next(); + first = false; + count++; + } while (scanBuffer.compareTo(termBuffer) > 0 && next()) { count++; }