summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2021-11-02 11:26:35 +0300
committerAleksey Midenkov <midenok@gmail.com>2021-11-02 11:26:35 +0300
commit8ce5635a3eb2c744136c9f19d49297406db94d46 (patch)
tree2755eda85e542c10d32cf3c8468aa7f34efb0d64 /storage
parentd0b611a76d91a5b6dbbc8fab792d7daaaaa862f5 (diff)
downloadmariadb-git-8ce5635a3eb2c744136c9f19d49297406db94d46.tar.gz
MDEV-22284 Aria table key read crash because wrong index usedbb-10.2-midenok2
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.
Diffstat (limited to 'storage')
-rw-r--r--storage/maria/ma_extra.c8
1 files changed, 7 insertions, 1 deletions
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;