From 8ce5635a3eb2c744136c9f19d49297406db94d46 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Tue, 2 Nov 2021 11:26:35 +0300 Subject: MDEV-22284 Aria table key read crash because wrong index used When restoring lastinx last_key.keyinfo must be updated as well. The good example is in _ma_check_index(). The point of failure is extra(HA_EXTRA_NO_KEYREAD) in ha_maria::get_auto_increment(): 1. extra(HA_EXTRA_KEYREAD) saves lastinx; 2. maria_rkey() changes index, so the lastinx and last_key.keyinfo; 3. extra(HA_EXTRA_NO_KEYREAD) restores lastinx but not last_key.keyinfo. So we have discrepancy between lastinx and last_key.keyinfo after 3. --- storage/maria/ma_extra.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'storage') diff --git a/storage/maria/ma_extra.c b/storage/maria/ma_extra.c index 2697c72f2b8..7d4aa358e40 100644 --- a/storage/maria/ma_extra.c +++ b/storage/maria/ma_extra.c @@ -213,7 +213,13 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, info->last_key.data + share->base.max_key_length*2, info->save_lastkey_data_length + info->save_lastkey_ref_length); info->update= info->save_update | HA_STATE_WRITTEN; - info->lastinx= info->save_lastinx; + if (info->lastinx != info->save_lastinx) /* Index changed */ + { + info->lastinx = info->save_lastinx; + info->last_key.keyinfo= info->s->keyinfo + info->lastinx; + info->last_key.flag= 0; + info->page_changed=1; + } info->cur_row.lastpos= info->save_lastpos; info->last_key.data_length= info->save_lastkey_data_length; info->last_key.ref_length= info->save_lastkey_ref_length; -- cgit v1.2.1