Commit 201f8e04 authored by aelkin@mysql.com's avatar aelkin@mysql.com

Merge aelkin@bk-internal.mysql.com:/home/bk/mysql-5.1-new-rpl

into  mysql.com:/usr_rh9/home/elkin.rh9/MySQL/TEAM/BARE/mysql-5.1-new-rpl
parents 9bf46d48 d30425a1
...@@ -1526,17 +1526,37 @@ bool close_temporary_table(THD *thd, TABLE_LIST *table_list) ...@@ -1526,17 +1526,37 @@ bool close_temporary_table(THD *thd, TABLE_LIST *table_list)
} }
/* /*
Close temporary table and unlink from thd->temporary tables unlink from thd->temporary tables and close temporary table
*/ */
void close_temporary_table(THD *thd, TABLE *table, void close_temporary_table(THD *thd, TABLE *table,
bool free_share, bool delete_table) bool free_share, bool delete_table)
{ {
TABLE **prev= table->open_prev; if (table->prev)
if ((*table->open_prev= table->next)) {
table->next->open_prev= prev; table->prev->next= table->next;
if (table->prev->next)
table->next->prev= table->prev;
}
else
{
/* removing the item from the list */
DBUG_ASSERT(table == thd->temporary_tables);
/*
slave must reset its temporary list pointer to zero to exclude
passing non-zero value to end_slave via rli->save_temporary_tables
when no temp tables opened, see an invariant below.
*/
thd->temporary_tables= table->next;
if (thd->temporary_tables)
table->next->prev= 0;
}
if (thd->slave_thread) if (thd->slave_thread)
{
/* natural invariant of temporary_tables */
DBUG_ASSERT(slave_open_temp_tables || !thd->temporary_tables);
slave_open_temp_tables--; slave_open_temp_tables--;
}
close_temporary(table, free_share, delete_table); close_temporary(table, free_share, delete_table);
} }
...@@ -3504,10 +3524,12 @@ TABLE *open_temporary_table(THD *thd, const char *path, const char *db, ...@@ -3504,10 +3524,12 @@ TABLE *open_temporary_table(THD *thd, const char *path, const char *db,
if (link_in_list) if (link_in_list)
{ {
tmp_table->open_prev= &thd->temporary_tables; /* growing temp list at the head */
if ((tmp_table->next= thd->temporary_tables)) tmp_table->next= thd->temporary_tables;
thd->temporary_tables->open_prev= &tmp_table->next; if (tmp_table->next)
tmp_table->next->prev= tmp_table;
thd->temporary_tables= tmp_table; thd->temporary_tables= tmp_table;
thd->temporary_tables->prev= 0;
if (thd->slave_thread) if (thd->slave_thread)
slave_open_temp_tables++; slave_open_temp_tables++;
} }
......
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