From d98e92a87cc6f8d17a8fb3ec2e2402c7795517d3 Mon Sep 17 00:00:00 2001 From: Michael McCandless Date: Thu, 26 Sep 2013 14:59:51 +0000 Subject: [PATCH] LUCENE-5218: fix exception when trying to read a 0-byte BinaryDocValues field git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1526538 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/lucene/util/PagedBytes.java | 5 ++- .../index/BaseDocValuesFormatTestCase.java | 41 ++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java b/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java index f885cb72fae..99504e69958 100644 --- a/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java +++ b/lucene/core/src/java/org/apache/lucene/util/PagedBytes.java @@ -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]; diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java index 53d12ae2dd9..7547a9dac77 100644 --- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java +++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java @@ -1432,7 +1432,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase { 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 BaseDocValuesFormatTestCase extends LuceneTestCase { 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 BaseDocValuesFormatTestCase extends LuceneTestCase { 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<