List:Commits« Previous MessageNext Message »
From:Alexander Barkov Date:June 2 2009 9:52am
Subject:bzr commit into mysql-6.0 branch (bar:3066) WL#1349
View as plain text  
#At file:///home/bar/mysql-bzr/mysql-6.1.w1349/ based on revid:alik@stripped

 3066 Alexander Barkov	2009-06-02
      WL#1349 Use operating system localization to send it as a default client character set
      
      @ client/mysql.cc
         - Changing default character set to "auto".
         - Removing get_charset_by_csname() call which checks if
           the character set exists. This call is reduntant -
           it is also done inside mysql_connect() API function.
         - Instead of calling get_charset_by_csname(), we now set
           charset_info to mysql.charset, which was initialized inside
           mysql_connect().
      @ client/mysqladmin.cc
         Changing the default character set to "auto".
         "default_charset" is never NULL now, removing the condition.
      @ client/mysqlcheck.c
         Changing the default character set to "auto",
         but only when neither opt_fix_db_names none opt_fix_table_names
         are specified.
         In case they are, we still use utf8 by default, which is needed
         to make sure we can access to all tables in the database.
      @ client/mysqlimport.c
         Removing redundant get_charset_by_csname() - like we did in mysql.cc
         Changing the default character set to "auto".
         Adding missing mysql_options() to pass "auto" as a character set name.
      @ client/mysqlshow.c
         Changing the default character set to "auto"
      @ configure.in
         Adding detection of NL_LANGINFO() and langinfo.h
      @ include/mysql_com.h
         Adding a defition for "auto"
      @ mysql-test/include/default_my.cnf
         Make sure "mysql" always starts with latin1 when running tests.
         Otherwise, test results would depend on the system localization
         and would fail on non-Western machines.
      @ mysql-test/include/mysqladmin_shutdown.inc
         Skip auto-detection.
      @ mysql-test/lib/My/ConfigFactory.pm
         Adding --character-sets-dir into [client] section
         of mysql-test/var/my.cnf
      @ mysql-test/r/mysql_locale_posix.result
         Adding tests
      @ mysql-test/t/mysql_locale_posix.test
         Adding tests
      @ sql-common/client.c
         Adding mapping between OS and MySQL character set names.
         Adding MySQL charset detection code, using OS localization information.
         Moving some code into a new function mysql_set_character_set_with_default_collation,
         for easier maitanance.

    added:
      mysql-test/r/mysql_locale_posix.result
      mysql-test/t/mysql_locale_posix.test
    modified:
      client/mysql.cc
      client/mysqladmin.cc
      client/mysqlcheck.c
      client/mysqlimport.c
      client/mysqlshow.c
      configure.in
      include/mysql_com.h
      mysql-test/include/default_my.cnf
      mysql-test/include/mysqladmin_shutdown.inc
      mysql-test/lib/My/ConfigFactory.pm
      mysql-test/t/mysqladmin.test
      mysql-test/t/mysqlcheck.test
      sql-common/client.c
=== modified file 'client/mysql.cc'
--- a/client/mysql.cc	2009-02-18 12:46:27 +0000
+++ b/client/mysql.cc	2009-06-02 09:50:17 +0000
@@ -153,7 +153,7 @@ static char * opt_mysql_unix_port=0;
 static int connect_flag=CLIENT_INTERACTIVE;
 static char *current_host,*current_db,*current_user=0,*opt_password=0,
             *current_prompt=0, *delimiter_str= 0,
-            *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
+            *default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
 static char *histfile;
 static char *histfile_tmp;
 static String glob_buffer,old_buffer;
@@ -1807,10 +1807,6 @@ static int get_options(int argc, char **
     connect_flag= 0; /* Not in interactive mode */
   }
   
-  if (strcmp(default_charset, charset_info->csname) &&
-      !(charset_info= get_charset_by_csname(default_charset, 
-					    MY_CS_PRIMARY, MYF(MY_WME))))
-    exit(1);
   if (argc > 1)
   {
     usage(0);
@@ -4262,8 +4258,9 @@ sql_real_connect(char *host,char *databa
 	    select_limit,max_join_size);
     mysql_options(&mysql, MYSQL_INIT_COMMAND, init_command);
   }
-  if (default_charset_used)
-    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
+
+  mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
+  
   if (!mysql_real_connect(&mysql, host, user, password,
 			  database, opt_mysql_port, opt_mysql_unix_port,
 			  connect_flag | CLIENT_MULTI_STATEMENTS))
@@ -4278,6 +4275,9 @@ sql_real_connect(char *host,char *databa
     }
     return -1;					// Retryable
   }
+  
+  charset_info= mysql.charset;
+  
   connected=1;
 #ifndef EMBEDDED_LIBRARY
   mysql.reconnect= debug_info_flag; // We want to know if this happens

=== modified file 'client/mysqladmin.cc'
--- a/client/mysqladmin.cc	2009-02-13 16:30:54 +0000
+++ b/client/mysqladmin.cc	2009-06-02 09:50:17 +0000
@@ -29,7 +29,7 @@
 #define MAX_TRUNC_LENGTH 3
 
 char *host= NULL, *user= 0, *opt_password= 0,
