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 2013/09/26 16:59:52 UTC
svn commit: r1526538 - in /lucene/dev/trunk: ./ lucene/ lucene/core/
lucene/core/src/java/org/apache/lucene/util/PagedBytes.java
lucene/test-framework/
lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
Author: mikemccand
Date: Thu Sep 26 14:59:51 2013
New Revision: 1526538
URL: http://svn.apache.org/r1526538
Log:
LUCENE-5218: fix exception when trying to read a 0-byte BinaryDocValues field
Modified:
lucene/dev/trunk/ (props changed)
lucene/dev/trunk/lucene/ (props changed)
lucene/dev/trunk/lucene/core/ (props changed)
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java
lucene/dev/trunk/lucene/test-framework/ (props changed)
lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java?rev=1526538&r1=1526537&r2=1526538&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java Thu Sep 26 14:59:51 2013
@@ -86,9 +86,12 @@ public final class PagedBytes {
public void fillSlice(BytesRef b, long start, int length) {
assert length >= 0: "length=" + length;
assert length <= blockSize+1: "length=" + length;
+ b.length = length;
+ if (length == 0) {
+ return;
+ }
final int index = (int) (start >> blockBits);
final int offset = (int) (start & blockMask);
- b.length = length;
if (blockSize - offset >= length) {
// Within block
b.bytes = blocks[index];
Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java?rev=1526538&r1=1526537&r2=1526538&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java Thu Sep 26 14:59:51 2013
@@ -1432,7 +1432,7 @@ public abstract class BaseDocValuesForma
public void testBinaryFixedLengthVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- int fixedLength = _TestUtil.nextInt(random(), 1, 10);
+ int fixedLength = _TestUtil.nextInt(random(), 0, 10);
doTestBinaryVsStoredFields(fixedLength, fixedLength);
}
}
@@ -1440,7 +1440,7 @@ public abstract class BaseDocValuesForma
public void testBinaryVariableLengthVsStoredFields() throws Exception {
int numIterations = atLeast(1);
for (int i = 0; i < numIterations; i++) {
- doTestBinaryVsStoredFields(1, 10);
+ doTestBinaryVsStoredFields(0, 10);
}
}
@@ -2958,6 +2958,43 @@ public abstract class BaseDocValuesForma
dir.close();
}
+ // LUCENE-5218
+ public void testEmptyBinaryValueOnPageSizes() throws Exception {
+ // Test larger and larger power-of-two sized values,
+ // followed by empty string value:
+ for(int i=0;i<20;i++) {
+ if (i > 14 && codecAcceptsHugeBinaryValues("field") == false) {
+ break;
+ }
+ Directory dir = newDirectory();
+ RandomIndexWriter w = new RandomIndexWriter(random(), dir);
+ BytesRef bytes = new BytesRef();
+ bytes.bytes = new byte[1<<i];
+ bytes.length = 1<<i;
+ for(int j=0;j<4;j++) {
+ Document doc = new Document();
+ doc.add(new BinaryDocValuesField("field", bytes));
+ w.addDocument(doc);
+ }
+ Document doc = new Document();
+ doc.add(new StoredField("id", "5"));
+ doc.add(new BinaryDocValuesField("field", new BytesRef()));
+ w.addDocument(doc);
+ IndexReader r = w.getReader();
+ w.close();
+
+ AtomicReader ar = SlowCompositeReaderWrapper.wrap(r);
+ BinaryDocValues values = ar.getBinaryDocValues("field");
+ BytesRef result = new BytesRef();
+ for(int j=0;j<5;j++) {
+ values.get(0, result);
+ assertTrue(result.length == 0 || result.length == 1<<i);
+ }
+ ar.close();
+ dir.close();
+ }
+ }
+
protected boolean codecAcceptsHugeBinaryValues(String field) {
return true;
}