Commit 1cb4caa6 authored by Michael Widenius's avatar Michael Widenius

MDEV-15970 Crash when doing truncate on locked sequence

Problem was that we used table->s->db_type() for accessing
handlerton of opened file instead of table->file->ht

Other bug fixed:
- Ensure that we set error if reopen_tables() fails
  (This was the cause of assert)
parent be6ae0bb
......@@ -32,3 +32,8 @@ CREATE SEQUENCE seq2;
LOCK TABLE seq1 WRITE, seq2 WRITE;
INSERT INTO seq1 VALUES (1, 1, 100000, 1, 1, 100, 1, 1);
DROP SEQUENCE seq1, seq2;
CREATE OR REPLACE SEQUENCE s1 ENGINE=MyISAM;
LOCK TABLE s1 WRITE;
TRUNCATE TABLE s1;
ERROR HY000: Storage engine SEQUENCE of the table `test`.`s1` doesn't have this option
DROP SEQUENCE s1;
......@@ -39,7 +39,6 @@ DROP SEQUENCE s1;
unlock tables;
DROP SEQUENCE s1;
#
# MDEV-15106 Unexpected ER_WRONG_INSERT_INTO_SEQUENCE upon INSERT with
# multiple locks on sequences
......@@ -51,3 +50,15 @@ LOCK TABLE seq1 WRITE, seq2 WRITE;
INSERT INTO seq1 VALUES (1, 1, 100000, 1, 1, 100, 1, 1);
DROP SEQUENCE seq1, seq2;
#
# MDEV-15970
# Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failure and/or
# ER_KEY_NOT_FOUND upon TRUNCATE sequence under lock
#
CREATE OR REPLACE SEQUENCE s1 ENGINE=MyISAM;
LOCK TABLE s1 WRITE;
--error ER_ILLEGAL_HA
TRUNCATE TABLE s1;
# Cleanup
DROP SEQUENCE s1;
......@@ -302,7 +302,7 @@ bool Sql_cmd_truncate_table::lock_table(THD *thd, TABLE_LIST *table_ref,
table_ref->table_name.str, FALSE)))
DBUG_RETURN(TRUE);
*hton_can_recreate= ha_check_storage_engine_flag(table->s->db_type(),
*hton_can_recreate= ha_check_storage_engine_flag(table->file->ht,
HTON_CAN_RECREATE);
table_ref->mdl_request.ticket= table->mdl_ticket;
}
......@@ -428,7 +428,10 @@ bool Sql_cmd_truncate_table::truncate_table(THD *thd, TABLE_LIST *table_ref)
error= dd_recreate_table(thd, table_ref->db.str, table_ref->table_name.str);
if (thd->locked_tables_mode && thd->locked_tables_list.reopen_tables(thd, false))
thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0);
{
thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0);
error=1;
}
/* No need to binlog a failed truncate-by-recreate. */
binlog_stmt= !error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment