From b6c7f5f2a80e6123f0106254c6c56af8f33f12d7 Mon Sep 17 00:00:00 2001
From: unknown <aelkin@mysql.com>
Date: Mon, 15 May 2006 18:05:23 +0300
Subject: [PATCH] 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.
---
 sql/mysql_priv.h | 13 -------------
 sql/sql_base.cc  |  5 ++++-
 2 files changed, 4 insertions(+), 14 deletions(-)

diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 776c23a21a..0290c0178e 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1582,19 +1582,6 @@ inline int hexchar_to_int(char c)
   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()
   return true if the table was created explicitly
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index b6694edea7..c83e847bc8 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -715,9 +715,12 @@ void close_temporary_tables(THD *thd)
         close_temporary(table, 1);
       }
       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(),
                             s_query.length() - 1 /* to remove trailing ',' */,
                             0, FALSE);
+      thd->variables.character_set_client= cs_save;
       /*
         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
@@ -728,7 +731,7 @@ void close_temporary_tables(THD *thd)
         rightfully causing the slave to stop.
       */
       qinfo.error_code= 0;
-      write_binlog_with_system_charset(thd, &qinfo);
+      mysql_bin_log.write(&qinfo);
     }
     else
     {
-- 
2.30.9