summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-07-30 18:40:47 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-07-30 18:40:47 +0300
commit6053eb1ce278ac1f566cd74498506bf457d6d048 (patch)
tree992ee6c0660c51a96b51e4f0a36eb476f46e04bd
parent0435fcf90b0afa97b468f9eb5dbdf00349325e35 (diff)
downloadmariadb-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.h6
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);
}