Commit f3145644 authored by guilhem@mysql.com's avatar guilhem@mysql.com

Fixes after 4.1->5.0 merge.

parent 0987d81a
...@@ -19,8 +19,8 @@ n ...@@ -19,8 +19,8 @@ n
3 3
4 4
5 5
show binlog events from 79; show binlog events from 95;
Log_name Pos Event_type Server_id Orig_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query 1 # drop database if exists mysqltest master-bin.000001 # Query 1 # drop database if exists mysqltest
master-bin.000001 # Query 1 # create database mysqltest master-bin.000001 # Query 1 # create database mysqltest
master-bin.000001 # Query 1 # use `test`; create table mysqltest.t1 ( n int) master-bin.000001 # Query 1 # use `test`; create table mysqltest.t1 ( n int)
......
...@@ -24,6 +24,6 @@ sync_slave_with_master; ...@@ -24,6 +24,6 @@ sync_slave_with_master;
select * from mysqltest.t1; select * from mysqltest.t1;
connection master; connection master;
--replace_column 2 # 5 # --replace_column 2 # 5 #
show binlog events from 79; show binlog events from 95;
drop database mysqltest; drop database mysqltest;
sync_slave_with_master; sync_slave_with_master;
...@@ -496,48 +496,51 @@ void close_temporary(TABLE *table,bool delete_table) ...@@ -496,48 +496,51 @@ void close_temporary(TABLE *table,bool delete_table)
void close_temporary_tables(THD *thd) void close_temporary_tables(THD *thd)
{ {
TABLE *table,*next; TABLE *table,*next;
char *query, *name_in_query, *end; char *query, *end;
uint greatest_key_length= 0; uint query_buf_size;
bool found_user_tables = 0;
if (!thd->temporary_tables) if (!thd->temporary_tables)
return; return;
/*
We write a DROP TEMPORARY TABLE for each temp table left, so that our
replication slave can clean them up. Not one multi-table DROP TABLE binlog
event: this would cause problems if slave uses --replicate-*-table.
*/
LINT_INIT(end); LINT_INIT(end);
query_buf_size= 50; // Enough for DROP ... TABLE IF EXISTS
/* We'll re-use always same buffer so make it big enough for longest name */
for (table=thd->temporary_tables ; table ; table=table->next) for (table=thd->temporary_tables ; table ; table=table->next)
greatest_key_length= max(greatest_key_length, table->s->key_length); /*
We are going to add 4 ` around the db/table names, so 1 does not look
enough; indeed it is enough, because table->key_length is greater (by 8,
because of server_id and thread_id) than db||table.
*/
query_buf_size+= table->s->key_length+1;
if ((query = alloc_root(thd->mem_root, greatest_key_length+50))) if ((query = alloc_root(thd->mem_root, query_buf_size)))
// Better add "if exists", in case a RESET MASTER has been done // Better add "if exists", in case a RESET MASTER has been done
name_in_query= strmov(query, "DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `"); end=strmov(query, "DROP /*!40005 TEMPORARY */ TABLE IF EXISTS ");
for (table=thd->temporary_tables ; table ; table=next) for (table=thd->temporary_tables ; table ; table=next)
{ {
/* if (query) // we might be out of memory, but this is not fatal
In we are OOM for 'query' this is not fatal. We skip temporary tables
not created directly by the user.
*/
if (query && mysql_bin_log.is_open() && (table->s->table_name[0] != '#'))
{ {
/* // skip temporary tables not created directly by the user
Here we assume table_cache_key always starts if (table->s->table_name[0] != '#')
with \0 terminated db name found_user_tables = 1;
*/ end = strxmov(end,"`",table->s->db,"`.`",
end = strxmov(name_in_query, table->s->db, "`.`", table->s->table_name,"`,", NullS);
table->s->table_name, "`", NullS); }
Query_log_event qinfo(thd, query, (ulong)(end-query), 0, FALSE); next=table->next;
close_temporary(table);
}
if (query && found_user_tables && mysql_bin_log.is_open())
{
/* The -1 is to remove last ',' */
thd->clear_error();
Query_log_event qinfo(thd, query, (ulong)(end-query)-1, 0, FALSE);
/* /*
Imagine the thread had created a temp table, then was doing a SELECT, and Imagine the thread had created a temp table, then was doing a SELECT, and
the SELECT was killed. Then it's not clever to mark the statement above as the SELECT was killed. Then it's not clever to mark the statement above as
"killed", because it's not really a statement updating data, and there "killed", because it's not really a statement updating data, and there
are 99.99% chances it will succeed on slave. And, if thread is are 99.99% chances it will succeed on slave.
killed now, it's not clever either.
If a real update (one updating a persistent table) was killed on the If a real update (one updating a persistent table) was killed on the
master, then this real update will be logged with error_code=killed, master, then this real update will be logged with error_code=killed,
rightfully causing the slave to stop. rightfully causing the slave to stop.
...@@ -545,9 +548,6 @@ void close_temporary_tables(THD *thd) ...@@ -545,9 +548,6 @@ void close_temporary_tables(THD *thd)
qinfo.error_code= 0; qinfo.error_code= 0;
mysql_bin_log.write(&qinfo); mysql_bin_log.write(&qinfo);
} }
next=table->next;
close_temporary(table);
}
thd->temporary_tables=0; thd->temporary_tables=0;
} }
......
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