diff options
author | unknown <heikki@donna.mysql.fi> | 2001-09-05 20:29:34 +0300 |
---|---|---|
committer | unknown <heikki@donna.mysql.fi> | 2001-09-05 20:29:34 +0300 |
commit | fec70ce417c4574c3d269337820fe67ae3ff510b (patch) | |
tree | 68d883e0352119ebfe2f734aae8c276dec365d85 /innobase/data | |
parent | 993603fe7155e8317294434b7e0c85d86b010a9e (diff) | |
download | mariadb-git-fec70ce417c4574c3d269337820fe67ae3ff510b.tar.gz |
data0data.c Fix an assertion failure in rem0rec.c line 195 when a > 8000 byte row is updated and an internally stored field shortened
innobase/data/data0data.c:
Fix an assertion failure in rem0rec.c line 195 when a > 8000 byte row is updated and an internally stored field shortened
Diffstat (limited to 'innobase/data')
-rw-r--r-- | innobase/data/data0data.c | 23 |
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); |