summaryrefslogtreecommitdiff
path: root/innobase/rem/rem0rec.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/rem/rem0rec.c')
-rw-r--r--innobase/rem/rem0rec.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/innobase/rem/rem0rec.c b/innobase/rem/rem0rec.c
index 9480c978755..65da8352dc7 100644
--- a/innobase/rem/rem0rec.c
+++ b/innobase/rem/rem0rec.c
@@ -462,7 +462,7 @@ rec_get_converted_size_new(
case REC_STATUS_INFIMUM:
case REC_STATUS_SUPREMUM:
/* infimum or supremum record, 8 bytes */
- return(size + 8); /* no extra data needed */
+ return(8); /* no extra data needed */
default:
ut_a(0);
return(ULINT_UNDEFINED);
@@ -473,23 +473,34 @@ rec_get_converted_size_new(
ulint len = dtuple_get_nth_field(dtuple, i)->len;
field = dict_index_get_nth_field(index, i);
type = dict_col_get_type(dict_field_get_col(field));
- ut_ad(len != UNIV_SQL_NULL ||
- !(dtype_get_prtype(type) & DATA_NOT_NULL));
+
+ ut_ad(dict_col_type_assert_equal(
+ dict_field_get_col(field),
+ dfield_get_type(dtuple_get_nth_field(
+ dtuple, i))));
if (len == UNIV_SQL_NULL) {
/* No length is stored for NULL fields. */
+ ut_ad(!(dtype_get_prtype(type) & DATA_NOT_NULL));
continue;
}
ut_ad(len <= dtype_get_len(type)
|| dtype_get_mtype(type) == DATA_BLOB);
- ut_ad(!field->fixed_len || len == field->fixed_len);
if (field->fixed_len) {
+ ut_ad(len == field->fixed_len);
+ /* dict_index_add_col() should guarantee this */
+ ut_ad(!field->prefix_len
+ || field->fixed_len == field->prefix_len);
} else if (len < 128 || (dtype_get_len(type) < 256
&& dtype_get_mtype(type) != DATA_BLOB)) {
size++;
} else {
+ /* For variable-length columns, we look up the
+ maximum length from the column itself. If this
+ is a prefix index column shorter than 256 bytes,
+ this will waste one byte. */
size += 2;
}
size += len;
@@ -885,6 +896,11 @@ rec_convert_dtuple_to_rec_new(
len = dfield_get_len(field);
fixed_len = dict_index_get_nth_field(index, i)->fixed_len;
+ ut_ad(dict_col_type_assert_equal(
+ dict_field_get_col(dict_index_get_nth_field(
+ index, i)),
+ dfield_get_type(field)));
+
if (!(dtype_get_prtype(type) & DATA_NOT_NULL)) {
if (len == UNIV_SQL_NULL)
continue;