Commit 205bf59a authored by Marko Mäkelä's avatar Marko Mäkelä

Bug#16736929 PAGE_ZIP_DECOMPRESS() FAILS ON EMPTY RECORD

When a record contains no user data bytes (such as when the PRIMARY
KEY is an empty string and all secondary index fields are NULL or the
empty string), page_zip_decompress() could fail to set the record
heap_no correctly.

page_zip_decompress_node_ptrs(), page_zip_decompress_sec(),
page_zip_decompress_clust(): Set heap_no also at the end of the
compressed data stream.

rb#2448 approved by Jimmy Yang and Inaam Rana
parent 1eb7e211
2013-05-15 The InnoDB Team
* page/page0zip.c:
Fix Bug#16736929 PAGE_ZIP_DECOMPRESS() FAILS ON EMPTY RECORD
2013-03-12 The InnoDB Team 2013-03-12 The InnoDB Team
* include/page0zip.ic, page/page0zip.c: * include/page0zip.ic, page/page0zip.c:
......
...@@ -2148,8 +2148,19 @@ page_zip_decompress_node_ptrs( ...@@ -2148,8 +2148,19 @@ page_zip_decompress_node_ptrs(
- PAGE_ZIP_START - PAGE_DIR); - PAGE_ZIP_START - PAGE_DIR);
switch (inflate(d_stream, Z_SYNC_FLUSH)) { switch (inflate(d_stream, Z_SYNC_FLUSH)) {
case Z_STREAM_END: case Z_STREAM_END:
/* Apparently, n_dense has grown if (d_stream->next_out
since the time the page was last compressed. */ != rec - REC_N_NEW_EXTRA_BYTES) {
/* n_dense has grown since the page
was last compressed. */
} else {
/* Skip the REC_N_NEW_EXTRA_BYTES. */
d_stream->next_out = rec;
/* Set heap_no and the status bits. */
mach_write_to_2(rec - REC_NEW_HEAP_NO,
heap_status);
heap_status += 1 << REC_HEAP_NO_SHIFT;
}
goto zlib_done; goto zlib_done;
case Z_OK: case Z_OK:
case Z_BUF_ERROR: case Z_BUF_ERROR:
...@@ -2337,8 +2348,19 @@ page_zip_decompress_sec( ...@@ -2337,8 +2348,19 @@ page_zip_decompress_sec(
if (UNIV_LIKELY(d_stream->avail_out)) { if (UNIV_LIKELY(d_stream->avail_out)) {
switch (inflate(d_stream, Z_SYNC_FLUSH)) { switch (inflate(d_stream, Z_SYNC_FLUSH)) {
case Z_STREAM_END: case Z_STREAM_END:
/* Apparently, n_dense has grown if (d_stream->next_out
since the time the page was last compressed. */ != rec - REC_N_NEW_EXTRA_BYTES) {
/* n_dense has grown since the page
was last compressed. */
} else {
/* Skip the REC_N_NEW_EXTRA_BYTES. */
d_stream->next_out = rec;
/* Set heap_no and the status bits. */
mach_write_to_2(rec - REC_NEW_HEAP_NO,
heap_status);
heap_status += 1 << REC_HEAP_NO_SHIFT;
}
goto zlib_done; goto zlib_done;
case Z_OK: case Z_OK:
case Z_BUF_ERROR: case Z_BUF_ERROR:
...@@ -2596,8 +2618,19 @@ page_zip_decompress_clust( ...@@ -2596,8 +2618,19 @@ page_zip_decompress_clust(
err = inflate(d_stream, Z_SYNC_FLUSH); err = inflate(d_stream, Z_SYNC_FLUSH);
switch (err) { switch (err) {
case Z_STREAM_END: case Z_STREAM_END:
/* Apparently, n_dense has grown if (d_stream->next_out
since the time the page was last compressed. */ != rec - REC_N_NEW_EXTRA_BYTES) {
/* n_dense has grown since the page
was last compressed. */
} else {
/* Skip the REC_N_NEW_EXTRA_BYTES. */
d_stream->next_out = rec;
/* Set heap_no and the status bits. */
mach_write_to_2(rec - REC_NEW_HEAP_NO,
heap_status);
heap_status += 1 << REC_HEAP_NO_SHIFT;
}
goto zlib_done; goto zlib_done;
case Z_OK: case Z_OK:
case Z_BUF_ERROR: case Z_BUF_ERROR:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment