summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/mysqltest.c3
-rw-r--r--mysql-test/r/ctype_recoding.result25
-rw-r--r--mysql-test/t/ctype_recoding.test19
-rw-r--r--sql/sql_class.cc14
4 files changed, 55 insertions, 6 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 8747f4f82eb..442f44f434e 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -1568,6 +1568,7 @@ int do_connect(struct st_query* q)
if (opt_compress)
mysql_options(&next_con->mysql,MYSQL_OPT_COMPRESS,NullS);
mysql_options(&next_con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
+ mysql_options(&next_con->mysql, MYSQL_SET_CHARSET_NAME, "latin1");
#ifdef HAVE_OPENSSL
if (opt_use_ssl)
@@ -2632,6 +2633,8 @@ int main(int argc, char **argv)
if (opt_compress)
mysql_options(&cur_con->mysql,MYSQL_OPT_COMPRESS,NullS);
mysql_options(&cur_con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
+ mysql_options(&cur_con->mysql, MYSQL_SET_CHARSET_NAME, "latin1");
+
#ifdef HAVE_OPENSSL
if (opt_use_ssl)
mysql_ssl_set(&cur_con->mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
diff --git a/mysql-test/r/ctype_recoding.result b/mysql-test/r/ctype_recoding.result
index ed59de87395..d40360b9337 100644
--- a/mysql-test/r/ctype_recoding.result
+++ b/mysql-test/r/ctype_recoding.result
@@ -111,3 +111,28 @@ SET character_set_connection=cp1251;
SELECT hex('ิลำิ');
hex('ิลำิ')
F2E5F1F2
+USE test;
+SET NAMES binary;
+CREATE TABLE `ั‚ะตัั‚` (`ั‚ะตัั‚` int);
+SHOW CREATE TABLE `ั‚ะตัั‚`;
+Table Create Table
+ั‚ะตัั‚ CREATE TABLE `ั‚ะตัั‚` (
+ `ั‚ะตัั‚` int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+SET NAMES utf8;
+SHOW CREATE TABLE `ั‚ะตัั‚`;
+Table Create Table
+ั‚ะตัั‚ CREATE TABLE `ั‚ะตัั‚` (
+ `ั‚ะตัั‚` int(11) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE `ั‚ะตัั‚`;
+SET NAMES binary;
+SET character_set_connection=utf8;
+SELECT 'ั‚ะตัั‚' as s;
+s
+ั‚ะตัั‚
+SET NAMES utf8;
+SET character_set_connection=binary;
+SELECT 'ั‚ะตัั‚' as s;
+s
+ั‚ะตัั‚
diff --git a/mysql-test/t/ctype_recoding.test b/mysql-test/t/ctype_recoding.test
index 8ac22e89c2d..45cc0cebfb3 100644
--- a/mysql-test/t/ctype_recoding.test
+++ b/mysql-test/t/ctype_recoding.test
@@ -78,3 +78,22 @@ SET NAMES koi8r;
SELECT hex('ิลำิ');
SET character_set_connection=cp1251;
SELECT hex('ิลำิ');
+
+USE test;
+
+# Bug#4417
+# Check that identifiers and strings are not converted
+# when the client character set is binary.
+
+SET NAMES binary;
+CREATE TABLE `ั‚ะตัั‚` (`ั‚ะตัั‚` int);
+SHOW CREATE TABLE `ั‚ะตัั‚`;
+SET NAMES utf8;
+SHOW CREATE TABLE `ั‚ะตัั‚`;
+DROP TABLE `ั‚ะตัั‚`;
+SET NAMES binary;
+SET character_set_connection=utf8;
+SELECT 'ั‚ะตัั‚' as s;
+SET NAMES utf8;
+SET character_set_connection=binary;
+SELECT 'ั‚ะตัั‚' as s;
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 7aa3bbbdd7b..ad4eb9f6801 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -533,21 +533,23 @@ bool THD::convert_string(String *s, CHARSET_INFO *from_cs, CHARSET_INFO *to_cs)
return FALSE;
}
+
/*
Update some cache variables when character set changes
*/
void THD::update_charset()
{
- charset_is_system_charset= my_charset_same(charset(),system_charset_info);
- charset_is_collation_connection= my_charset_same(charset(),
- variables.
- collation_connection);
+ uint32 not_used;
+ charset_is_system_charset= !String::needs_conversion(0,charset(),
+ system_charset_info,
+ &not_used);
+ charset_is_collation_connection=
+ !String::needs_conversion(0,charset(),variables.collation_connection,
+ &not_used);
}
-
-
/* routings to adding tables to list of changed in transaction tables */
inline static void list_include(CHANGED_TABLE_LIST** prev,