Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-18152

Assertion `num_fts_index <= 1' failed in prepare_inplace_alter_table_dict

Details

    Description

      --source include/have_innodb.inc
       
      CREATE TABLE t1 (a VARCHAR(128), b VARCHAR(128)) ENGINE=InnoDB;
      ALTER TABLE t1 ADD FULLTEXT INDEX (a);
      ALTER TABLE t1 ADD FULLTEXT INDEX (b);
      ALTER TABLE t1 ADD c SERIAL;
       
      # Cleanup
      DROP TABLE t1;
      

      10.3 82490a97dbb

      mysqld: /data/src/10.3/storage/innobase/handler/handler0alter.cc:5457: bool prepare_inplace_alter_table_dict(Alter_inplace_info*, const TABLE*, const TABLE*, const char*, ulint, ulint, ulint, bool, bool): Assertion `num_fts_index <= 1' failed.
      190115  0:07:43 [ERROR] mysqld got signal 6 ;
       
      #7  0x00007ff22435aee2 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
      #8  0x000055ad5e1f6e05 in prepare_inplace_alter_table_dict (ha_alter_info=0x7ff21d69d360, altered_table=0x7ff1c80a7f40, old_table=0x7ff1c806dce0, table_name=0x7ff1c800e66d "t1", flags=33, flags2=94, fts_doc_id_col=3, add_fts_doc_id=true, add_fts_doc_id_idx=true) at /data/src/10.3/storage/innobase/handler/handler0alter.cc:5457
      #9  0x000055ad5e1fbc10 in ha_innobase::prepare_inplace_alter_table (this=0x7ff1c800d258, altered_table=0x7ff1c80a7f40, ha_alter_info=0x7ff21d69d360) at /data/src/10.3/storage/innobase/handler/handler0alter.cc:6998
      #10 0x000055ad5dea32cd in handler::ha_prepare_inplace_alter_table (this=0x7ff1c800d258, altered_table=0x7ff1c80a7f40, ha_alter_info=0x7ff21d69d360) at /data/src/10.3/sql/handler.cc:4436
      #11 0x000055ad5dc79bbc in mysql_inplace_alter_table (thd=0x7ff1c8000b00, table_list=0x7ff1c8014dc0, table=0x7ff1c806dce0, altered_table=0x7ff1c80a7f40, ha_alter_info=0x7ff21d69d360, inplace_supported=HA_ALTER_INPLACE_COPY_LOCK, target_mdl_request=0x7ff21d69d490, alter_ctx=0x7ff21d69e090) at /data/src/10.3/sql/sql_table.cc:7515
      #12 0x000055ad5dc7fe42 in mysql_alter_table (thd=0x7ff1c8000b00, new_db=0x7ff1c80051b8, new_name=0x7ff1c8005578, create_info=0x7ff21d69ec80, table_list=0x7ff1c8014dc0, alter_info=0x7ff21d69ebc0, order_num=0, order=0x0, ignore=false) at /data/src/10.3/sql/sql_table.cc:9700
      #13 0x000055ad5dd07ccb in Sql_cmd_alter_table::execute (this=0x7ff1c80155e8, thd=0x7ff1c8000b00) at /data/src/10.3/sql/sql_alter.cc:497
      #14 0x000055ad5dba9598 in mysql_execute_command (thd=0x7ff1c8000b00) at /data/src/10.3/sql/sql_parse.cc:6285
      #15 0x000055ad5dbae669 in mysql_parse (thd=0x7ff1c8000b00, rawbuf=0x7ff1c8014cd8 "ALTER TABLE t1 ADD c SERIAL", length=27, parser_state=0x7ff21d6a05f0, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:8092
      #16 0x000055ad5db9b81d in dispatch_command (command=COM_QUERY, thd=0x7ff1c8000b00, packet=0x7ff1c8161121 "ALTER TABLE t1 ADD c SERIAL", packet_length=27, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:1851
      #17 0x000055ad5db9a241 in do_command (thd=0x7ff1c8000b00) at /data/src/10.3/sql/sql_parse.cc:1396
      #18 0x000055ad5dd02256 in do_handle_one_connection (connect=0x55ad6045a050) at /data/src/10.3/sql/sql_connect.cc:1402
      #19 0x000055ad5dd01fda in handle_one_connection (arg=0x55ad6045a050) at /data/src/10.3/sql/sql_connect.cc:1308
      #20 0x000055ad5e19c8dd in pfs_spawn_thread (arg=0x55ad6049b940) at /data/src/10.3/storage/perfschema/pfs.cc:1862
      #21 0x00007ff226031494 in start_thread (arg=0x7ff21d6a1700) at pthread_create.c:333
      #22 0x00007ff22441793f in clone () from /lib/x86_64-linux-gnu/libc.so.6
      

      Both debug and non-debug builds fail.

      On 10.0-10.2 (and on upstream 5.6, 5.7) there is no assertion failure, but the error looks strange:

      mysqltest: At line 5: query 'ALTER TABLE t1 ADD c SERIAL' failed: 1795: InnoDB presently supports one FULLTEXT index creation at a time
      

      Note that it happens upon adding the next column, not upon adding the second FULLTEXT index.

      Attachments

        Activity

          elenst Elena Stepanova created issue -
          elenst Elena Stepanova made changes -
          Field Original Value New Value
          Fix Version/s 10.3 [ 22126 ]
          Fix Version/s 10.4 [ 22408 ]
          Affects Version/s 10.3 [ 22126 ]
          Assignee Elena Stepanova [ elenst ] Marko Mäkelä [ marko ]
          Description {noformat:title=10.4 2465d3e0}
          mysqld: /home/travis/src/storage/innobase/handler/handler0alter.cc:6513: bool prepare_inplace_alter_table_dict(Alter_inplace_info*, const TABLE*, const TABLE*, const char*, ulint, ulint, ulint, bool, bool): Assertion `num_fts_index <= 1' failed.
          190105 16:36:48 [ERROR] mysqld got signal 6 ;

          #7 0x00007f94d8467c82 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
          #8 0x000056085b43e01b in prepare_inplace_alter_table_dict (ha_alter_info=0x7f94d500cc10, altered_table=0x56085e9cbd30, old_table=0x56085e646730, table_name=0x56085e8e286d "BB", flags=33, flags2=94, fts_doc_id_col=17, add_fts_doc_id=true, add_fts_doc_id_idx=true) at /home/travis/src/storage/innobase/handler/handler0alter.cc:6513
          #9 0x000056085b442dfe in ha_innobase::prepare_inplace_alter_table (this=0x56085e20f788, altered_table=0x56085e9cbd30, ha_alter_info=0x7f94d500cc10) at /home/travis/src/storage/innobase/handler/handler0alter.cc:8053
          #10 0x000056085b1e8203 in handler::ha_prepare_inplace_alter_table (this=0x56085e20f788, altered_table=0x56085e9cbd30, ha_alter_info=0x7f94d500cc10) at /home/travis/src/sql/handler.cc:4472
          #11 0x000056085afa663b in mysql_inplace_alter_table (thd=0x56085e05f1e0, table_list=0x56085e0744a8, table=0x56085e646730, altered_table=0x56085e9cbd30, ha_alter_info=0x7f94d500cc10, inplace_supported=HA_ALTER_INPLACE_COPY_LOCK, target_mdl_request=0x7f94d500cd40, alter_ctx=0x7f94d500d930) at /home/travis/src/sql/sql_table.cc:7505
          #12 0x000056085afac894 in mysql_alter_table (thd=0x56085e05f1e0, new_db=0x56085e0638a8, new_name=0x56085e063c78, create_info=0x7f94d500e520, table_list=0x56085e0744a8, alter_info=0x7f94d500e460, order_num=0, order=0x0, ignore=false) at /home/travis/src/sql/sql_table.cc:9688
          #13 0x000056085b036f18 in Sql_cmd_alter_table::execute (this=0x56085e074d00, thd=0x56085e05f1e0) at /home/travis/src/sql/sql_alter.cc:497
          #14 0x000056085aed44ef in mysql_execute_command (thd=0x56085e05f1e0) at /home/travis/src/sql/sql_parse.cc:6302
          #15 0x000056085aed96f4 in mysql_parse (thd=0x56085e05f1e0, rawbuf=0x56085e0742f8 "ALTER TABLE `BB` /*!100301 */ ADD COLUMN IF NOT EXISTS `col_time_nokey` SERIAL FIRST, LOCK=SHARED /* QNO 9738 CON_ID 14 */", length=123, parser_state=0x7f94d500f650, is_com_multi=false, is_next_command=false) at /home/travis/src/sql/sql_parse.cc:8104
          #16 0x000056085aec65de in dispatch_command (command=COM_QUERY, thd=0x56085e05f1e0, packet=0x56085e213dd1 "ALTER TABLE `BB` /*!100301 */ ADD COLUMN IF NOT EXISTS `col_time_nokey` SERIAL FIRST, LOCK=SHARED /* QNO 9738 CON_ID 14 */ ", packet_length=124, is_com_multi=false, is_next_command=false) at /home/travis/src/sql/sql_parse.cc:1851
          #17 0x000056085aec4ffb in do_command (thd=0x56085e05f1e0) at /home/travis/src/sql/sql_parse.cc:1396
          #18 0x000056085b030f58 in do_handle_one_connection (connect=0x56085e048e20) at /home/travis/src/sql/sql_connect.cc:1402
          #19 0x000056085b030ca9 in handle_one_connection (arg=0x56085e048e20) at /home/travis/src/sql/sql_connect.cc:1308
          #20 0x00007f94d90ac6ba in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
          #21 0x00007f94d854141d in clone () from /lib/x86_64-linux-gnu/libc.so.6

          Query (0x56085e0742f8): ALTER TABLE `BB` /*!100301 */ ADD COLUMN IF NOT EXISTS `col_time_nokey` SERIAL FIRST, LOCK=SHARED /* QNO 9738 CON_ID 14 */
          Connection ID (thread ID): 14
          Status: NOT_KILLED
          {noformat}
          {noformat:title=elenst-dev b65d4a39a, mariadb-toolbox 0acf1236b19}
          perl ./runall-new.pl --basedir=/home/travis/server --vardir=/home/travis/logs/vardir --duration=350 --threads=6 --seed=1546706008 --reporters=Backtrace,ErrorLog,Deadlock --validators=TransformerNoComparator --views --redefine=conf/mariadb/alter_table.yy --redefine=conf/mariadb/instant_add.yy --redefine=conf/mariadb/sp.yy --redefine=conf/mariadb/bulk_insert.yy --redefine=conf/mariadb/sequences.yy --redefine=conf/mariadb/modules/admin.yy --redefine=conf/mariadb/modules/userstat.yy --redefine=conf/mariadb/modules/foreign_keys.yy -redefine=conf/mariadb/modules/locks.yy --redefine=conf/mariadb/modules/locks-10.4-extra.yy --redefine=conf/mariadb/modules/alter_table_columns.yy --mysqld=--log_output=FILE --mysqld=--max-statement-time=30 --mysqld=--lock-wait-timeout=10 --mysqld=--loose-innodb-lock-wait-timeout=5 --mysqld=--loose-debug_assert_on_not_freed_memory=0 --grammar=conf/engines/innodb/full_text_search.yy --transformers=ExecuteAsIntersect,ExecuteAsExcept,ExecuteAsCTE,ExecuteAsExecuteImmediate,ExecuteAsDeleteReturning,ExecuteAsInsertSelect,ExecuteAsUnion,ExecuteAsUpdateDelete,ExecuteAsView,ExecuteAsPreparedTwice --redefine=conf/mariadb/versioning.yy --filter=/home/travis/mariadb-toolbox/travis/10.4-combo-filter.ff
          {noformat}

          Not reproducible right away, by re-running the test I get other known bugs instead, e.g. MDEV-18020.
          {code:sql}
          --source include/have_innodb.inc

          CREATE TABLE t1 (a VARCHAR(128), b VARCHAR(128)) ENGINE=InnoDB;
          ALTER TABLE t1 ADD FULLTEXT INDEX (a);
          ALTER TABLE t1 ADD FULLTEXT INDEX (b);
          ALTER TABLE t1 ADD c SERIAL;

          # Cleanup
          DROP TABLE t1;
          {code}
          {noformat:title=10.3 82490a97dbb}
          mysqld: /data/src/10.3/storage/innobase/handler/handler0alter.cc:5457: bool prepare_inplace_alter_table_dict(Alter_inplace_info*, const TABLE*, const TABLE*, const char*, ulint, ulint, ulint, bool, bool): Assertion `num_fts_index <= 1' failed.
          190115 0:07:43 [ERROR] mysqld got signal 6 ;

          #7 0x00007ff22435aee2 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
          #8 0x000055ad5e1f6e05 in prepare_inplace_alter_table_dict (ha_alter_info=0x7ff21d69d360, altered_table=0x7ff1c80a7f40, old_table=0x7ff1c806dce0, table_name=0x7ff1c800e66d "t1", flags=33, flags2=94, fts_doc_id_col=3, add_fts_doc_id=true, add_fts_doc_id_idx=true) at /data/src/10.3/storage/innobase/handler/handler0alter.cc:5457
          #9 0x000055ad5e1fbc10 in ha_innobase::prepare_inplace_alter_table (this=0x7ff1c800d258, altered_table=0x7ff1c80a7f40, ha_alter_info=0x7ff21d69d360) at /data/src/10.3/storage/innobase/handler/handler0alter.cc:6998
          #10 0x000055ad5dea32cd in handler::ha_prepare_inplace_alter_table (this=0x7ff1c800d258, altered_table=0x7ff1c80a7f40, ha_alter_info=0x7ff21d69d360) at /data/src/10.3/sql/handler.cc:4436
          #11 0x000055ad5dc79bbc in mysql_inplace_alter_table (thd=0x7ff1c8000b00, table_list=0x7ff1c8014dc0, table=0x7ff1c806dce0, altered_table=0x7ff1c80a7f40, ha_alter_info=0x7ff21d69d360, inplace_supported=HA_ALTER_INPLACE_COPY_LOCK, target_mdl_request=0x7ff21d69d490, alter_ctx=0x7ff21d69e090) at /data/src/10.3/sql/sql_table.cc:7515
          #12 0x000055ad5dc7fe42 in mysql_alter_table (thd=0x7ff1c8000b00, new_db=0x7ff1c80051b8, new_name=0x7ff1c8005578, create_info=0x7ff21d69ec80, table_list=0x7ff1c8014dc0, alter_info=0x7ff21d69ebc0, order_num=0, order=0x0, ignore=false) at /data/src/10.3/sql/sql_table.cc:9700
          #13 0x000055ad5dd07ccb in Sql_cmd_alter_table::execute (this=0x7ff1c80155e8, thd=0x7ff1c8000b00) at /data/src/10.3/sql/sql_alter.cc:497
          #14 0x000055ad5dba9598 in mysql_execute_command (thd=0x7ff1c8000b00) at /data/src/10.3/sql/sql_parse.cc:6285
          #15 0x000055ad5dbae669 in mysql_parse (thd=0x7ff1c8000b00, rawbuf=0x7ff1c8014cd8 "ALTER TABLE t1 ADD c SERIAL", length=27, parser_state=0x7ff21d6a05f0, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:8092
          #16 0x000055ad5db9b81d in dispatch_command (command=COM_QUERY, thd=0x7ff1c8000b00, packet=0x7ff1c8161121 "ALTER TABLE t1 ADD c SERIAL", packet_length=27, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:1851
          #17 0x000055ad5db9a241 in do_command (thd=0x7ff1c8000b00) at /data/src/10.3/sql/sql_parse.cc:1396
          #18 0x000055ad5dd02256 in do_handle_one_connection (connect=0x55ad6045a050) at /data/src/10.3/sql/sql_connect.cc:1402
          #19 0x000055ad5dd01fda in handle_one_connection (arg=0x55ad6045a050) at /data/src/10.3/sql/sql_connect.cc:1308
          #20 0x000055ad5e19c8dd in pfs_spawn_thread (arg=0x55ad6049b940) at /data/src/10.3/storage/perfschema/pfs.cc:1862
          #21 0x00007ff226031494 in start_thread (arg=0x7ff21d6a1700) at pthread_create.c:333
          #22 0x00007ff22441793f in clone () from /lib/x86_64-linux-gnu/libc.so.6
          {noformat}

          Both debug and non-debug builds fail.

          On 10.0-10.2 (and on upstream 5.6, 5.7) there is no assertion failure, but the error looks strange:
          {code:sql}
          mysqltest: At line 5: query 'ALTER TABLE t1 ADD c SERIAL' failed: 1795: InnoDB presently supports one FULLTEXT index creation at a time
          {code}

          Note that it happens upon adding the next column, not upon adding the second FULLTEXT index.
          Summary [Draft] Assertion `num_fts_index <= 1' failed in prepare_inplace_alter_table_dict Assertion `num_fts_index <= 1' failed in prepare_inplace_alter_table_dict

          Yes, InnoDB would output that obscure message whenever trying to rebuild a table that contains multiple FULLTEXT INDEX. And it is a ridiculous limitation that was introduced in MySQL 5.6 and never fixed since.

          The logic in ha_innobase::check_if_supported_inplace_alter() was broken related to MDEV-11369 or MDEV-13134. Here is a simpler test case:

          CREATE TABLE t1 (a VARCHAR(128), b VARCHAR(128), FULLTEXT INDEX(a), FULLTEXT INDEX(b)) ENGINE=InnoDB;
          ALTER TABLE t1 ADD c SERIAL;
          DROP TABLE t1;
          

          marko Marko Mäkelä added a comment - Yes, InnoDB would output that obscure message whenever trying to rebuild a table that contains multiple FULLTEXT INDEX . And it is a ridiculous limitation that was introduced in MySQL 5.6 and never fixed since. The logic in ha_innobase::check_if_supported_inplace_alter() was broken related to MDEV-11369 or MDEV-13134 . Here is a simpler test case: CREATE TABLE t1 (a VARCHAR (128), b VARCHAR (128), FULLTEXT INDEX (a), FULLTEXT INDEX (b)) ENGINE=InnoDB; ALTER TABLE t1 ADD c SERIAL; DROP TABLE t1;

          As a side effect of this fix, we again allow ALGORITHM=INPLACE to rebuild a table when one FULLTEXT INDEX survives. Also, we are returning a more accurate reason for refusing LOCK=NONE when a table with one FULLTEXT INDEX would be rebuilt:

          ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED
          

          marko Marko Mäkelä added a comment - As a side effect of this fix, we again allow ALGORITHM=INPLACE to rebuild a table when one FULLTEXT INDEX survives. Also, we are returning a more accurate reason for refusing LOCK=NONE when a table with one FULLTEXT INDEX would be rebuilt: ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED
          marko Marko Mäkelä made changes -
          issue.field.resolutiondate 2019-01-18 10:46:59.0 2019-01-18 10:46:59.985
          marko Marko Mäkelä made changes -
          Fix Version/s 10.4.2 [ 23229 ]
          Fix Version/s 10.3.13 [ 23215 ]
          Fix Version/s 10.3 [ 22126 ]
          Fix Version/s 10.4 [ 22408 ]
          Resolution Fixed [ 1 ]
          Status Open [ 1 ] Closed [ 6 ]
          serg Sergei Golubchik made changes -
          Workflow MariaDB v3 [ 91511 ] MariaDB v4 [ 155454 ]

          People

            marko Marko Mäkelä
            elenst Elena Stepanova
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.