diff --git a/lucene/core/src/test/org/apache/lucene/codecs/lucene90/TestLucene90DocValuesFormat.java b/lucene/core/src/test/org/apache/lucene/codecs/lucene90/TestLucene90DocValuesFormat.java index b151d8ca7e5..86a45d1fb7e 100644 --- a/lucene/core/src/test/org/apache/lucene/codecs/lucene90/TestLucene90DocValuesFormat.java +++ b/lucene/core/src/test/org/apache/lucene/codecs/lucene90/TestLucene90DocValuesFormat.java @@ -65,6 +65,7 @@ import org.apache.lucene.index.TermsEnum.SeekStatus; import org.apache.lucene.store.ByteBuffersDataInput; import org.apache.lucene.store.ByteBuffersDataOutput; import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.FilterDirectory; import org.apache.lucene.store.FilterIndexInput; import org.apache.lucene.store.IOContext; @@ -374,6 +375,29 @@ public class TestLucene90DocValuesFormat extends BaseCompressingDocValuesFormatT } } + @Monster("writes 3GB of binary doc values, needs -Ptests.heapsize=8g") + public void testBinaryValuesBulkFetchOver2GB() throws Exception { + try (Directory dir = FSDirectory.open(createTempDir())) { + try (IndexWriter w = new IndexWriter(dir, new IndexWriterConfig())) { + for (int i = 0; i < 3; i++) { + byte[] bytes = new byte[1 << 30]; // 1GB value; the limit is ArrayUtil.MAX_ARRAY_LENGTH + bytes[0] = (byte) i; + Document doc = new Document(); + doc.add(new BinaryDocValuesField("f", new BytesRef(bytes))); + w.addDocument(doc); + } + w.forceMerge(1); + } + try (DirectoryReader reader = DirectoryReader.open(dir)) { + BinaryDocValues values = getOnlyLeafReader(reader).getBinaryDocValues("f"); + BytesRef[] actual = new BytesRef[2]; + values.binaryValues(2, new int[] {0, 2}, actual); // 2 x 1GB in one call + assertEquals(0, actual[0].bytes[actual[0].offset]); + assertEquals(2, actual[1].bytes[actual[1].offset]); + } + } + } + public void testSparseBinaryValuesBulkFetch() throws Exception { final int numDocs = 512; final BytesRef[] expected = new BytesRef[numDocs];