mirror of
https://github.com/MariaDB/server.git
synced 2025-07-02 14:22:51 +03:00
Merge remote-tracking branch 'origin/10.1' into 10.2
This commit is contained in:
@ -763,6 +763,8 @@ void init_update_queries(void)
|
||||
There are other statements that deal with temporary tables and open
|
||||
them, but which are not listed here. The thing is that the order of
|
||||
pre-opening temporary tables for those statements is somewhat custom.
|
||||
|
||||
Note that SQLCOM_RENAME_TABLE should not be in this list!
|
||||
*/
|
||||
sql_command_flags[SQLCOM_CREATE_TABLE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_DROP_TABLE]|= CF_PREOPEN_TMP_TABLES;
|
||||
@ -776,7 +778,6 @@ void init_update_queries(void)
|
||||
sql_command_flags[SQLCOM_INSERT_SELECT]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_DELETE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_DELETE_MULTI]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_RENAME_TABLE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_REPLACE_SELECT]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_SELECT]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_SET_OPTION]|= CF_PREOPEN_TMP_TABLES;
|
||||
@ -6525,6 +6526,60 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Find out if a table is a temporary table
|
||||
|
||||
A table is a temporary table if it's a temporary table or
|
||||
there has been before a temporary table that has been renamed
|
||||
to the current name.
|
||||
|
||||
Some examples:
|
||||
A->B B is a temporary table if and only if A is a temp.
|
||||
A->B, B->C Second B is temp if A is temp
|
||||
A->B, A->C Second A can't be temp as if A was temp then B is temp
|
||||
and Second A can only be a normal table. C is also not temp
|
||||
*/
|
||||
|
||||
static TABLE *find_temporary_table_for_rename(THD *thd,
|
||||
TABLE_LIST *first_table,
|
||||
TABLE_LIST *cur_table)
|
||||
{
|
||||
TABLE_LIST *table;
|
||||
TABLE *res= 0;
|
||||
bool found= 0;
|
||||
DBUG_ENTER("find_temporary_table_for_rename");
|
||||
|
||||
/* Find last instance when cur_table is in TO part */
|
||||
for (table= first_table;
|
||||
table != cur_table;
|
||||
table= table->next_local->next_local)
|
||||
{
|
||||
TABLE_LIST *next= table->next_local;
|
||||
|
||||
if (!strcmp(table->get_db_name(), cur_table->get_db_name()) &&
|
||||
!strcmp(table->get_table_name(), cur_table->get_table_name()))
|
||||
{
|
||||
/* Table was moved away, can't be same as 'table' */
|
||||
found= 1;
|
||||
res= 0; // Table can't be a temporary table
|
||||
}
|
||||
if (!strcmp(next->get_db_name(), cur_table->get_db_name()) &&
|
||||
!strcmp(next->get_table_name(), cur_table->get_table_name()))
|
||||
{
|
||||
/*
|
||||
Table has matching name with new name of this table. cur_table should
|
||||
have same temporary type as this table.
|
||||
*/
|
||||
found= 1;
|
||||
res= table->table;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
res= thd->find_temporary_table(table, THD::TMP_TABLE_ANY);
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
|
||||
static bool check_rename_table(THD *thd, TABLE_LIST *first_table,
|
||||
TABLE_LIST *all_tables)
|
||||
{
|
||||
@ -6541,13 +6596,19 @@ static bool check_rename_table(THD *thd, TABLE_LIST *first_table,
|
||||
&table->next_local->grant.m_internal,
|
||||
0, 0))
|
||||
return 1;
|
||||
|
||||
/* check if these are refering to temporary tables */
|
||||
table->table= find_temporary_table_for_rename(thd, first_table, table);
|
||||
table->next_local->table= table->table;
|
||||
|
||||
TABLE_LIST old_list, new_list;
|
||||
/*
|
||||
we do not need initialize old_list and new_list because we will
|
||||
come table[0] and table->next[0] there
|
||||
copy table[0] and table->next[0] there
|
||||
*/
|
||||
old_list= table[0];
|
||||
new_list= table->next_local[0];
|
||||
|
||||
if (check_grant(thd, ALTER_ACL | DROP_ACL, &old_list, FALSE, 1, FALSE) ||
|
||||
(!test_all_bits(table->next_local->grant.privilege,
|
||||
INSERT_ACL | CREATE_ACL) &&
|
||||
|
Reference in New Issue
Block a user