diff --git a/src/frontend/org/voltdb/VoltTable.java b/src/frontend/org/voltdb/VoltTable.java index 1c5d73318d5..4bcd87c2df9 100644 --- a/src/frontend/org/voltdb/VoltTable.java +++ b/src/frontend/org/voltdb/VoltTable.java @@ -1310,7 +1310,10 @@ public byte[] getCompressedBytes() throws IOException { return CompressionService.compressBuffer(m_buffer); } else { assert(m_buffer.hasArray()); - return CompressionService.compressBytes(m_buffer.array(), m_buffer.position(), m_buffer.limit()); + return CompressionService.compressBytes( + m_buffer.array(), + m_buffer.arrayOffset() + m_buffer.position(), + m_buffer.limit()); } } finally { m_buffer.position(startPosition); @@ -1325,7 +1328,10 @@ public Future getCompressedBytesAsync() throws IOException { return CompressionService.compressBufferAsync(m_buffer.duplicate()); } else { assert(m_buffer.hasArray()); - return CompressionService.compressBytesAsync(m_buffer.array(), m_buffer.position(), m_buffer.limit()); + return CompressionService.compressBytesAsync( + m_buffer.array(), + m_buffer.arrayOffset() + m_buffer.position(), + m_buffer.limit()); } } finally { m_buffer.position(startPosition); diff --git a/tests/frontend/org/voltdb/TestVoltTable.java b/tests/frontend/org/voltdb/TestVoltTable.java index ed3323f3adc..20e558cca66 100644 --- a/tests/frontend/org/voltdb/TestVoltTable.java +++ b/tests/frontend/org/voltdb/TestVoltTable.java @@ -263,6 +263,58 @@ public void testResizedTable() { } } + /* + * Use a heap buffer with an array offset to simulate a result set + * from the EE + */ + public void testCompressionWithArrayOffset() throws Exception { + testResizedTable(); + ByteBuffer buf = t.getBuffer(); + byte bytes[] = new byte[buf.remaining() + 12]; + byte subBytes[] = new byte[buf.remaining()]; + buf.get(subBytes); + System.arraycopy(subBytes, 0, bytes, 12, subBytes.length); + + buf = ByteBuffer.wrap(bytes); + buf.position(12); + buf = buf.slice(); + + VoltTable vt = PrivateVoltTableFactory.createVoltTableFromBuffer(buf, true); + + FastSerializer fs = new FastSerializer(); + fs.writeObject(t); + + byte uncompressedBytes[] = fs.getBytes(); + + + /* + * Test the sync method + */ + byte decompressedBytes[] = CompressionService + .decompressBytes(vt.getCompressedBytes()); + vt = PrivateVoltTableFactory.createVoltTableFromBuffer( + ByteBuffer.wrap(decompressedBytes), true); + fs = new FastSerializer(); + fs.writeObject(vt); + byte bytesForComparison[] = fs.getBytes(); + assertTrue(java.util.Arrays.equals(bytesForComparison, + uncompressedBytes)); + + /* + * Now test async + */ + vt = PrivateVoltTableFactory.createVoltTableFromBuffer(buf, true); + decompressedBytes = CompressionService + .decompressBytes(vt.getCompressedBytes()); + vt = PrivateVoltTableFactory.createVoltTableFromBuffer( + ByteBuffer.wrap(decompressedBytes), true); + fs = new FastSerializer(); + fs.writeObject(vt); + bytesForComparison = fs.getBytes(); + assertTrue(java.util.Arrays.equals(bytesForComparison, + uncompressedBytes)); + } + public void testCompression() throws Exception { testResizedTable(); byte compressedBytes[] = t.getCompressedBytes();