Commit 9f76e97e authored by Michael Widenius's avatar Michael Widenius

Fixed overwrite of directory information on the row page.

This could only happen with very small rows on very full pages with old deleted information in middle of page.
parent 1f2f240d
...@@ -2816,7 +2816,6 @@ static my_bool write_block_record(MARIA_HA *info, ...@@ -2816,7 +2816,6 @@ static my_bool write_block_record(MARIA_HA *info,
DBUG_PRINT("info", ("Used head length on page: %u header_length: %u", DBUG_PRINT("info", ("Used head length on page: %u header_length: %u",
head_length, head_length,
(uint) (flag & ROW_FLAG_TRANSID ? TRANSID_SIZE : 0))); (uint) (flag & ROW_FLAG_TRANSID ? TRANSID_SIZE : 0)));
DBUG_ASSERT(data <= end_of_data);
if (head_length < share->base.min_block_length) if (head_length < share->base.min_block_length)
{ {
/* Extend row to be of size min_block_length */ /* Extend row to be of size min_block_length */
...@@ -2825,6 +2824,7 @@ static my_bool write_block_record(MARIA_HA *info, ...@@ -2825,6 +2824,7 @@ static my_bool write_block_record(MARIA_HA *info,
data+= diff_length; data+= diff_length;
head_length= share->base.min_block_length; head_length= share->base.min_block_length;
} }
DBUG_ASSERT(data <= end_of_data);
/* /*
If this is a redo entry (ie, undo_lsn != LSN_ERROR) then we should have If this is a redo entry (ie, undo_lsn != LSN_ERROR) then we should have
written exactly head_length bytes (same as original record). written exactly head_length bytes (same as original record).
...@@ -3492,7 +3492,9 @@ static my_bool allocate_and_write_block_record(MARIA_HA *info, ...@@ -3492,7 +3492,9 @@ static my_bool allocate_and_write_block_record(MARIA_HA *info,
/* page will be pinned & locked by get_head_or_tail_page */ /* page will be pinned & locked by get_head_or_tail_page */
if (get_head_or_tail_page(info, blocks->block, info->buff, if (get_head_or_tail_page(info, blocks->block, info->buff,
row->space_on_head_page, HEAD_PAGE, max(row->space_on_head_page,
info->s->base.min_block_length),
HEAD_PAGE,
PAGECACHE_LOCK_WRITE, &row_pos)) PAGECACHE_LOCK_WRITE, &row_pos))
goto err; goto err;
row->lastpos= ma_recordpos(blocks->block->page, row_pos.rownr); row->lastpos= ma_recordpos(blocks->block->page, row_pos.rownr);
......
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