BUG#14157: utf8 encoding in binlog without set character_set_client: e.g DROP temporary
specific to 5.0 version of the patch is motivated by the fact that a wrapper over MYSQLLOG::write can not help in 5.0 where query's charset is embedded into event instance in the constructor. sql/mysql_priv.h: this 4.1 specific code does not help in 5.0 sql/sql_base.cc: No wrapper similar to 4.1's version is done since Query_log_event constructor takes care of encodings in 5.0 whereas log::write method does it in 4.1. We can introduce an additional constuctor for Query_log_event to pass desired (i.e system_character_info) charset different from THD's version. But I am delaying this while there are not more bugs similar to this one reported.
This commit is contained in:
parent
df8b4a0602
commit
b6c7f5f2a8
@ -1582,19 +1582,6 @@ inline int hexchar_to_int(char c)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
wrapper to use instead of mysql_bin_log.write when
|
|
||||||
query is generated by the server using system_charset encoding
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void write_binlog_with_system_charset(THD * thd, Query_log_event * qinfo)
|
|
||||||
{
|
|
||||||
CHARSET_INFO * cs_save= thd->variables.character_set_client;
|
|
||||||
thd->variables.character_set_client= system_charset_info;
|
|
||||||
mysql_bin_log.write(qinfo);
|
|
||||||
thd->variables.character_set_client= cs_save;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
is_user_table()
|
is_user_table()
|
||||||
return true if the table was created explicitly
|
return true if the table was created explicitly
|
||||||
|
@ -715,9 +715,12 @@ void close_temporary_tables(THD *thd)
|
|||||||
close_temporary(table, 1);
|
close_temporary(table, 1);
|
||||||
}
|
}
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
|
CHARSET_INFO *cs_save= thd->variables.character_set_client;
|
||||||
|
thd->variables.character_set_client= system_charset_info;
|
||||||
Query_log_event qinfo(thd, s_query.ptr(),
|
Query_log_event qinfo(thd, s_query.ptr(),
|
||||||
s_query.length() - 1 /* to remove trailing ',' */,
|
s_query.length() - 1 /* to remove trailing ',' */,
|
||||||
0, FALSE);
|
0, FALSE);
|
||||||
|
thd->variables.character_set_client= cs_save;
|
||||||
/*
|
/*
|
||||||
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
|
||||||
@ -728,7 +731,7 @@ void close_temporary_tables(THD *thd)
|
|||||||
rightfully causing the slave to stop.
|
rightfully causing the slave to stop.
|
||||||
*/
|
*/
|
||||||
qinfo.error_code= 0;
|
qinfo.error_code= 0;
|
||||||
write_binlog_with_system_charset(thd, &qinfo);
|
mysql_bin_log.write(&qinfo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user