diff --git a/mysql-test/main/vector_innodb.result b/mysql-test/main/vector_innodb.result index f308b8a93dd..4dc018c9fec 100644 --- a/mysql-test/main/vector_innodb.result +++ b/mysql-test/main/vector_innodb.result @@ -285,4 +285,39 @@ pk 2 drop view v; drop table t; +# +# MDEV-35069 - IMPORT TABLESPACE does not work for tables with vector, +# although allowed +# +create table t1 (id int auto_increment primary key, v vector(5) not null, vector index (v) m=5) engine=InnoDB; +insert t1 (v) values (x'e360d63ebe554f3fcdbc523f4522193f5236083d'), +(x'f511303f72224a3fdd05fe3eb22a133ffae86a3f'), +(x'f09baa3ea172763f123def3e0c7fe53e288bf33e'), +(x'b97a523f2a193e3eb4f62e3f2d23583e9dd60d3f'), +(x'f7c5df3e984b2b3e65e59d3d7376db3eac63773e'), +(x'de01453ffa486d3f10aa4d3fdd66813c71cb163f'), +(x'76edfc3e4b57243f10f8423fb158713f020bda3e'), +(x'56926c3fdf098d3e2c8c5e3d1ad4953daa9d0b3e'), +(x'7b713f3e5258323f80d1113d673b2b3f66e3583f'), +(x'6ca1d43e9df91b3fe580da3e1c247d3f147cf33e'); +create table t2 like t1; +alter table t2 discard tablespace; +select id,vec_distance_euclidean(v, x'B047263c9f87233fcfd27e3eae493e3f0329f43e') d from t2 order by d limit 3; +ERROR HY000: Tablespace has been discarded for table `t2` +flush table t1 for export; +db.opt +t1#i#01.cfg +t1#i#01.ibd +t1.cfg +t1.frm +t1.ibd +t2.frm +unlock tables; +alter table t2 import tablespace; +select id,vec_distance_euclidean(v, x'B047263c9f87233fcfd27e3eae493e3f0329f43e') d from t2 order by d limit 3; +id d +9 0.47199 +10 0.50690 +3 0.58656 +drop table t1, t2; # End of 11.7 tests diff --git a/mysql-test/main/vector_innodb.test b/mysql-test/main/vector_innodb.test index 60e1f8ac7d6..ff56599e093 100644 --- a/mysql-test/main/vector_innodb.test +++ b/mysql-test/main/vector_innodb.test @@ -285,4 +285,39 @@ select pk from v order by vec_distance_euclidean(v, 0x30303030) limit 2; drop view v; drop table t; +--echo # +--echo # MDEV-35069 - IMPORT TABLESPACE does not work for tables with vector, +--echo # although allowed +--echo # +let $datadir=`select @@datadir`; +create table t1 (id int auto_increment primary key, v vector(5) not null, vector index (v) m=5) engine=InnoDB; +insert t1 (v) values (x'e360d63ebe554f3fcdbc523f4522193f5236083d'), + (x'f511303f72224a3fdd05fe3eb22a133ffae86a3f'), + (x'f09baa3ea172763f123def3e0c7fe53e288bf33e'), + (x'b97a523f2a193e3eb4f62e3f2d23583e9dd60d3f'), + (x'f7c5df3e984b2b3e65e59d3d7376db3eac63773e'), + (x'de01453ffa486d3f10aa4d3fdd66813c71cb163f'), + (x'76edfc3e4b57243f10f8423fb158713f020bda3e'), + (x'56926c3fdf098d3e2c8c5e3d1ad4953daa9d0b3e'), + (x'7b713f3e5258323f80d1113d673b2b3f66e3583f'), + (x'6ca1d43e9df91b3fe580da3e1c247d3f147cf33e'); +create table t2 like t1; +alter table t2 discard tablespace; +--error ER_TABLESPACE_DISCARDED +select id,vec_distance_euclidean(v, x'B047263c9f87233fcfd27e3eae493e3f0329f43e') d from t2 order by d limit 3; + +flush table t1 for export; +--list_files $datadir/test/ +--copy_file $datadir/test/t1.ibd $datadir/test/t2.ibd +--copy_file $datadir/test/t1.cfg $datadir/test/t2.cfg +--copy_file $datadir/test/t1#i#01.ibd $datadir/test/t2#i#01.ibd +--copy_file $datadir/test/t1#i#01.cfg $datadir/test/t2#i#01.cfg +unlock tables; + +alter table t2 import tablespace; +--replace_regex /(\.\d{5})\d+/\1/ +select id,vec_distance_euclidean(v, x'B047263c9f87233fcfd27e3eae493e3f0329f43e') d from t2 order by d limit 3; + +drop table t1, t2; + --echo # End of 11.7 tests diff --git a/sql/handler.cc b/sql/handler.cc index cc93963eade..9ca2fee591c 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -7667,6 +7667,9 @@ int handler::ha_external_lock(THD *thd, int lock_type) } } + if (lock_type == F_UNLCK) + (void) table->unlock_hlindexes(); + /* We cache the table flags if the locking succeeded. Otherwise, we keep them as they were when they were fetched in ha_open(). @@ -7741,8 +7744,6 @@ int handler::ha_reset() delete lookup_handler; lookup_handler= this; } - if (table->reset_hlindexes()) - return 1; DBUG_RETURN(reset()); } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 8da9d2cfb92..17b529464f3 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -9896,7 +9896,7 @@ int TABLE::open_hlindexes_for_write() return 0; } -int TABLE::reset_hlindexes() +int TABLE::unlock_hlindexes() { if (hlindex && hlindex->in_use) { diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc index 3b583cea0a5..8b1d3a3f6c7 100644 --- a/sql/sql_reload.cc +++ b/sql/sql_reload.cc @@ -641,6 +641,9 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables) table_list->table && table_list->table->file->extra(HA_EXTRA_FLUSH)) goto error_reset_bits; + if (table_list->table && + table_list->table->open_hlindexes_for_write()) + goto error_reset_bits; } } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 3d29d1115b3..26f6787c512 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -6082,6 +6082,23 @@ int mysql_discard_or_import_tablespace(THD *thd, DBUG_RETURN(-1); } + DBUG_ASSERT(table_list->table->s->hlindexes() <= 1); + for (uint i= table_list->table->s->keys; i < table_list->table->s->total_keys; i++) + { + if (table_list->table->hlindex_open(i)) + { + thd->tablespace_op= FALSE; + DBUG_RETURN(-1); + } + } + for (uint i= table_list->table->s->keys; i < table_list->table->s->total_keys; i++) + { + error= table_list->table->hlindex->file-> + ha_discard_or_import_tablespace(discard); + if (unlikely(error)) + goto err; + } + error= table_list->table->file->ha_discard_or_import_tablespace(discard); THD_STAGE_INFO(thd, stage_end); diff --git a/sql/table.h b/sql/table.h index f5e4e37db8e..898a67de6d1 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1806,7 +1806,7 @@ public: int hlindexes_on_update(); int hlindexes_on_delete(const uchar *buf); int hlindexes_on_delete_all(bool truncate); - int reset_hlindexes(); + int unlock_hlindexes(); void prepare_triggers_for_insert_stmt_or_event(); bool prepare_triggers_for_delete_stmt_or_event();