diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-07-30 18:40:47 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-07-30 18:40:47 +0300 |
commit | 6053eb1ce278ac1f566cd74498506bf457d6d048 (patch) | |
tree | 992ee6c0660c51a96b51e4f0a36eb476f46e04bd | |
parent | 0435fcf90b0afa97b468f9eb5dbdf00349325e35 (diff) | |
download | mariadb-git-6053eb1ce278ac1f566cd74498506bf457d6d048.tar.gz |
MDEV-23334 Crash in rec_get_nth_cfield()/rec_offs_validate()
rec_get_nth_cfield(): Remove a bogus debug assertion.
The function may be invoked by innobase_rec_to_mysql()
for reporting a duplicate key error during CREATE UNIQUE INDEX
or ALTER TABLE...ADD UNIQUE KEY, and in that case the record
will be missing the 5-byte or 6-byte fixed header.
It turns out that in every other code path leading to
rec_get_nth_cfield() we either invoked rec_get_offsets()
ourselves or asserted rec_offs_validate(). So, we can
safely remove the assertion and make debug builds
smaller and faster.
-rw-r--r-- | storage/innobase/include/rem0rec.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h index 2a522ae4837..acf8896b225 100644 --- a/storage/innobase/include/rem0rec.h +++ b/storage/innobase/include/rem0rec.h @@ -829,7 +829,11 @@ rec_get_nth_cfield( ulint n, ulint* len) { - ut_ad(rec_offs_validate(rec, index, offsets)); + /* Because this function may be invoked by innobase_rec_to_mysql() + for reporting a duplicate key during ALTER TABLE or + CREATE UNIQUE INDEX, and in that case the rec omit the fixed-size + header of 5 or 6 bytes, the check + rec_offs_validate(rec, index, offsets) must be avoided here. */ if (!rec_offs_nth_default(offsets, n)) { return rec_get_nth_field(rec, offsets, n, len); } |