mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-23207 Assertion `tl->table == __null' failed in THD::open_temporary_table
Assertion fails because table is opened by admin_recreate_table(): 71 result_code= (thd->open_temporary_tables(table_list) || 72 mysql_recreate_table(thd, table_list, recreate_info, false)); And that is called because t2 is failed with HA_ADMIN_NOT_IMPLEMENTED: 1093 if (result_code == HA_ADMIN_NOT_IMPLEMENTED && need_repair_or_alter) 1094 { 1095 /* 1096 repair was not implemented and we need to upgrade the table 1097 to a new version so we recreate the table with ALTER TABLE 1098 */ 1099 result_code= admin_recreate_table(thd, table, &recreate_info); 1100 } Actually 'table' is t2 but open_temporary_tables() opens whole list, i.e. t2 and everything what follows it before first_not_own_table(). Therefore t3 is also opened for t2 processing what is wrong. The fix opens exactly one specific table for HA_ADMIN_NOT_IMPLEMENTED.
This commit is contained in:
@@ -261,4 +261,16 @@ REPAIR TABLE t;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t repair status OK
|
test.t repair status OK
|
||||||
DELETE FROM t;
|
DELETE FROM t;
|
||||||
|
#
|
||||||
|
# MDEV-23207 Assertion `tl->table == __null' failed in THD::open_temporary_table
|
||||||
|
#
|
||||||
|
create table t1 (pk int primary key) engine=innodb partition by hash(pk) partitions 10;
|
||||||
|
create table t2 (c int) engine=innodb;
|
||||||
|
create temporary table t3 (c int);
|
||||||
|
repair table t1, t2, t3;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 repair status OK
|
||||||
|
test.t2 repair status OK
|
||||||
|
test.t3 repair status OK
|
||||||
|
drop tables t1, t2;
|
||||||
# End of 10.11 tests
|
# End of 10.11 tests
|
||||||
|
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
--source include/have_sequence.inc
|
--source include/have_sequence.inc
|
||||||
--source include/default_charset.inc
|
--source include/default_charset.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_partition.inc
|
||||||
|
|
||||||
call mtr.add_suppression("character set is multi-byte");
|
call mtr.add_suppression("character set is multi-byte");
|
||||||
|
|
||||||
@@ -279,4 +281,14 @@ INSERT INTO t VALUES(1);
|
|||||||
REPAIR TABLE t;
|
REPAIR TABLE t;
|
||||||
DELETE FROM t;
|
DELETE FROM t;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-23207 Assertion `tl->table == __null' failed in THD::open_temporary_table
|
||||||
|
--echo #
|
||||||
|
create table t1 (pk int primary key) engine=innodb partition by hash(pk) partitions 10;
|
||||||
|
create table t2 (c int) engine=innodb;
|
||||||
|
create temporary table t3 (c int);
|
||||||
|
repair table t1, t2, t3;
|
||||||
|
drop tables t1, t2;
|
||||||
|
|
||||||
--echo # End of 10.11 tests
|
--echo # End of 10.11 tests
|
||||||
|
|
||||||
|
@@ -68,7 +68,7 @@ static bool admin_recreate_table(THD *thd, TABLE_LIST *table_list,
|
|||||||
|
|
||||||
DEBUG_SYNC(thd, "ha_admin_try_alter");
|
DEBUG_SYNC(thd, "ha_admin_try_alter");
|
||||||
tmp_disable_binlog(thd); // binlogging is done by caller if wanted
|
tmp_disable_binlog(thd); // binlogging is done by caller if wanted
|
||||||
result_code= (thd->open_temporary_tables(table_list) ||
|
result_code= (thd->check_and_open_tmp_table(table_list) ||
|
||||||
mysql_recreate_table(thd, table_list, recreate_info, false));
|
mysql_recreate_table(thd, table_list, recreate_info, false));
|
||||||
reenable_binlog(thd);
|
reenable_binlog(thd);
|
||||||
/*
|
/*
|
||||||
|
@@ -5452,6 +5452,7 @@ public:
|
|||||||
TMP_TABLE_SHARE *find_tmp_table_share(const char *key, size_t key_length);
|
TMP_TABLE_SHARE *find_tmp_table_share(const char *key, size_t key_length);
|
||||||
|
|
||||||
bool open_temporary_table(TABLE_LIST *tl);
|
bool open_temporary_table(TABLE_LIST *tl);
|
||||||
|
bool check_and_open_tmp_table(TABLE_LIST *tl);
|
||||||
bool open_temporary_tables(TABLE_LIST *tl);
|
bool open_temporary_tables(TABLE_LIST *tl);
|
||||||
|
|
||||||
bool close_temporary_tables();
|
bool close_temporary_tables();
|
||||||
|
@@ -441,6 +441,17 @@ bool THD::open_temporary_table(TABLE_LIST *tl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool THD::check_and_open_tmp_table(TABLE_LIST *tl)
|
||||||
|
{
|
||||||
|
if (!has_temporary_tables() ||
|
||||||
|
tl == lex->first_not_own_table() ||
|
||||||
|
tl->derived || tl->schema_table)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return open_temporary_table(tl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Pre-open temporary tables corresponding to table list elements.
|
Pre-open temporary tables corresponding to table list elements.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user