diff --git a/parquet-column/src/main/java/org/apache/parquet/io/api/Binary.java b/parquet-column/src/main/java/org/apache/parquet/io/api/Binary.java index 3160f091e7..2af556ec68 100644 --- a/parquet-column/src/main/java/org/apache/parquet/io/api/Binary.java +++ b/parquet-column/src/main/java/org/apache/parquet/io/api/Binary.java @@ -587,7 +587,7 @@ public short get2BytesLittleEndian() { throw new IllegalArgumentException("length must be 2"); } - return value.order(ByteOrder.LITTLE_ENDIAN).getShort(offset); + return value.duplicate().order(ByteOrder.LITTLE_ENDIAN).getShort(offset); } @Override diff --git a/parquet-column/src/test/java/org/apache/parquet/io/api/TestBinary.java b/parquet-column/src/test/java/org/apache/parquet/io/api/TestBinary.java index cda54becd9..d925572bca 100644 --- a/parquet-column/src/test/java/org/apache/parquet/io/api/TestBinary.java +++ b/parquet-column/src/test/java/org/apache/parquet/io/api/TestBinary.java @@ -27,6 +27,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; import java.util.Arrays; import org.apache.parquet.io.ParquetEncodingException; @@ -422,6 +423,27 @@ public void testGet2BytesLittleEndian() { assertThat(b3.get2BytesLittleEndian()).isEqualTo((short) 0x0201); } + @Test + public void testGet2BytesLittleEndianPreservesByteBufferOrder() { + assertGet2BytesLittleEndianPreservesOrder(ByteBuffer.wrap(new byte[] {0x01, 0x02})); + + ByteBuffer direct = ByteBuffer.allocateDirect(2); + direct.put(new byte[] {0x01, 0x02}); + direct.flip(); + assertGet2BytesLittleEndianPreservesOrder(direct); + + assertGet2BytesLittleEndianPreservesOrder( + ByteBuffer.wrap(new byte[] {0x01, 0x02}).asReadOnlyBuffer()); + } + + private static void assertGet2BytesLittleEndianPreservesOrder(ByteBuffer buffer) { + buffer.order(ByteOrder.BIG_ENDIAN); + Binary binary = Binary.fromConstantByteBuffer(buffer); + + assertThat(binary.get2BytesLittleEndian()).isEqualTo((short) 0x0201); + assertThat(buffer.order()).isEqualTo(ByteOrder.BIG_ENDIAN); + } + @Test public void testGet2BytesLittleEndianWrongLength() { // ByteBufferBackedBinary: get2BytesLittleEndian