From dba73e1c869b8e11205895c742d4095dba2ea9dd Mon Sep 17 00:00:00 2001
From: "bar@bar.intranet.mysql.r18.ru" <>
Date: Tue, 30 Mar 2004 21:33:45 +0500
Subject: [PATCH] More different syntaxes for (1) modifying the default
 charaset/collation and for (2) converting the columns:

1.  ALTER TABLE t1 [DEFAULT] CHARACTER SET xxx [COLLATE yyy]
2.  ALTER TABLE t1 CONVERT TO CHARACTER SET xxx [COLLATE yyy]
---
 mysql-test/r/alter_table.result   | 10 +++++-----
 mysql-test/r/ctype_collate.result |  4 ++--
 mysql-test/t/alter_table.test     |  2 +-
 sql/lex.h                         |  2 +-
 sql/sql_yacc.yy                   | 33 +++++++++++++++++++------------
 5 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result
index 9b90742762e..5166e3bf8cb 100644
--- a/mysql-test/r/alter_table.result
+++ b/mysql-test/r/alter_table.result
@@ -360,7 +360,7 @@ Table	Create Table
 t1	CREATE TABLE `t1` (
   `a` char(10) character set koi8r default NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
-alter table t1 CHARACTER SET latin1;
+alter table t1 CONVERT TO CHARACTER SET latin1, DEFAULT CHARACTER SET latin1;
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
@@ -379,15 +379,15 @@ show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
   `myblob` longblob,
-  `mytext` longtext character set latin1 collate latin1_general_cs
-) ENGINE=MyISAM DEFAULT CHARSET=latin1
+  `mytext` longtext collate latin1_general_cs
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs
 alter table t1 character set latin2;
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
   `myblob` longblob,
-  `mytext` longtext character set latin2
-) ENGINE=MyISAM DEFAULT CHARSET=latin1
+  `mytext` longtext character set latin1 collate latin1_general_cs
+) ENGINE=MyISAM DEFAULT CHARSET=latin2
 drop table t1;
 CREATE TABLE t1 (
 Host varchar(16) binary NOT NULL default '',
diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result
index c837d676b6e..8f4ddedbfcf 100644
--- a/mysql-test/r/ctype_collate.result
+++ b/mysql-test/r/ctype_collate.result
@@ -503,8 +503,8 @@ ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin;
 SHOW CREATE TABLE t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
-  `latin1_f` char(32) character set latin1 collate latin1_bin default NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1
+  `latin1_f` char(32) collate latin1_bin default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin
 SHOW FIELDS FROM  t1;
 Field	Type	Null	Key	Default	Extra
 latin1_f	char(32)	YES		NULL	
diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test
index 9235496b45c..658796e4a85 100644
--- a/mysql-test/t/alter_table.test
+++ b/mysql-test/t/alter_table.test
@@ -214,7 +214,7 @@ select a,hex(a) from t1;
 show create table t1;
 alter table t1 DEFAULT CHARACTER SET latin1;
 show create table t1;
-alter table t1 CHARACTER SET latin1;
+alter table t1 CONVERT TO CHARACTER SET latin1, DEFAULT CHARACTER SET latin1;
 show create table t1;
 alter table t1 DEFAULT CHARACTER SET cp1251;
 show create table t1;
diff --git a/sql/lex.h b/sql/lex.h
index 3b32d2bcd3b..ceef140b5f7 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -115,6 +115,7 @@ static SYMBOL symbols[] = {
   { "COMPRESSED",	SYM(COMPRESSED_SYM)},
   { "CONCURRENT",	SYM(CONCURRENT)},
   { "CONSTRAINT",	SYM(CONSTRAINT)},
+  { "CONVERT",		SYM(CONVERT_SYM)},
   { "CREATE",		SYM(CREATE)},
   { "CROSS",		SYM(CROSS)},
   { "CUBE",		SYM(CUBE_SYM)},
@@ -493,7 +494,6 @@ static SYMBOL sql_functions[] = {
   { "CONNECTION_ID",	F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_connection_id)},
   { "CONTAINS",		F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_contains)},
   { "CONV",		F_SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_conv)},
-  { "CONVERT",		SYM(CONVERT_SYM)},
   { "COUNT",		SYM(COUNT_SYM)},
   { "COS",		F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cos)},
   { "COT",		F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cot)},
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 90dc209f0bc..ea2c7efb607 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1108,26 +1108,16 @@ create_table_option:
 	    table_list->next=0;
 	    lex->create_info.used_fields|= HA_CREATE_USED_UNION;
 	  }
-	| DEFAULT charset opt_equal charset_name_or_default
+	| opt_default charset opt_equal charset_name_or_default
 	  {
 	    Lex->create_info.default_table_charset= $4;
 	    Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
 	  }
-	| charset opt_equal charset_name_or_default
+	| opt_default COLLATE_SYM opt_equal collation_name_or_default
 	  {
-	    Lex->create_info.table_charset= $3;
-	    Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET;
-	  }
-	| DEFAULT COLLATE_SYM opt_equal collation_name_or_default
-	  {
-	    Lex->create_info.table_charset= $4;
+	    Lex->create_info.default_table_charset= $4;
 	    Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
 	  }
-	| COLLATE_SYM opt_equal collation_name_or_default
-	  {
-	    Lex->create_info.table_charset= $3;
-	    Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET;
-	  }
 	| INSERT_METHOD opt_equal merge_insert_types   { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;}
 	| DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys
 	  { Lex->create_info.data_file_name= $4.str; }
@@ -1793,6 +1783,23 @@ alter_list_item:
 	    lex->select_lex.db=$3->db.str;
 	    lex->name= $3->table.str;
 	  }
+	| CONVERT_SYM TO_SYM charset charset_name_or_default opt_collate
+	  {
+	    if (!$4)
+	    {
+	      THD *thd= YYTHD;
+	      $4= thd->variables.collation_database;
+	    }
+	    $5= $5 ? $5 : $4;
+	    if (!my_charset_same($4,$5))
+	    {
+	      net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH,
+			 $5->name,$4->csname);
+	      YYABORT;
+	    }
+	    Lex->create_info.table_charset= $5;
+	    Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET;  
+	  }
         | create_table_options_space_separated { Lex->simple_alter=0; }
 	| order_clause         { Lex->simple_alter=0; };
 
-- 
2.30.9