From 6053eb1ce278ac1f566cd74498506bf457d6d048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 30 Jul 2020 18:40:47 +0300 Subject: 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. --- storage/innobase/include/rem0rec.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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); } -- cgit v1.2.1