[MDEV-24403] Segfault on CREATE TABLE with explicit FTS_DOC_ID_INDEX by multiple fields Created: 2020-12-14  Updated: 2021-01-19  Resolved: 2021-01-19

Status: Closed
Project: MariaDB Server
Component/s: Data Definition - Create Table, Full-text Search, Storage Engine - InnoDB
Affects Version/s: 10.2, 10.3, 10.4, 10.5
Fix Version/s: 10.2.37, 10.3.28, 10.4.18, 10.5.9

Type: Bug Priority: Critical
Reporter: Aleksey Midenkov Assignee: Aleksey Midenkov
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Relates
relates to MDEV-21138 Assertion `col->ord_part' or `f.col->... Closed

 Description   

Reproduce

--source include/have_innodb.inc
 
--error ER_WRONG_NAME_FOR_INDEX
create table t1 (
  f1 int, f2 text,
  FTS_DOC_ID bigint unsigned not null,
  unique key FTS_DOC_ID_INDEX(FTS_DOC_ID, f1),
  fulltext (f2))
engine=innodb;

Result

#3  <signal handler called>
#4  0x0000000000fcd837 in fts_drop_all_index_tables (trx=0x7f22ea2d0218, fts=0x0) at /home/midenok/src/mariadb/10.2/src/storage/innobase/fts/fts0fts.cc:1673
#5  0x0000000000fcbbd2 in fts_drop_tables (trx=0x7f22ea2d0218, table=0x7f2298006600) at /home/midenok/src/mariadb/10.2/src/storage/innobase/fts/fts0fts.cc:1713
#6  0x0000000000d9ac3c in row_drop_ancillary_fts_tables (table=0x7f2298006600, trx=0x7f22ea2d0218) at /home/midenok/src/mariadb/10.2/src/storage/innobase/row/row0mysql.cc:3177
#7  0x0000000000d97cad in row_drop_table_for_mysql (name=0x7f22e96ebf10 "test/t1", trx=0x7f22ea2d0218, sqlcom=SQLCOM_TRUNCATE, create_failed=true, nonatomic=false) at /home/midenok/src/mariadb/10.2/src/storage/
innobase/row/row0mysql.cc:3707
#8  0x0000000000c45b54 in ha_innobase::create (this=0x7f2298187ad0, name=0x7f22e96ef690 "./test/t1", form=0x7f22e96ec988, create_info=0x7f22e96efc20, file_per_table=true, trx=0x7f22ea2d0218) at /home/midenok/src/mariadb/10.2/src/storage/innobase/handler/ha_innodb.cc:13090
#9  0x0000000000c290cf in ha_innobase::create (this=0x7f2298187ad0, name=0x7f22e96ef690 "./test/t1", form=0x7f22e96ec988, create_info=0x7f22e96efc20) at /home/midenok/src/mariadb/10.2/src/storage/innobase/handler/ha_innodb.cc:13137
#10 0x00000000009ce213 in handler::ha_create (this=0x7f2298187ad0, name=0x7f22e96ef690 "./test/t1", form=0x7f22e96ec988, info_arg=0x7f22e96efc20) at /home/midenok/src/mariadb/10.2/src/sql/handler.cc:4507
#11 0x00000000009cf48f in ha_create_table (thd=0x7f2298000d28, path=0x7f22e96ef690 "./test/t1", db=0x7f2298012148 "test", table_name=0x7f2298011ae0 "t1", create_info=0x7f22e96efc20, frm=0x7f22e96ef680) at /home/midenok/src/mariadb/10.2/src/sql/handler.cc:4879
#12 0x000000000085b52b in rea_create_table (thd=0x7f2298000d28, frm=0x7f22e96ef680, path=0x7f22e96ef690 "./test/t1", db=0x7f2298012148 "test", table_name=0x7f2298011ae0 "t1", create_info=0x7f22e96efc20, file=0x7f2298012bf0, no_ha_create_table=false) at /home/midenok/src/mariadb/10.2/src/sql/unireg.cc:429
#13 0x00000000007f5312 in create_table_impl (thd=0x7f2298000d28, orig_db=0x7f2298012148 "test", orig_table_name=0x7f2298011ae0 "t1", db=0x7f2298012148 "test", table_name=0x7f2298011ae0 "t1", path=0x7f22e96ef690 "./test/t1", options=..., create_info=0x7f22e96efc20, alter_info=0x7f22e96efb78, create_table_mode=0, is_trans=0x7f22e96ef9b7, key_info=0x7f22e96ef8a0, key_count=0x7f22e96ef89c, frm=0x7f22e96ef680) at /home/midenok/src/mariadb/10.2/src/sql/sql_table.cc:4960
#14 0x00000000007f46c6 in mysql_create_table_no_lock (thd=0x7f2298000d28, db=0x7f2298012148 "test", table_name=0x7f2298011ae0 "t1", create_info=0x7f22e96efc20, alter_info=0x7f22e96efb78, is_trans=0x7f22e96ef9b7, create_table_mode=0) at /home/midenok/src/mariadb/10.2/src/sql/sql_table.cc:5070
#15 0x00000000007f5ab1 in mysql_create_table (thd=0x7f2298000d28, create_table=0x7f2298011b30, create_info=0x7f22e96efc20, alter_info=0x7f22e96efb78) at /home/midenok/src/mariadb/10.2/src/sql/sql_table.cc:5135
#16 0x00000000008085cf in Sql_cmd_create_table::execute (this=0x7f2298011b10, thd=0x7f2298000d28) at /home/midenok/src/mariadb/10.2/src/sql/sql_table.cc:10979
#17 0x0000000000710dfc in mysql_execute_command (thd=0x7f2298000d28) at /home/midenok/src/mariadb/10.2/src/sql/sql_parse.cc:5993
#18 0x0000000000704a00 in mysql_parse (thd=0x7f2298000d28, rawbuf=0x7f2298011948 "create table t1 (\nf1 int, f2 text,\nFTS_DOC_ID bigint unsigned not null,\nunique key FTS_DOC_ID_INDEX(FTS_DOC_ID, f1),\nfulltext (f2))\nengine=innodb", length=145, parser_state=0x7f22e96f25f0, is_com_multi=false, is_next_command=false) at /home/midenok/src/mariadb/10.2/src/sql/sql_parse.cc:7762

