mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-5535: Cannot reopen temporary table
Temporary table being created by outer statement should not be visible to inner statement. And if inner statement creates a table with same name. The whole statement should fail with ER_TABLE_EXISTS_ERROR. Implemented by temporarily de-linking the TABLE_SHARE being created by outer statement so that it remains hidden to the inner statement.
This commit is contained in:
@ -801,6 +801,50 @@ void THD::mark_tmp_table_as_free_for_reuse(TABLE *table)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Remove and return the specified table's TABLE_SHARE from the temporary
|
||||
tables list.
|
||||
|
||||
@param table [IN] Table
|
||||
|
||||
@return TMP_TABLE_SHARE of the specified table.
|
||||
*/
|
||||
TMP_TABLE_SHARE *THD::save_tmp_table_share(TABLE *table)
|
||||
{
|
||||
DBUG_ENTER("THD::save_tmp_table_share");
|
||||
|
||||
TMP_TABLE_SHARE *share;
|
||||
|
||||
lock_temporary_tables();
|
||||
DBUG_ASSERT(temporary_tables);
|
||||
share= tmp_table_share(table);
|
||||
temporary_tables->remove(share);
|
||||
unlock_temporary_tables();
|
||||
|
||||
DBUG_RETURN(share);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Add the specified TMP_TABLE_SHARE to the temporary tables list.
|
||||
|
||||
@param share [IN] Table share
|
||||
|
||||
@return void
|
||||
*/
|
||||
void THD::restore_tmp_table_share(TMP_TABLE_SHARE *share)
|
||||
{
|
||||
DBUG_ENTER("THD::restore_tmp_table_share");
|
||||
|
||||
lock_temporary_tables();
|
||||
DBUG_ASSERT(temporary_tables);
|
||||
temporary_tables->push_front(share);
|
||||
unlock_temporary_tables();
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
If its a replication slave, report whether slave temporary tables
|
||||
exist (Relay_log_info::save_temporary_tables) or report about THD
|
||||
|
Reference in New Issue
Block a user