summaryrefslogtreecommitdiff
path: root/sql/log.cc
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2004-08-29 14:13:51 +0200
committerunknown <guilhem@mysql.com>2004-08-29 14:13:51 +0200
commit4014c093e2ababc8436f83ef2b3f4c946a13795d (patch)
tree53851cfbb45764dc1cf49269f90ab871b9c6d0c9 /sql/log.cc
parent434d385ac17f2bfb553c112b5e19491d0bb0f876 (diff)
downloadmariadb-git-4014c093e2ababc8436f83ef2b3f4c946a13795d.tar.gz
Fix for BUG#4500 "set character set replicates incorrectly"
We must not reset the charset in slave after each statement, otherwise the SET CHARACTER SET is cancelled immediately. Instead, we write a SET CHARACTER SET DEFAULT to the master's binlog when needed (like we already do for SET FOREIGN_KEY_CHECKS); such writing is not necessary in 4.1 (in 4.1 the bug does not exist, as the SET ONE_SHOT syntax is used). I have written a test and it works, but I'm not pushing the test as it requires building with all charsets. I have noticed differences between what is inserted in the master's table in 4.0 and 4.1, and alerted Bar. sql/log.cc: When SET CHARACTER SET has been used, we must reset the charset after the writing the statement, in the binlog. In 4.1, this resetting is already achieved by the SET ONE_SHOT syntax. sql/log_event.cc: In slave, we must not simply reset the charset after each statement: if we do this, the charset gets immediately after executing the SET CHARACTER SET! (BUG#4500).
Diffstat (limited to 'sql/log.cc')
-rw-r--r--sql/log.cc22
1 files changed, 17 insertions, 5 deletions
diff --git a/sql/log.cc b/sql/log.cc
index db7b80eb4f7..9927bfe8d17 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -1208,12 +1208,24 @@ bool MYSQL_LOG::write(Log_event* event_info)
/* Write log events to reset the 'run environment' of the SQL command */
- if (thd && thd->options & OPTION_NO_FOREIGN_KEY_CHECKS)
+ if (thd)
{
- Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=1", 24, 0);
- e.set_log_pos(this);
- if (e.write(file))
- goto err;
+ if (thd->options & OPTION_NO_FOREIGN_KEY_CHECKS)
+ {
+ Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=1", 24, 0);
+ e.set_log_pos(this);
+ if (e.write(file))
+ goto err;
+ }
+#if MYSQL_VERSION_ID < 40100
+ if (thd->variables.convert_set)
+ {
+ Query_log_event e(thd, "SET CHARACTER SET DEFAULT", 25, 0);
+ e.set_log_pos(this);
+ if (e.write(file))
+ goto err;
+ }
+#endif
}
/*