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