Cause

table->fts is freed:

#0  fts_free (table=0x7f51f001b3f0) at /home/midenok/src/mariadb/10.3/src/storage/innobase/fts/fts0fts.cc:5402
#1  0x0000000000daa62f in create_table_info_t::create_table (this=0x7f52340ec4a0, create_fk=true) at /home/midenok/src/mariadb/10.3/src/storage/innobase/handler/ha_innodb.cc:12373
#2  0x0000000000dcb69c in ha_innobase::create (this=0x7f51f001a770, name=0x7f52340effe0 "./test/t1", form=0x7f52340ed1d0, create_info=0x7f52340f05e8, file_per_table=true, trx=0x7f525dbb3178) at /home/midenok/src/mariadb/10.3/src/storage/innobase/handler/ha_innodb.cc:12860

12353                   ret = innobase_fts_check_doc_id_index_in_def(
12354                           m_form->s->keys, m_form->key_info);
12355
12356                   switch (ret) {
12357                   case FTS_INCORRECT_DOC_ID_INDEX:
12358                           push_warning_printf(m_thd,
12359                                               Sql_condition::WARN_LEVEL_WARN,
12360                                               ER_WRONG_NAME_FOR_INDEX,
12361                                               " InnoDB: Index name %s is reserved"
12362                                               " for the unique index on"
12363                                               " FTS_DOC_ID column for FTS"
12364                                               " Document ID indexing"
12365                                               " on table %s. Please check"
12366                                               " the index definition to"
12367                                               " make sure it is of correct"
12368                                               " type\n",
12369                                               FTS_DOC_ID_INDEX_NAME,
12370                                               m_table->name.m_name);
12371
12372                           if (m_table->fts) {
12373                                   fts_free(m_table);
12374                           }
12375
12376                           my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0),
12377                                    FTS_DOC_ID_INDEX_NAME);
12378                           DBUG_RETURN(-1);

and then accessed:

#0  0x00000000012337c7 in fts_drop_all_index_tables (trx=0x7f525dbb3178, fts=0x0) at /home/midenok/src/mariadb/10.3/src/storage/innobase/fts/fts0fts.cc:1672
#1  0x0000000001231742 in fts_drop_tables (trx=0x7f525dbb3178, table=0x7f51f001b3f0) at /home/midenok/src/mariadb/10.3/src/storage/innobase/fts/fts0fts.cc:1712
#2  0x0000000000f86444 in row_drop_ancillary_fts_tables (table=0x7f51f001b3f0, trx=0x7f525dbb3178) at /home/midenok/src/mariadb/10.3/src/storage/innobase/row/row0mysql.cc:3256
#3  0x0000000000f82c88 in row_drop_table_for_mysql (name=0x7f52340ec730 "test/t1", trx=0x7f525dbb3178, sqlcom=SQLCOM_TRUNCATE, create_failed=true, nonatomic=false) at /home/midenok/src/mariadb/10.3/src/storage/innobase/row/row0mysql.cc:3729
#4  0x0000000000dcb726 in ha_innobase::create (this=0x7f51f001a770, name=0x7f52340effe0 "./test/t1", form=0x7f52340ed1d0, create_info=0x7f52340f05e8, file_per_table=true, trx=0x7f525dbb3178) at /home/midenok/src/mariadb/10.3/src/storage/innobase/handler/ha_innodb.cc:12866

1711            if (error == DB_SUCCESS) {
1712                    error = fts_drop_all_index_tables(trx, table->fts);
1713            }

Fix

--- a/storage/innobase/fts/fts0fts.cc
+++ b/storage/innobase/fts/fts0fts.cc
@@ -1708,7 +1708,7 @@ fts_drop_tables(
 
        error = fts_drop_common_tables(trx, &fts_table);
 
-       if (error == DB_SUCCESS) {
+       if (error == DB_SUCCESS && table->fts) {
                error = fts_drop_all_index_tables(trx, table->fts);
        }



 Comments   
Comment by Marko Mäkelä [ 2020-12-17 ]

Great job, thank you! OK to push.

Generated at Thu Feb 08 09:29:44 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.