diff --git a/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result b/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result index 2cc992be73a..d86d44f38de 100644 --- a/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result +++ b/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result @@ -1393,3 +1393,26 @@ INSERT INTO t1 VALUES(repeat("this is the test case", 500)); ALTER TABLE t1 KEY_BLOCK_SIZE=4; ALTER TABLE t1 KEY_BLOCK_SIZE=0; DROP TABLE t1; +# +# MDEV-30528 Assertion in dtype_get_at_most_n_mbchars +# +create table t (f text) with system versioning character set utf8 engine=innodb; +insert into t (f) values +('mysql from tutorial dbms stands for database ...') , +('when to use mysql well after that you went through a ...'), +('where will optimizing mysql in what tutorial we will show ...'), +('1001 mysql tricks 1. never run mysqld as root. 2. ...'), +('mysql vs. yoursql in the following database comparison ...'), +('mysql security when configured properly, mysql ...'); +delete from t where f like 'mysql%'; +alter table t add fulltext (f); +select * from t where match(f) against ("use"); +f +when to use mysql well after that you went through a ... +select * from t where match(f) against ("run"); +f +1001 mysql tricks 1. never run mysqld as root. 2. ... +select * from t where match(f) against ("tutorial"); +f +where will optimizing mysql in what tutorial we will show ... +drop table t; diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test index 8f4902fd2de..bbc4f089001 100644 --- a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test +++ b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test @@ -1341,3 +1341,21 @@ ALTER TABLE t1 KEY_BLOCK_SIZE=4; ALTER TABLE t1 KEY_BLOCK_SIZE=0; DROP TABLE t1; +--echo # +--echo # MDEV-30528 Assertion in dtype_get_at_most_n_mbchars +--echo # +create table t (f text) with system versioning character set utf8 engine=innodb; +insert into t (f) values + ('mysql from tutorial dbms stands for database ...') , + ('when to use mysql well after that you went through a ...'), + ('where will optimizing mysql in what tutorial we will show ...'), + ('1001 mysql tricks 1. never run mysqld as root. 2. ...'), + ('mysql vs. yoursql in the following database comparison ...'), + ('mysql security when configured properly, mysql ...'); +delete from t where f like 'mysql%'; +alter table t add fulltext (f); +select * from t where match(f) against ("use"); +select * from t where match(f) against ("run"); +select * from t where match(f) against ("tutorial"); +# cleanup +drop table t; diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index f0aed489f22..aa431886efe 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -502,7 +502,8 @@ row_merge_buf_add( VCOL_STORAGE vcol_storage; DBUG_ENTER("row_merge_buf_add"); - if (buf->n_tuples >= buf->max_tuples) { + if (buf->n_tuples >= buf->max_tuples + || (history_fts && (buf->index->type & DICT_FTS))) { error: n_row_added = 0; goto end; @@ -595,7 +596,8 @@ error: /* Tokenize and process data for FTS */ - if (!history_fts && (index->type & DICT_FTS)) { + if (index->type & DICT_FTS) { + ut_ad(!history_fts); fts_doc_item_t* doc_item; byte* value; void* ptr; @@ -1876,6 +1878,7 @@ row_merge_read_clustered_index( mach_write_to_8(new_sys_trx_start, trx->id); mach_write_to_8(new_sys_trx_end, TRX_ID_MAX); uint64_t n_rows = 0; + bool history_row = false; /* Scan the clustered index. */ for (;;) { @@ -1892,7 +1895,7 @@ row_merge_read_clustered_index( dtuple_t* row; row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); - bool history_row, history_fts = false; + bool history_fts = false; page_cur_move_to_next(cur); @@ -2527,7 +2530,8 @@ write_buffers: ut_ad(i == 0); break; } - } else if (dict_index_is_unique(buf->index)) { + } else if (!history_row + && dict_index_is_unique(buf->index)) { row_merge_dup_t dup = { buf->index, table, col_map, 0};