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
This commit is contained in:
parent
6147874587
commit
1d3a200bb5
@ -1,3 +1,8 @@
|
|||||||
|
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(
|
|||||||
- 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(
|
|||||||
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(
|
|||||||
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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user