diff --git a/mysql-8.0.19/storage/innobase/btr/btr0btr.cc b/mysql-8.0.19/storage/innobase/btr/btr0btr.cc index 6614bbfa1..dc99a8467 100644 --- a/mysql-8.0.19/storage/innobase/btr/btr0btr.cc +++ b/mysql-8.0.19/storage/innobase/btr/btr0btr.cc @@ -2220,6 +2220,7 @@ static rec_t *btr_insert_into_right_sibling(uint32_t flags, btr_cur_t *cursor, btr_cur_t next_father_cursor; rec_t *rec = NULL; ulint max_size; + ulint rec_size; const space_id_t space = block->page.id.space(); @@ -2229,6 +2230,23 @@ static rec_t *btr_insert_into_right_sibling(uint32_t flags, btr_cur_t *cursor, bool is_leaf = page_is_leaf(next_page); + /* Calculate the record size when entry is converted to a record */ + rec_size = rec_get_converted_size(cursor->index, tuple, n_ext); + if (is_leaf && next_block->page.size.is_compressed() && + (page_get_data_size(page) + rec_size >= + dict_index_zip_pad_optimal_page_size(cursor->index))) { + return (NULL); + } + max_size = page_get_max_insert_size_after_reorganize(next_page, 1); + if (page_has_garbage(page)) { + if (max_size < rec_size && page_get_n_recs(page) > 1 && + page_get_max_insert_size(page, 1) < rec_size) { + return (NULL); + } + } else if (max_size < rec_size) { + return (NULL); + } + btr_page_get_father(cursor->index, next_block, mtr, &next_father_cursor); page_cur_search(next_block, cursor->index, tuple, PAGE_CUR_LE,