mirror of
https://github.com/MariaDB/server.git
synced 2025-01-25 00:04:33 +01:00
ibuf_entry_build(): Write prefix_len to the insert buffer instead of type->len
when prefix_len is specified. Otherwise, btr_page_reorganize() during insert buffer merge would fail on ROW_FORMAT=COMPACT tables. (Bug #21638)
This commit is contained in:
parent
cb8f5a5115
commit
02c5e44ea7
3 changed files with 18 additions and 12 deletions
|
@ -1365,8 +1365,8 @@ ibuf_entry_build(
|
|||
index tree; NOTE that the original entry
|
||||
must be kept because we copy pointers to its
|
||||
fields */
|
||||
dict_index_t* index, /* in: non-clustered index */
|
||||
dtuple_t* entry, /* in: entry for a non-clustered index */
|
||||
ibool comp, /* in: flag: TRUE=compact record format */
|
||||
ulint space, /* in: space id */
|
||||
ulint page_no,/* in: index page number where entry should
|
||||
be inserted */
|
||||
|
@ -1430,13 +1430,12 @@ ibuf_entry_build(
|
|||
|
||||
dfield_set_data(field, buf, 4);
|
||||
|
||||
ut_ad(comp == 0 || comp == 1);
|
||||
/* Store the type info in buf2, and add the fields from entry to
|
||||
tuple */
|
||||
buf2 = mem_heap_alloc(heap, n_fields
|
||||
* DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
|
||||
+ comp);
|
||||
if (comp) {
|
||||
+ dict_table_is_comp(index->table));
|
||||
if (dict_table_is_comp(index->table)) {
|
||||
*buf2++ = 0; /* write the compact format indicator */
|
||||
}
|
||||
for (i = 0; i < n_fields; i++) {
|
||||
|
@ -1449,20 +1448,21 @@ ibuf_entry_build(
|
|||
|
||||
dtype_new_store_for_order_and_null_size
|
||||
(buf2 + i * DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE,
|
||||
dfield_get_type(entry_field));
|
||||
dfield_get_type(entry_field),
|
||||
dict_index_get_nth_field(index, i)->prefix_len);
|
||||
}
|
||||
|
||||
/* Store the type info in buf2 to field 3 of tuple */
|
||||
|
||||
field = dtuple_get_nth_field(tuple, 3);
|
||||
|
||||
if (comp) {
|
||||
if (dict_table_is_comp(index->table)) {
|
||||
buf2--;
|
||||
}
|
||||
|
||||
dfield_set_data(field, buf2, n_fields
|
||||
* DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
|
||||
+ comp);
|
||||
+ dict_table_is_comp(index->table));
|
||||
/* Set all the types in the new tuple binary */
|
||||
|
||||
dtuple_set_types_binary(tuple, n_fields + 4);
|
||||
|
@ -2605,8 +2605,7 @@ ibuf_insert_low(
|
|||
the first fields and the type information for other fields, and which
|
||||
will be inserted to the insert buffer. */
|
||||
|
||||
ibuf_entry = ibuf_entry_build(entry, dict_table_is_comp(index->table),
|
||||
space, page_no, heap);
|
||||
ibuf_entry = ibuf_entry_build(index, entry, space, page_no, heap);
|
||||
|
||||
/* Open a cursor to the insert buffer tree to calculate if we can add
|
||||
the new entry to it without exceeding the free space limit for the
|
||||
|
|
|
@ -376,7 +376,9 @@ dtype_new_store_for_order_and_null_size(
|
|||
byte* buf, /* in: buffer for
|
||||
DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
|
||||
bytes where we store the info */
|
||||
dtype_t* type); /* in: type struct */
|
||||
dtype_t* type, /* in: type struct */
|
||||
ulint prefix_len);/* in: prefix length to
|
||||
replace type->len, or 0 */
|
||||
/**************************************************************************
|
||||
Reads to a type the stored information which determines its alphabetical
|
||||
ordering and the storage size of an SQL NULL value. This is the 4.1.x storage
|
||||
|
|
|
@ -244,11 +244,14 @@ dtype_new_store_for_order_and_null_size(
|
|||
byte* buf, /* in: buffer for
|
||||
DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
|
||||
bytes where we store the info */
|
||||
dtype_t* type) /* in: type struct */
|
||||
dtype_t* type, /* in: type struct */
|
||||
ulint prefix_len)/* in: prefix length to
|
||||
replace type->len, or 0 */
|
||||
{
|
||||
#if 6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
|
||||
#error "6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE"
|
||||
#endif
|
||||
ulint len;
|
||||
|
||||
buf[0] = (byte)(type->mtype & 0xFFUL);
|
||||
|
||||
|
@ -263,7 +266,9 @@ dtype_new_store_for_order_and_null_size(
|
|||
|
||||
buf[1] = (byte)(type->prtype & 0xFFUL);
|
||||
|
||||
mach_write_to_2(buf + 2, type->len & 0xFFFFUL);
|
||||
len = prefix_len ? prefix_len : type->len;
|
||||
|
||||
mach_write_to_2(buf + 2, len & 0xFFFFUL);
|
||||
|
||||
ut_ad(dtype_get_charset_coll(type->prtype) < 256);
|
||||
mach_write_to_2(buf + 4, dtype_get_charset_coll(type->prtype));
|
||||
|
|
Loading…
Add table
Reference in a new issue