You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2011/06/09 17:32:18 UTC
svn commit: r1133937 - in /lucene/dev/trunk/lucene: CHANGES.txt
src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java
src/java/org/apache/lucene/index/codecs/preflex/TermInfosReader.java
src/test/org/apache/lucene/index/TestIndexWriter.java
Author: mikemccand
Date: Thu Jun 9 15:32:17 2011
New Revision: 1133937
URL: http://svn.apache.org/viewvc?rev=1133937&view=rev
Log:
LUCENE-3183: fix corner case seeking to Term(, )
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/TermInfosReader.java
lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1133937&r1=1133936&r2=1133937&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Thu Jun 9 15:32:17 2011
@@ -468,6 +468,11 @@ Bug fixes
* 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.
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java?rev=1133937&r1=1133936&r2=1133937&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/SegmentTermEnum.java Thu Jun 9 15:32:17 2011
@@ -153,8 +153,12 @@ public final class SegmentTermEnum imple
return true;
}
- /** Optimized scan, without allocating new terms.
- * Return number of invocations to next(). */
+ /* Optimized scan, without allocating new terms.
+ * Return number of invocations to next().
+ *
+ * NOTE: LUCENE-3183: if you pass Term("", "") here then this
+ * will incorrectly return before positioning the enum,
+ * and position will be -1; caller must detect this. */
final int scanTo(Term term) throws IOException {
scanBuffer.set(term);
int count = 0;
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/TermInfosReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/TermInfosReader.java?rev=1133937&r1=1133936&r2=1133937&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/TermInfosReader.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/preflex/TermInfosReader.java Thu Jun 9 15:32:17 2011
@@ -57,6 +57,7 @@ public final class TermInfosReader {
final long termOrd;
public TermInfoAndOrd(TermInfo ti, long termOrd) {
super(ti);
+ assert termOrd >= 0;
this.termOrd = termOrd;
}
}
@@ -306,7 +307,13 @@ public final class TermInfosReader {
ti = enumerator.termInfo;
if (tiOrd == null) {
if (useCache) {
- termsCache.put(new CloneableTerm(term), new TermInfoAndOrd(ti, enumerator.position));
+ // LUCENE-3183: it's possible, if term is Term("",
+ // ""), for the STE to be incorrectly un-positioned
+ // after scan-to; work around this by not caching in
+ // this case:
+ if (enumerator.position >= 0) {
+ termsCache.put(new CloneableTerm(term), new TermInfoAndOrd(ti, enumerator.position));
+ }
}
} else {
assert sameTermInfo(ti, tiOrd, enumerator);
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java?rev=1133937&r1=1133936&r2=1133937&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java Thu Jun 9 15:32:17 2011
@@ -73,6 +73,7 @@ import org.apache.lucene.util.LuceneTest
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,18 @@ public class TestIndexWriter extends Luc
reader.close();
dir.close();
}
+
+ // LUCENE-3183
+ public void testEmptyFieldNameTIIOne() throws IOException {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
+ 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();
+ }
}