summaryrefslogtreecommitdiff
path: root/innobase/data/data0data.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/data/data0data.c')
-rw-r--r--innobase/data/data0data.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/innobase/data/data0data.c b/innobase/data/data0data.c
index 97db9d72f98..aecc56ec022 100644
--- a/innobase/data/data0data.c
+++ b/innobase/data/data0data.c
@@ -470,7 +470,8 @@ dtuple_convert_big_rec(
}
}
- if (longest < BTR_EXTERN_FIELD_REF_SIZE + 10) {
+ if (longest < BTR_EXTERN_FIELD_REF_SIZE + 10
+ + REC_1BYTE_OFFS_LIMIT) {
/* Cannot shorten more */
@@ -479,26 +480,18 @@ dtuple_convert_big_rec(
return(NULL);
}
- /* Move data from field longest_i to big rec vector,
- but do not let data size of the remaining entry
+ /* Move data from field longest_i to big rec vector;
+ we do not let data size of the remaining entry
drop below 128 which is the limit for the 2-byte
- offset storage format in a physical record */
+ offset storage format in a physical record. This
+ we accomplish by storing 128 bytes of data in entry
+ itself, and only the remaining part to big rec vec. */
dfield = dtuple_get_nth_field(entry, longest_i);
vector->fields[n_fields].field_no = longest_i;
- if (dtuple_get_data_size(entry) - dfield->len
- <= REC_1BYTE_OFFS_LIMIT) {
- vector->fields[n_fields].len =
- dtuple_get_data_size(entry)
+ vector->fields[n_fields].len = dfield->len
- REC_1BYTE_OFFS_LIMIT;
- /* Since dfield will contain at least
- a 20-byte reference to the extern storage,
- we know that the data size of entry will be
- > REC_1BYTE_OFFS_LIMIT */
- } else {
- vector->fields[n_fields].len = dfield->len;
- }
vector->fields[n_fields].data = mem_heap_alloc(heap,
vector->fields[n_fields].len);