-     *default_charset= NULL;
+     *default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
 char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
 char ex_var_names[MAX_MYSQL_VAR][FN_REFLEN];
 ulonglong last_values[MAX_MYSQL_VAR];
@@ -345,8 +345,7 @@ int main(int argc,char *argv[])
   if (shared_memory_base_name)
     mysql_options(&mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
 #endif
-  if (default_charset)
-    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
+  mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
   error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
 
   if (sql_connect(&mysql, option_wait))

=== modified file 'client/mysqlcheck.c'
--- a/client/mysqlcheck.c	2009-01-26 16:03:39 +0000
+++ b/client/mysqlcheck.c	2009-06-02 09:50:17 +0000
@@ -367,12 +367,16 @@ static int get_options(int *argc, char *
     If there's no --default-character-set option given with
     --fix-table-name or --fix-db-name set the default character set to "utf8".
   */
-  if (!default_charset && (opt_fix_db_names || opt_fix_table_names))
+  if (!default_charset)
   {
-    default_charset= (char*) "utf8";
+    if (opt_fix_db_names || opt_fix_table_names)
+      default_charset= (char*) "utf8";
+    else
+      default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
   }
-  if (default_charset && !get_charset_by_csname(default_charset, MY_CS_PRIMARY,
-                                                MYF(MY_WME)))
+  if (default_charset &&
+      strcmp(default_charset, MYSQL_AUTODETECT_CHARSET_NAME) &&
+      !get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))
   {
     printf("Unsupported character set: %s\n", default_charset);
     return 1;

=== modified file 'client/mysqlimport.c'
--- a/client/mysqlimport.c	2008-12-17 18:40:14 +0000
+++ b/client/mysqlimport.c	2009-06-02 09:50:17 +0000
@@ -55,11 +55,10 @@ static char	*opt_password=0, *current_us
 		*current_host=0, *current_db=0, *fields_terminated=0,
 		*lines_terminated=0, *enclosed=0, *opt_enclosed=0,
 		*escaped=0, *opt_columns=0, 
-		*default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
+		*default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
 static uint     opt_mysql_port= 0, opt_protocol= 0;
 static char * opt_mysql_unix_port=0;
 static longlong opt_ignore_lines= -1;
-static CHARSET_INFO *charset_info= &my_charset_latin1;
 #include <sslopt-vars.h>
 
 #ifdef HAVE_SMEM
@@ -280,10 +279,6 @@ static int get_options(int *argc, char *
     fprintf(stderr, "You can't use --ignore (-i) and --replace (-r) at the same time.\n");
     return(1);
   }
-  if (strcmp(default_charset, charset_info->csname) &&
-      !(charset_info= get_charset_by_csname(default_charset,
-  					    MY_CS_PRIMARY, MYF(MY_WME))))
-    exit(1);
   if (*argc < 2)
   {
     usage();
@@ -427,6 +422,7 @@ static MYSQL *db_connect(char *host, cha
   if (shared_memory_base_name)
     mysql_options(mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
 #endif
+  mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset);
   if (!(mysql_real_connect(mysql,host,user,passwd,
                            database,opt_mysql_port,opt_mysql_unix_port,
                            0)))

=== modified file 'client/mysqlshow.c'
--- a/client/mysqlshow.c	2008-11-14 16:29:38 +0000
+++ b/client/mysqlshow.c	2009-06-02 09:50:17 +0000
@@ -32,7 +32,7 @@ static my_bool tty_password= 0, opt_tabl
 static my_bool debug_info_flag= 0, debug_check_flag= 0;
 static uint my_end_arg= 0;
 static uint opt_verbose=0;
-static char *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
+static char *default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
 
 #ifdef HAVE_SMEM 
 static char *shared_memory_base_name=0;

=== modified file 'configure.in'
--- a/configure.in	2009-02-19 16:55:17 +0000
+++ b/configure.in	2009-06-02 09:50:17 +0000
@@ -2037,10 +2037,11 @@ AC_SUBST(MAKE_SHELL)
 AC_CHECK_HEADERS(varargs.h stdarg.h dirent.h locale.h ndir.h sys/dir.h \
  sys/file.h sys/ndir.h sys/ptem.h sys/pte.h sys/select.h sys/stream.h \
  sys/mman.h curses.h termcap.h termio.h termbits.h asm/termbits.h grp.h \
-paths.h semaphore.h)
+paths.h semaphore.h langinfo.h)
 
 # Already-done: strcasecmp
 AC_CHECK_FUNCS(lstat putenv select setenv setlocale strcoll tcgetattr)
+AC_CHECK_FUNCS(nl_langinfo)
 
 MYSQL_SIGNAL_CHECK
 MYSQL_CHECK_GETPW_FUNCS

=== modified file 'include/mysql_com.h'
--- a/include/mysql_com.h	2009-01-26 16:03:39 +0000
+++ b/include/mysql_com.h	2009-06-02 09:50:17 +0000
@@ -27,6 +27,8 @@
 #define NAME_LEN                (NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN)
 #define USERNAME_LENGTH         (USERNAME_CHAR_LENGTH*SYSTEM_CHARSET_MBMAXLEN)
 
+#define MYSQL_AUTODETECT_CHARSET_NAME "auto"
+
 #define SERVER_VERSION_LENGTH 60
 #define SQLSTATE_LENGTH 5
 

=== modified file 'mysql-test/include/default_my.cnf'
--- a/mysql-test/include/default_my.cnf	2007-12-12 17:19:24 +0000
+++ b/mysql-test/include/default_my.cnf	2009-06-02 09:50:17 +0000
@@ -23,3 +23,18 @@ password=                @client.passwor
 [ENV]
 MASTER_MYPORT=           @mysqld.1.port
 MASTER_MYSOCK=           @mysqld.1.socket
+
+[mysql]
+default-character-set=latin1
+
+[mysqlshow]
+default-character-set=latin1
+
+#[mysqldump]
+#default-character-set=latin1
+
+[mysqlimport]
+default-character-set=latin1
+
+[mysqlcheck]
+default-character-set=latin1

=== modified file 'mysql-test/include/mysqladmin_shutdown.inc'
--- a/mysql-test/include/mysqladmin_shutdown.inc	2008-12-05 14:08:09 +0000
+++ b/mysql-test/include/mysqladmin_shutdown.inc	2009-06-02 09:50:17 +0000
@@ -1,6 +1,6 @@
 # Initiates a clean shutdown of the server and waits for its completion
 
---exec $MYSQLADMIN --no-defaults -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= shutdown 2>&1;
+--exec $MYSQLADMIN --no-defaults --default-character-set=latin1 -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= shutdown 2>&1;
 
 # On Windows mysqladmin does not wait for shutdown to be finished,
 # so we have to monitor this with our connection:

=== modified file 'mysql-test/lib/My/ConfigFactory.pm'
--- a/mysql-test/lib/My/ConfigFactory.pm	2009-01-27 13:21:18 +0000
+++ b/mysql-test/lib/My/ConfigFactory.pm	2009-06-02 09:50:17 +0000
@@ -282,6 +282,7 @@ my @cluster_config_rules=
 #
 my @client_rules=
 (
+ { 'character-sets-dir' => \&fix_charset_dir },
 );
 
 

=== added file 'mysql-test/r/mysql_locale_posix.result'
--- a/mysql-test/r/mysql_locale_posix.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/mysql_locale_posix.result	2009-06-02 09:50:17 +0000
@@ -0,0 +1,72 @@
+set names utf8;
+drop database if exists `ó`;
+drop database if exists `Ăł`;
+drop database if exists `цЁ`;
+drop database if exists `ó`;
+
+ISO8859-1
+@@character_set_client
+latin1
+Database: ó
++--------+
+| Tables |
++--------+
++--------+
+
+ISO8859-2
+@@character_set_client
+latin2
+Database: ó
++--------+
+| Tables |
++--------+
++--------+
+
+KOI8-R
+@@character_set_client
+koi8r
+Database: ó
++--------+
+| Tables |
++--------+
++--------+
+
+UTF-8
+@@character_set_client
+utf8
+Database: ó
++--------+
+| Tables |
++--------+
++--------+
+Database: ó
++--------+
+| Tables |
++--------+
++--------+
+Database: Ăł
++--------+
+| Tables |
++--------+
++--------+
+Database: цЁ
++--------+
+| Tables |
++--------+
++--------+
+show databases like 'ó';
+Database (ó)
+ó
+show databases like 'Ăł';
+Database (Ăł)
+Ăł
+show databases like 'цЁ';
+Database (цЁ)
+цЁ
+show databases like 'ó';
+Database (ó)
+ó
+drop database `ó`;
+drop database `Ăł`;
+drop database `цЁ`;
+drop database `ó`;

=== added file 'mysql-test/t/mysql_locale_posix.test'
--- a/mysql-test/t/mysql_locale_posix.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/mysql_locale_posix.test	2009-06-02 09:50:17 +0000
@@ -0,0 +1,199 @@
+--source include/not_windows.inc
+--source include/have_case_sensitive_file_system.inc
+
+#
+# Note, please keep this file UTF-8 compatible.
+# After editing, make sure that
+#  "file mysql_locale_posix.test"
+# says
+#   "UTF-8 Unicode text"
+# or
+#   "UTF-8 Unicode English text"
+#
+
+
+#
+# Check if we're running on a POSIX-locale machine
+#
+
+--disable_query_log
+--exec locale -a >> var/tmp/locale_a.output 2>/dev/null || true
+set @file=replace(load_file('../../tmp/locale_a.output'), '-', '');
+# make it case insensitive
+set @file=cast(@file as char character set latin1) collate latin1_swedish_ci;
+--exec rm -f var/tmp/locale_a.output
+
+if (`select (ifnull(@file,'') NOT LIKE '%\nde_DE.iso88591\n%')`)
+{
+  Skip Need POSIX locale de_DE.iso88591;
+}
+
+if (`select (ifnull(@file,'') NOT LIKE '%\nru_RU.koi8r\n%')`)
+{
+  Skip Need POSIX locale ru_RU.koi8r;
+}
+
+if (`select (ifnull(@file,'') NOT LIKE '%\ncs_CZ.iso88592\n%')`)
+{
+  Skip Need POSIX locale cs_CZ.iso88592;
+}
+
+if (`select (ifnull(@file,'') NOT LIKE '%\nen_US.utf8\n%')`)
+{
+  Skip Need POSIX locale en_US.utf8;
+}
+--enable_query_log
+
+
+
+set names utf8;
+
+--disable_warnings
+drop database if exists `ó`;
+drop database if exists `Ăł`;
+drop database if exists `цЁ`;
+drop database if exists `ó`;
+--enable_warnings
+
+#
+# Test some of the OS-to-MySQL character set mappings
+#
+
+
+#  {"ANSI_X3.4-1968", "ascii",    my_cs_exact},
+#  {"ansi1251",       "cp1251",   my_cs_exact},
+#  {"armscii8",       "armscii8", my_cs_exact},
+#  {"ASCII",          "ascii",    my_cs_exact},
+#  {"Big5",           "big5",     my_cs_exact},
+#  {"cp1251",         "cp1251",   my_cs_exact},
+#  {"cp1255",         "cp1255",   my_cs_exact},
+#  {"CP866",          "cp866",    my_cs_exact},
+#  {"eucCN",          "gb2312",   my_cs_exact},
+#  {"eucJP",          "ujis",     my_cs_exact},
+#  {"eucKR",          "euckr",    my_cs_exact},
+#
+#  {"gb18030",        "gb18030",  my_cs_exact},
+#
+#  {"gb2312",         "gb2312",   my_cs_exact},
+#  {"gbk",            "gbk",      my_cs_exact},
+#  {"georgianps",     "geostd8",  my_cs_exact},
+#  {"IBM-1252",       "cp1252",   my_cs_exact},
+#
+#  {"iso88591",       "latin1",   my_cs_approx},
+#  {"ISO_8859-1",     "latin1",   my_cs_approx},
+#  {"ISO8859-1",      "latin1",   my_cs_approx},
+#  {"ISO-8859-1",     "latin1",   my_cs_approx},
+
+
+#
+# _utf8 0xC3B3 = LATIN SMALL LETTER O WITH ACUTE
+# _latin1 0xC3 = LATIN CAPITAL LETTER A WITH TILDE
+# _latin1 0xB3 = SUPERSCRIPT THREE
+#
+--echo
+--echo ISO8859-1
+--exec LC_ALL=fi_FI.ISO8859-1 $MYSQL --default-character-set=auto test -e "select @@character_set_client"
+--exec LC_ALL=fi_FI.ISO8859-1 $MYSQLADMIN -uroot -S $MASTER_MYSOCK -P $MASTER_MYPORT --default-character-set=auto create ó
+--exec LC_ALL=fi_FI.ISO8859-1 $MYSQL_SHOW --default-character-set=auto ó
+--exec LC_ALL=fi_FI.ISO8859-1 $MYSQL_CHECK --default-character-set=auto "ó"
+
+
+#  {"iso885913",      "latin7",   my_cs_exact},
+#  {"ISO_8859-13",    "latin7",   my_cs_exact},
+#  {"ISO8859-13",     "latin7",   my_cs_exact},
+#  {"ISO-8859-13",    "latin7",   my_cs_exact},
+#
+#  {"iso885915",      "latin9",   my_cs_exact},
+#  {"ISO_8859-15",    "latin9",   my_cs_exact},
+#  {"ISO8859-15",     "latin9",   my_cs_exact},
+#  {"ISO-8859-15",    "latin9",   my_cs_exact},
+#
+#  {"iso88592",       "latin2",   my_cs_exact},
+#  {"ISO_8859-2",     "latin2",   my_cs_exact},
+#  {"ISO8859-2",      "latin2",   my_cs_exact},
+#  {"ISO-8859-2",     "latin2",   my_cs_exact},
+#
+
+
+#
+# _utf8 0xC3B3 = LATIN SMALL LETTER O WITH ACUTE
+# _latin2 0xC3 = LATIN CAPITAL LETTER A WITH BREVE
+# _latin2 0xB3 = LATIN SMALL LETTER L WITH STROKE
+#
+--echo
+--echo ISO8859-2
+--exec LC_ALL=cs_CZ.ISO8859-2 $MYSQL --character-sets-dir=$CHARSETSDIR --default-character-set=auto test -e "select @@character_set_client"
+--exec LC_ALL=cs_CZ.ISO8859-2 $MYSQLADMIN --character-sets-dir=$CHARSETSDIR  -uroot -S $MASTER_MYSOCK -P $MASTER_MYPORT --default-character-set=auto create ó
+--exec LC_ALL=cs_CZ.ISO8859-2 $MYSQL_SHOW --character-sets-dir=$CHARSETSDIR --default-character-set=auto ó
+--exec LC_ALL=cs_CZ.ISO8859-1 $MYSQL_CHECK --character-sets-dir=$CHARSETSDIR--default-character-set=auto "ó"
+
+
+#  {"iso88597",       "greek",    my_cs_exact},
+#  {"ISO_8859-7",     "greek",    my_cs_exact},
+#  {"ISO8859-7",      "greek",    my_cs_exact},
+#  {"ISO-8859-7",     "greek",    my_cs_exact},
+#
+#  {"iso88598",       "hebrew",   my_cs_exact},
+#  {"ISO_8859-8",     "hebrew",   my_cs_exact},
+#  {"ISO8859-8",      "hebrew",   my_cs_exact},
+#  {"ISO-8859-8",     "hebrew",   my_cs_exact},
+#
+#  {"iso88599",       "latin5",   my_cs_exact},
+#  {"ISO_8859-9",     "latin5",   my_cs_exact},
+#  {"ISO8859-9",      "latin5",   my_cs_exact},
+#  {"ISO-8859-9",     "latin5",   my_cs_exact},
+#
+#  {"koi8r",          "koi8r",    my_cs_exact},
+#  {"KOI8-R",         "koi8r",    my_cs_exact},
+#  {"koi8u",          "koi8u",    my_cs_exact},
+#  {"KOI8-U",         "koi8u",    my_cs_exact},
+#
+
+#
+# _utf8 0xC3B3 = LATIN SMALL LETTER O WITH ACUTE
+# _koi8r  0xC3 = CYRILLIC SMALL LETTER TSE
+# _koi8r  0xB3 = CYRILLIC CAPITAL LETTER IO
+#
+
+--echo
+--echo KOI8-R
+--exec LC_ALL=ru_RU.KOI8-R $MYSQL --character-sets-dir=$CHARSETSDIR --default-character-set=auto test -e "select @@character_set_client"
+--exec LC_ALL=ru_RU.KOI8-R $MYSQLADMIN --character-sets-dir=$CHARSETSDIR -uroot -S $MASTER_MYSOCK -P $MASTER_MYPORT --default-character-set=auto create ó
+--exec LC_ALL=ru_RU.KOI8-R $MYSQL_SHOW --character-sets-dir=$CHARSETSDIR --default-character-set=auto ó
+--exec LC_ALL=ru_RU.ISO8859-1 $MYSQL_CHECK --character-sets-dir=$CHARSETSDIR --default-character-set=auto "ó"
+
+
+#  {"Shift_JIS",      "sjis",     my_cs_exact},
+#  {"SJIS",           "sjis",     my_cs_exact},
+#
+#  {"tis620",         "tis620",   my_cs_exact},
+#
+#  {"ujis",           "ujis",     my_cs_exact},
+#
+#  {"US-ASCII",       "ascii",    my_cs_exact},
+#
+#  {"utf8",           "utf8",     my_cs_exact},
+#  {"utf-8",          "utf8",     my_cs_exact},
+
+--echo 
+--echo UTF-8
+--exec LC_ALL=en_US.UTF-8 $MYSQL --default-character-set=auto test -e "select @@character_set_client"
+--exec LC_ALL=en_US.UTF-8 $MYSQLADMIN -uroot -S $MASTER_MYSOCK -P $MASTER_MYPORT --default-character-set=auto create ó
+--exec LC_ALL=en_US.UTF-8 $MYSQL_SHOW --default-character-set=auto ter-set=auto "ó"
+--exec LC_ALL=en_US.UTF-8 $MYSQL_SHOW --default-character-set=auto "Ăł"
+--exec LC_ALL=en_US.UTF-8 $MYSQL_SHOW --default-character-set=auto "цЁ"
+--exec LC_ALL=en_US.UTF-8 $MYSQL_CHECK --default-character-set=auto ó
+--exec LC_ALL=en_US.UTF-8 $MYSQL_CHECK --default-character-set=auto "ó"
+--exec LC_ALL=en_US.UTF-8 $MYSQL_CHECK --default-character-set=auto "Ăł"
+--exec LC_ALL=en_US.UTF-8 $MYSQL_CHECK --default-character-set=auto "цЁ"
+
+show databases like 'ó';
+show databases like 'Ăł';
+show databases like 'цЁ';
+show databases like 'ó';
+
+drop database `ó`;
+drop database `Ăł`;
+drop database `цЁ`;
+drop database `ó`;

=== modified file 'mysql-test/t/mysqladmin.test'
--- a/mysql-test/t/mysqladmin.test	2007-08-07 09:42:14 +0000
+++ b/mysql-test/t/mysqladmin.test	2009-06-02 09:50:17 +0000
@@ -4,7 +4,7 @@
 # Test "mysqladmin ping"
 #
 
---exec $MYSQLADMIN --no-defaults -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= ping 2>&1
+--exec $MYSQLADMIN --no-defaults --default-character-set=latin1 -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= ping 2>&1
 
 
 #
@@ -19,7 +19,7 @@ EOF
 
 --replace_regex /.*mysqladmin.*: unknown/mysqladmin: unknown/
 --error 7
---exec $MYSQLADMIN --defaults-file=$MYSQLTEST_VARDIR/tmp/bug10608.cnf -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= ping 2>&1
+--exec $MYSQLADMIN --defaults-file=$MYSQLTEST_VARDIR/tmp/bug10608.cnf --default-character-set=latin1 -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= ping 2>&1
 remove_file $MYSQLTEST_VARDIR/tmp/bug10608.cnf;
 
 # When mysqladmin finds "loose-database" in .cnf file it shall print
@@ -30,6 +30,6 @@ loose-database=db2
 EOF
 
 --replace_regex /Warning: .*mysqladmin.*: unknown/Warning: mysqladmin: unknown/
---exec $MYSQLADMIN --defaults-file=$MYSQLTEST_VARDIR/tmp/bug10608.cnf -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= ping 2>&1
+--exec $MYSQLADMIN --defaults-file=$MYSQLTEST_VARDIR/tmp/bug10608.cnf --default-character-set=latin1 -S $MASTER_MYSOCK -P $MASTER_MYPORT  -u root --password= ping 2>&1
 
 remove_file $MYSQLTEST_VARDIR/tmp/bug10608.cnf;

=== modified file 'mysql-test/t/mysqlcheck.test'
--- a/mysql-test/t/mysqlcheck.test	2009-01-26 16:32:29 +0000
+++ b/mysql-test/t/mysqlcheck.test	2009-06-02 09:50:17 +0000
@@ -177,7 +177,7 @@ SELECT * FROM INFORMATION_SCHEMA.TRIGGER
   WHERE TRIGGER_SCHEMA="#mysql50#a@b" ORDER BY trigger_name;
 
 --echo mysqlcheck --fix-db-names --fix-table-names --all-databases
---exec $MYSQL_CHECK --fix-db-names --fix-table-names --all-databases
+--exec $MYSQL_CHECK --default-character-set=utf8 --fix-db-names --fix-table-names --all-databases
 
 USE `a@b`;
 SELECT * FROM INFORMATION_SCHEMA.TRIGGERS

=== modified file 'sql-common/client.c'
--- a/sql-common/client.c	2008-12-24 10:48:24 +0000
+++ b/sql-common/client.c	2009-06-02 09:50:17 +0000
@@ -1738,52 +1738,295 @@ static MYSQL_METHODS client_methods=
 #endif
 };
 
+
+
+typedef enum my_cs_match_type_enum
+{
+  /* MySQL and OS charsets are fully compatible */
+  my_cs_exact,
+  /* MySQL charset is very close to OS charset  */
+  my_cs_approx,
+  /*
+    MySQL knows this charset, but it is not supported as client character set.
+  */
+  my_cs_unsupp
+} my_cs_match_type;
+
+
+typedef struct str2str_st
+{
+  const char *os_name;
+  const char *my_name;
+  my_cs_match_type param;
+} MY_CSET_OS_NAME;
+
+const MY_CSET_OS_NAME charsets[]=
+{
+#ifdef __WIN__
+  {"cp437",          "cp850",    my_cs_approx},
+  {"cp850",          "cp850",    my_cs_exact},
+  {"cp852",          "cp852",    my_cs_exact},
+  {"cp858",          "cp850",    my_cs_approx},
+  {"cp866",          "cp866",    my_cs_exact},
+  {"cp874",          "tis620",   my_cs_approx},
+  {"cp932",          "cp932",    my_cs_exact},
+  {"cp936",          "gbk",      my_cs_approx},
+  {"cp949",          "euckr",    my_cs_approx},
+  {"cp950",          "big5",     my_cs_exact},
+  {"cp1200",         "utf16le",  my_cs_unsupp},
+  {"cp1201",         "utf16",    my_cs_unsupp},
+  {"cp1250",         "cp1250",   my_cs_exact},
+  {"cp1251",         "cp1251",   my_cs_exact},
+  {"cp1252",         "latin1",   my_cs_exact},
+  {"cp1253",         "greek",    my_cs_exact},
+  {"cp1254",         "latin5",   my_cs_exact},
+  {"cp1255",         "hebrew",   my_cs_approx},
+  {"cp1256",         "cp1256",   my_cs_exact},
+  {"cp1257",         "cp1257",   my_cs_exact},
+  {"cp10000",        "macroman", my_cs_exact},
+  {"cp10001",        "sjis",     my_cs_approx},
+  {"cp10002",        "big5",     my_cs_approx},
+  {"cp10008",        "gb2312",   my_cs_approx},
+  {"cp10021",        "tis620",   my_cs_approx},
+  {"cp10029",        "macce",    my_cs_exact},
+  {"cp12001",        "utf32",    my_cs_unsupp},
+  {"cp20107",        "swe7",     my_cs_exact},
+  {"cp20127",        "ascii",    my_cs_exact},
+  {"cp20866",        "koi8r",    my_cs_exact},
+  {"cp20932",        "ujis",     my_cs_exact},
+  {"cp20936",        "gb2312",   my_cs_approx},
+  {"cp20949",        "euckr",    my_cs_approx},
+  {"cp21866",        "koi8u",    my_cs_exact},
+  {"cp28591",        "latin1",   my_cs_approx},
+  {"cp28592",        "latin2",   my_cs_exact},
+  {"cp28597",        "greek",    my_cs_exact},
+  {"cp28598",        "hebrew",   my_cs_exact},
+  {"cp28599",        "latin5",   my_cs_exact},
+  {"cp28603",        "latin7",   my_cs_exact},
+#ifdef UNCOMMENT_THIS_WHEN_WL_4579_IS_DONE
+  {"cp28605",        "latin9",   my_cs_exact},
+#endif
+  {"cp38598",        "hebrew",   my_cs_exact},
+  {"cp51932",        "ujis",     my_cs_exact},
+  {"cp51936",        "gb2312",   my_cs_exact},
+  {"cp51949",        "euckr",    my_cs_exact},
+  {"cp51950",        "big5",     my_cs_exact},
+#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
+  {"cp54936",        "gb18030",  my_cs_exact},
+#endif
+  {"cp65001",        "utf8",     my_cs_exact},
+
+#else /* not Windows */
+
+  {"ANSI_X3.4-1968", "ascii",    my_cs_exact},
+  {"ansi1251",       "cp1251",   my_cs_exact},
+  {"armscii8",       "armscii8", my_cs_exact},
+  {"armscii-8",      "armscii8", my_cs_exact},
+  {"ASCII",          "ascii",    my_cs_exact},
+  {"Big5",           "big5",     my_cs_exact},
+  {"cp1251",         "cp1251",   my_cs_exact},
+  {"cp1255",         "hebrew",   my_cs_approx},
+  {"CP866",          "cp866",    my_cs_exact},
+  {"eucCN",          "gb2312",   my_cs_exact},
+  {"euc-CN",         "gb2312",   my_cs_exact},
+  {"eucJP",          "ujis",     my_cs_exact},
+  {"euc-JP",         "ujis",     my_cs_exact},
+  {"eucKR",          "euckr",    my_cs_exact},
+  {"euc-KR",         "euckr",    my_cs_exact},
+#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
+  {"gb18030",        "gb18030",  my_cs_exact},
+#endif
+  {"gb2312",         "gb2312",   my_cs_exact},
+  {"gbk",            "gbk",      my_cs_exact},
+  {"georgianps",     "geostd8",  my_cs_exact},
+  {"georgian-ps",    "geostd8",  my_cs_exact},
+  {"IBM-1252",       "cp1252",   my_cs_exact},
+
+  {"iso88591",       "latin1",   my_cs_approx},
+  {"ISO_8859-1",     "latin1",   my_cs_approx},
+  {"ISO8859-1",      "latin1",   my_cs_approx},
+  {"ISO-8859-1",     "latin1",   my_cs_approx},
+
+  {"iso885913",      "latin7",   my_cs_exact},
+  {"ISO_8859-13",    "latin7",   my_cs_exact},
+  {"ISO8859-13",     "latin7",   my_cs_exact},
+  {"ISO-8859-13",    "latin7",   my_cs_exact},
+
+#ifdef UNCOMMENT_THIS_WHEN_WL_4579_IS_DONE
+  {"iso885915",      "latin9",   my_cs_exact},
+  {"ISO_8859-15",    "latin9",   my_cs_exact},
+  {"ISO8859-15",     "latin9",   my_cs_exact},
+  {"ISO-8859-15",    "latin9",   my_cs_exact},
+#endif
+
+  {"iso88592",       "latin2",   my_cs_exact},
+  {"ISO_8859-2",     "latin2",   my_cs_exact},
+  {"ISO8859-2",      "latin2",   my_cs_exact},
+  {"ISO-8859-2",     "latin2",   my_cs_exact},
+
+  {"iso88597",       "greek",    my_cs_exact},
+  {"ISO_8859-7",     "greek",    my_cs_exact},
+  {"ISO8859-7",      "greek",    my_cs_exact},
+  {"ISO-8859-7",     "greek",    my_cs_exact},
+
+  {"iso88598",       "hebrew",   my_cs_exact},
+  {"ISO_8859-8",     "hebrew",   my_cs_exact},
+  {"ISO8859-8",      "hebrew",   my_cs_exact},
+  {"ISO-8859-8",     "hebrew",   my_cs_exact},
+
+  {"iso88599",       "latin5",   my_cs_exact},
+  {"ISO_8859-9",     "latin5",   my_cs_exact},
+  {"ISO8859-9",      "latin5",   my_cs_exact},
+  {"ISO-8859-9",     "latin5",   my_cs_exact},
+
+  {"koi8r",          "koi8r",    my_cs_exact},
+  {"KOI8-R",         "koi8r",    my_cs_exact},
+  {"koi8u",          "koi8u",    my_cs_exact},
+  {"KOI8-U",         "koi8u",    my_cs_exact},
+
+  {"Shift_JIS",      "sjis",     my_cs_exact},
+  {"SJIS",           "sjis",     my_cs_exact},
+  {"shiftjisx0213",  "sjis",     my_cs_exact},
+  
+  {"tis620",         "tis620",   my_cs_exact},
+  {"tis-620",        "tis620",   my_cs_exact},
+
+  {"ujis",           "ujis",     my_cs_exact},
+
+  {"US-ASCII",       "ascii",    my_cs_exact},
+
+  {"utf8",           "utf8",     my_cs_exact},
+  {"utf-8",          "utf8",     my_cs_exact},
+#endif
+  {NULL,             NULL,       0}
+};
+
+
+static const char *
+my_os_charset_to_mysql_charset(const char *csname)
+{
+  const MY_CSET_OS_NAME *csp;
+  for (csp= charsets; csp->os_name; csp++)
+  {
+    if (!my_strcasecmp(&my_charset_latin1, csp->os_name, csname))
+    {
+      switch (csp->param)
+      {
+      case my_cs_exact:
+        return csp->my_name;
+
+      case my_cs_approx:
+        /*
+          Maybe we should print a warning eventually:
+          character set correspondence is not exact.
+        */
+        return csp->my_name;
+
+      default:
+        my_printf_error(ER_UNKNOWN_ERROR,
+                        "OS character set '%s'"
+                        " is not supported by MySQL client",
+                         MYF(0), csp->my_name);
+        goto def;
+      }
+    }
+  }
+
+  my_printf_error(ER_UNKNOWN_ERROR,
+                  "Unknown OS character set '%s'.",
+                  MYF(0), csname);
+
+def:
+  csname= MYSQL_DEFAULT_CHARSET_NAME;
+  my_printf_error(ER_UNKNOWN_ERROR,
+                  "Switching to the default character set '%s'.",
+                  MYF(0), csname);
+  return csname;
+}
+
+
+#ifndef __WIN__
+#include <stdlib.h> /* for getenv() */
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#endif /* __WIN__ */
+
+
+static int
+mysql_autodetect_character_set(MYSQL *mysql)
+{
+  const char *csname= MYSQL_DEFAULT_CHARSET_NAME;
+
+#ifdef __WIN__
+  char cpbuf[64];
+  {
+    my_snprintf(cpbuf, sizeof(cpbuf), "cp%d", (int) GetConsoleCP());
+    csname= my_os_charset_to_mysql_charset(cpbuf);
+  }
+#elif defined(HAVE_SETLOCALE) && defined(HAVE_NL_LANGINFO)
+  {
+    if (setlocale(LC_CTYPE, "") && (csname= nl_langinfo(CODESET)))
+      csname= my_os_charset_to_mysql_charset(csname);
+  }
+#endif
+
+  if (!(mysql->options.charset_name= my_strdup(csname, MYF(MY_WME))))
+    return 1;
+  return 0;
+}
+
+
+static void
+mysql_set_character_set_with_default_collation(MYSQL *mysql)
+{
+  const char *save= charsets_dir;
+  if (mysql->options.charset_dir)
+    charsets_dir=mysql->options.charset_dir;
+
+  if ((mysql->charset= get_charset_by_csname(mysql->options.charset_name,
+                                             MY_CS_PRIMARY, MYF(MY_WME))))
+  {
+    /* Try to set compiled default collation when it's possible. */
+    CHARSET_INFO *collation;
+    if ((collation= 
+         get_charset_by_name(MYSQL_DEFAULT_COLLATION_NAME, MYF(MY_WME))) &&
+         my_charset_same(mysql->charset, collation))
+    {
+      mysql->charset= collation;
+    }
+    else
+    {
+      /*
+        Default compiled collation not found, or is not applicable
+        to the requested character set.
+        Continue with the default collation of the character set.
+      */
+    }
+  }
+  charsets_dir= save;
+}
+
+
 C_MODE_START
 int mysql_init_character_set(MYSQL *mysql)
 {
-  const char *default_collation_name;
-  
   /* Set character set */
   if (!mysql->options.charset_name)
   {
-    default_collation_name= MYSQL_DEFAULT_COLLATION_NAME;
     if (!(mysql->options.charset_name= 
        my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
-    return 1;
-  }
-  else
-    default_collation_name= NULL;
-  
-  {
-    const char *save= charsets_dir;
-    if (mysql->options.charset_dir)
-      charsets_dir=mysql->options.charset_dir;
-    mysql->charset=get_charset_by_csname(mysql->options.charset_name,
-                                         MY_CS_PRIMARY, MYF(MY_WME));
-    if (mysql->charset && default_collation_name)
-    {
-      CHARSET_INFO *collation;
-      if ((collation= 
-           get_charset_by_name(default_collation_name, MYF(MY_WME))))
-      {
-        if (!my_charset_same(mysql->charset, collation))
-        {
-          my_printf_error(ER_UNKNOWN_ERROR, 
-                         "COLLATION %s is not valid for CHARACTER SET %s",
-                         MYF(0),
-                         default_collation_name, mysql->options.charset_name);
-          mysql->charset= NULL;
-        }
-        else
-        {
-          mysql->charset= collation;
-        }
-      }
-      else
-        mysql->charset= NULL;
-    }
-    charsets_dir= save;
+      return 1;
   }
+  else if (!strcmp(mysql->options.charset_name,
+                   MYSQL_AUTODETECT_CHARSET_NAME) &&
+            mysql_autodetect_character_set(mysql))
+    return 1;
+
+  mysql_set_character_set_with_default_collation(mysql);
 
   if (!mysql->charset)
   {

Attachment: [text/bzr-bundle] bzr/bar@mysql.com-20090602095017-kao377qs1btpl8dc.bundle
Thread
bzr commit into mysql-6.0 branch (bar:3066) WL#1349Alexander Barkov2 Jun