hi,
If character_set in different Query_log_events
changed, worker threads may apply them with wrong character_set. the codes
leading this problem is in Query_log_event::do_apply_event, that
is:
if (charset_inited)
{
if (rli->cached_charset_compare(charset))
{
/* Verify that we support the charsets found in the event. */
if (!(thd->variables.character_set_client=
get_charset(uint2korr(charset), MYF(MY_WME))) ||
!(thd->variables.collation_connection=
get_charset(uint2korr(charset+2), MYF(MY_WME))) ||
!(thd->variables.collation_server=
get_charset(uint2korr(charset+4), MYF(MY_WME))))
{
There is a charset[6] in rli, which cached last
Query_log_event's charset in serial replication. But in parallel
replication it would lead mistake, because every worker thread can read and
set rli->charset[6], so rli->charset[6] isn't any worker threads' last
Query_log_event charset. but rli->charset[6] can affect every worker
threads' thd->variables.character_set_*
setting.
2014-04-17
nanyi607rao