diff options
-rw-r--r-- | mysql-test/suite/maria/maria.result | 11 | ||||
-rw-r--r-- | mysql-test/suite/maria/maria.test | 13 | ||||
-rw-r--r-- | storage/maria/ma_extra.c | 8 |
3 files changed, 31 insertions, 1 deletions
diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index 1e85ee8b50c..f34e7ce8e5d 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2850,3 +2850,14 @@ insert into t1 values (8,'0'); ERROR HY000: Table 't1' was locked with a READ lock and can't be updated unlock tables; drop table t1; +# +# MDEV-22284 Aria table key read crash because wrong index used +# +create table t1 ( +a int auto_increment, +b int, c int, +key(c, a), unique(b) +) engine aria +partition by hash (b); +replace into t1 values (1, 0, 0), (2, 0, 0), (0, 0, 0); +drop table t1; diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index 6de2c5dccbc..cd392faaeef 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -2093,3 +2093,16 @@ aria_page_checksum=$default_checksum, aria_log_file_size=$default_log_file_size; --enable_result_log --enable_query_log + +--echo # +--echo # MDEV-22284 Aria table key read crash because wrong index used +--echo # +create table t1 ( + a int auto_increment, + b int, c int, + key(c, a), unique(b) +) engine aria +partition by hash (b); +replace into t1 values (1, 0, 0), (2, 0, 0), (0, 0, 0); +# cleanup +drop table t1; 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; |