diff --git a/mysql-test/main/vector2_notembedded.result b/mysql-test/main/vector2_notembedded.result index d60fe830780..3840ea94459 100644 --- a/mysql-test/main/vector2_notembedded.result +++ b/mysql-test/main/vector2_notembedded.result @@ -90,3 +90,26 @@ connection con1; disconnect con1; connection default; drop table t1; +# +# MDEV-35223 REPAIR does not fix MyISAM table with vector key after crash recovery +# +call mtr.add_suppression('t#i#00'' is marked as crashed and should be repaired'); +create table t (v vector(1) not null, vector(v)) engine=myisam; +insert into t (v) values (0x30303030),(0x31313131); +# restart +check table t extended; +Table Op Msg_type Msg_text +test.t check warning 1 client is using or hasn't closed the table properly +test.t check Error Table './test/t#i#00' is marked as crashed and should be repaired +test.t check status Operation failed +repair table t extended; +Table Op Msg_type Msg_text +test.t repair note Table does not support optimize, doing recreate + analyze instead +test.t repair status OK +check table t extended; +Table Op Msg_type Msg_text +test.t check status OK +select v from t order by vec_distance_euclidean(0x323233232,v) limit 1; +v +0000 +drop table t; diff --git a/mysql-test/main/vector2_notembedded.test b/mysql-test/main/vector2_notembedded.test index 0b71f39f8ca..63f827ce864 100644 --- a/mysql-test/main/vector2_notembedded.test +++ b/mysql-test/main/vector2_notembedded.test @@ -56,3 +56,17 @@ xa prepare 'x'; --disconnect con1 --connection default drop table t1; + +--echo # +--echo # MDEV-35223 REPAIR does not fix MyISAM table with vector key after crash recovery +--echo # +call mtr.add_suppression('t#i#00'' is marked as crashed and should be repaired'); +create table t (v vector(1) not null, vector(v)) engine=myisam; +insert into t (v) values (0x30303030),(0x31313131); +--let $shutdown_timeout=0 +--source include/restart_mysqld.inc +check table t extended; +repair table t extended; +check table t extended; +select v from t order by vec_distance_euclidean(0x323233232,v) limit 1; +drop table t; diff --git a/sql/handler.cc b/sql/handler.cc index 942e856dea8..9084fe82210 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -5366,6 +5366,14 @@ int handler::ha_check(THD *thd, HA_CHECK_OPT *check_opt) } if (unlikely((error= check(thd, check_opt)))) return error; + for (uint i= table->s->keys; i < table->s->total_keys; i++) + { + DBUG_ASSERT(table->s->hlindexes() == 1); + if (table->hlindex_open(i)) + return HA_ADMIN_FAILED; + if ((error= table->hlindex->file->check(thd, check_opt))) + return error; + } /* Skip updating frm version if not main handler. */ if (table->file != this || opt_readonly) return error; @@ -5424,7 +5432,7 @@ int handler::ha_repair(THD* thd, HA_CHECK_OPT* check_opt) if (result == HA_ADMIN_OK && !opt_readonly && table->file->ha_check_for_upgrade(check_opt) == HA_ADMIN_OK) result= update_frm_version(table); - return result; + return table->s->hlindexes() ? HA_ADMIN_TRY_ALTER : result; } diff --git a/sql/vector_mhnsw.cc b/sql/vector_mhnsw.cc index 72b0591fc73..d1d418f26c3 100644 --- a/sql/vector_mhnsw.cc +++ b/sql/vector_mhnsw.cc @@ -1287,12 +1287,18 @@ int mhnsw_read_first(TABLE *table, KEY *keyinfo, Item *dist, ulonglong limit) { if (int err= search_layer(ctx, graph, target, NEAREST, 1, cur_layer, &candidates, false)) + { + graph->file->ha_rnd_end(); return err; + } } if (int err= search_layer(ctx, graph, target, NEAREST, static_cast(limit), 0, &candidates, false)) + { + graph->file->ha_rnd_end(); return err; + } auto result= new (thd->mem_root) Search_context(&candidates, ctx, target); graph->context= result;