mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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)
This commit is contained in:
@ -32,3 +32,8 @@ CREATE SEQUENCE seq2;
|
|||||||
LOCK TABLE seq1 WRITE, seq2 WRITE;
|
LOCK TABLE seq1 WRITE, seq2 WRITE;
|
||||||
INSERT INTO seq1 VALUES (1, 1, 100000, 1, 1, 100, 1, 1);
|
INSERT INTO seq1 VALUES (1, 1, 100000, 1, 1, 100, 1, 1);
|
||||||
DROP SEQUENCE seq1, seq2;
|
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;
|
unlock tables;
|
||||||
DROP SEQUENCE s1;
|
DROP SEQUENCE s1;
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# MDEV-15106 Unexpected ER_WRONG_INSERT_INTO_SEQUENCE upon INSERT with
|
# MDEV-15106 Unexpected ER_WRONG_INSERT_INTO_SEQUENCE upon INSERT with
|
||||||
# multiple locks on sequences
|
# 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);
|
INSERT INTO seq1 VALUES (1, 1, 100000, 1, 1, 100, 1, 1);
|
||||||
DROP SEQUENCE seq1, seq2;
|
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)))
|
table_ref->table_name.str, FALSE)))
|
||||||
DBUG_RETURN(TRUE);
|
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);
|
HTON_CAN_RECREATE);
|
||||||
table_ref->mdl_request.ticket= table->mdl_ticket;
|
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);
|
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))
|
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. */
|
/* No need to binlog a failed truncate-by-recreate. */
|
||||||
binlog_stmt= !error;
|
binlog_stmt= !error;
|
||||||
|
Reference in New Issue
Block a user