Commit ac5b886f authored by marko's avatar marko

branches/zip: Fix some BLOB handling bugs.

btr_store_big_rec_extern_fields(): Assert that page_zip is non-NULL
if and only if dict_table_is_zip() holds.

btr_free_externally_stored_field(): Observe dict_table_is_zip().
Allow page_zip==NULL even if dict_table_is_zip().  Remove the
related TODO comment in row_purge_upd_exist_or_extern().

page_zip_available(): uncompressed_size already includes
PAGE_ZIP_DIR_SLOT_SIZE.

page_zip_decompress(): Remove bogus assertion d_stream.next_out == last.
Do not subtract BTR_EXTERN_FIELD_REF_SIZE from d_stream.avail_in when
decompressing records, because the records may be deleted later in
page_zip_apply_log(), and no BLOB pointers are allocated for deleted
records.
parent 36fc4c6d
......@@ -3512,6 +3512,7 @@ btr_store_big_rec_extern_fields(
space_id = buf_frame_get_space_id(rec);
page_zip = buf_block_get_page_zip(buf_block_align(rec));
ut_a(!dict_table_is_zip(index->table) == !page_zip);
if (UNIV_LIKELY_NULL(page_zip)) {
int err;
......@@ -3847,7 +3848,9 @@ btr_free_externally_stored_field(
#ifdef UNIV_SYNC_DEBUG
buf_page_dbg_add_level(page, SYNC_EXTERN_STORAGE);
#endif /* UNIV_SYNC_DEBUG */
if (UNIV_LIKELY_NULL(page_zip)) {
if (dict_table_is_zip(index->table)) {
/* Note that page_zip will be NULL
in row_purge_upd_exist_or_extern(). */
next_page_no = mach_read_from_4(page);
btr_page_free_low(index->tree, page,
......@@ -3859,8 +3862,10 @@ btr_free_externally_stored_field(
mlog_write_ulint(field_ref + BTR_EXTERN_LEN + 4,
0,
MLOG_4BYTES, &mtr);
page_zip_write_blob_ptr(page_zip,
if (page_zip) {
page_zip_write_blob_ptr(page_zip,
rec, index, offsets, i, &mtr);
}
} else {
ulint extern_len = mach_read_from_4(
field_ref + BTR_EXTERN_LEN + 4);
......
......@@ -253,7 +253,7 @@ page_zip_available(
Also the BLOB pointers will be allocated from there, but
we may as well count them in the length of the record. */
trailer_len += PAGE_ZIP_DIR_SLOT_SIZE + uncompressed_size;
trailer_len += uncompressed_size;
}
return(UNIV_LIKELY(
......
......@@ -1533,11 +1533,10 @@ page_zip_decompress(
switch (inflate(&d_stream, Z_SYNC_FLUSH)) {
case Z_STREAM_END:
/* Apparently, n_dense has grown
since the time the page was last compressed. */
if (UNIV_UNLIKELY(d_stream.next_out != last)) {
/* Somehow, we got a partial record. */
goto zlib_error;
}
since the time the page was last compressed.
(d_stream.next_out == last) will not hold,
in case the last record was allocated from
an originally longer space on the free list. */
goto zlib_done;
case Z_OK:
case Z_BUF_ERROR:
......@@ -1645,8 +1644,6 @@ page_zip_decompress(
BTR_EXTERN_FIELD_REF_SIZE);
d_stream.next_out
+= BTR_EXTERN_FIELD_REF_SIZE;
d_stream.avail_in
-= BTR_EXTERN_FIELD_REF_SIZE;
}
}
......
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