diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index f9a3ef487f0..da602551249 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -150,5 +150,5 @@ t1 CREATE TABLE `t1` ( KEY `b_29` (`b`), KEY `b_30` (`b`), KEY `b_31` (`b`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index e6598ca9ca4..132367ee4f6 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -139,7 +139,7 @@ t2 CREATE TABLE `t2` ( `inhalt` text character set latin1, KEY `tig` (`ticket`), FULLTEXT KEY `tix` (`inhalt`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 select * from t2 where MATCH inhalt AGAINST (NULL); ticket inhalt select * from t2 where MATCH inhalt AGAINST ('foobar'); diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index b75248b5d5a..e98687eec36 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -807,7 +807,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` char(20) character set latin1 default NULL, KEY `a` (`a`) -) TYPE=InnoDB +) TYPE=InnoDB CHARSET=latin1 drop table t1; create temporary table t1 (a int not null auto_increment, primary key(a)) type=innodb; insert into t1 values (NULL),(NULL),(NULL); diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 6de77f7bdaa..9349a5cdf82 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -174,7 +174,7 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL default '0', `b` char(20) character set latin1 default NULL, KEY `a` (`a`) -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) create table t4 (a int not null, b char(10), key(a)) type=MERGE UNION=(t1,t2); select * from t4; Can't open file: 't4.MRG'. (errno: 143) @@ -249,14 +249,14 @@ t3 CREATE TABLE `t3` ( `incr` int(11) NOT NULL default '0', `othr` int(11) NOT NULL default '0', PRIMARY KEY (`incr`) -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) alter table t3 drop primary key; show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `incr` int(11) NOT NULL default '0', `othr` int(11) NOT NULL default '0' -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) drop table t3,t2,t1; create table t1 (a int not null) type=merge; select * from t1; @@ -287,28 +287,28 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 show create table t4; Table Create Table t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) show create table t5; Table Create Table t5 CREATE TABLE `t5` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 INSERT_METHOD=FIRST UNION=(t1,t2) show create table t6; Table Create Table t6 CREATE TABLE `t6` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1,t2) insert into t1 values (1,1),(1,2),(1,3),(1,4); insert into t2 values (2,1),(2,2),(2,3),(2,4); select * from t3 order by b,a limit 3; @@ -373,7 +373,7 @@ t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM UNION=(t1,t2,t3) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2,t3) select * from t4 order by a,b; a b 1 1 @@ -399,7 +399,7 @@ t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2,t3) +) TYPE=MRG_MyISAM CHARSET=latin1 INSERT_METHOD=FIRST UNION=(t1,t2,t3) insert into t4 values (4,1),(4,2); select * from t1 order by a,b; a b diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 1f83bc61cdc..40103847a93 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -77,13 +77,13 @@ show create table t1; Table Create Table t1 CREATE TEMPORARY TABLE `t1` ( `a` int(11) NOT NULL default '0' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 alter table t1 rename t2; show create table t2; Table Create Table t2 CREATE TEMPORARY TABLE `t2` ( `a` int(11) NOT NULL default '0' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t2; create table t1 ( test_set set( 'val1', 'val2', 'val3' ) not null default '', @@ -96,7 +96,7 @@ t1 CREATE TABLE `t1` ( `test_set` set('val1','val2','val3') NOT NULL default '', `name` char(20) character set latin1 default 'O''Brien' COMMENT 'O''Brien as default', `c` int(11) NOT NULL default '0' COMMENT 'int column' -) TYPE=MyISAM COMMENT='it''s a table' +) TYPE=MyISAM CHARSET=latin1 COMMENT='it''s a table' show full columns from t1; Field Type Null Key Default Extra Privileges Comment test_set set('val1','val2','val3') select,insert,update,references @@ -109,7 +109,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', UNIQUE KEY `aa` (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a int not null, primary key (a)); show create table t1; @@ -117,7 +117,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; flush tables; show open tables; @@ -135,7 +135,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', `b` char(10) character set latin1 default NULL, KEY `b` (`b`) -) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test' +) TYPE=MyISAM CHARSET=latin1 MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test' alter table t1 MAX_ROWS=200 ROW_FORMAT=dynamic PACK_KEYS=0; show create table t1; Table Create Table @@ -143,7 +143,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', `b` varchar(10) character set latin1 default NULL, KEY `b` (`b`) -) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=200 AVG_ROW_LENGTH=10 PACK_KEYS=0 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='test' +) TYPE=MyISAM CHARSET=latin1 MIN_ROWS=10 MAX_ROWS=200 AVG_ROW_LENGTH=10 PACK_KEYS=0 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='test' ALTER TABLE t1 AVG_ROW_LENGTH=0 CHECKSUM=0 COMMENT="" MIN_ROWS=0 MAX_ROWS=0 PACK_KEYS=DEFAULT DELAY_KEY_WRITE=0 ROW_FORMAT=default; show create table t1; Table Create Table @@ -151,7 +151,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', `b` varchar(10) character set latin1 default NULL, KEY `b` (`b`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a decimal(9,2), b decimal (9,0), e double(9,2), f double(5,0), h float(3,2), i float(3,0)); show columns from t1; diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result index b5b5b774ee5..1eb595eb2a9 100644 --- a/mysql-test/r/symlink.result +++ b/mysql-test/r/symlink.result @@ -39,7 +39,7 @@ t9 CREATE TABLE `t9` ( `b` char(16) character set latin1 NOT NULL default '', `c` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 alter table t9 rename t8, add column d int not null; alter table t8 rename t7; rename table t7 to t9; @@ -61,5 +61,5 @@ t9 CREATE TABLE `t9` ( `c` int(11) NOT NULL default '0', `d` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop database test_mysqltest; diff --git a/mysql-test/r/type_enum.result b/mysql-test/r/type_enum.result index ee3bd077798..c0f0be246c9 100644 --- a/mysql-test/r/type_enum.result +++ b/mysql-test/r/type_enum.result @@ -1627,12 +1627,12 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` enum('','a','b') NOT NULL default '' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a enum (' ','a','b ') not null default 'b '); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` enum('','a','b') NOT NULL default 'b' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; diff --git a/mysql-test/r/type_set.result b/mysql-test/r/type_set.result index 858bf5f3ba2..38c7b66dcb8 100644 --- a/mysql-test/r/type_set.result +++ b/mysql-test/r/type_set.result @@ -3,12 +3,12 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` set('','a','b') NOT NULL default '' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a set (' ','a','b ') not null default 'b '); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` set('','a','b') NOT NULL default 'b' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 01894bfb7ad..7d6163fafc3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -67,6 +67,7 @@ inline Item *or_or_concat(Item* A, Item* B) interval_type interval; LEX_USER *lex_user; enum Item_udftype udf_type; + CHARSET_INFO *charset; } %{ @@ -600,6 +601,11 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type user grant_user +%type + charset_name + charset_name_or_default + opt_db_default_character_set + %type query verb_clause create change select do drop insert replace insert2 insert_values update delete truncate rename @@ -758,6 +764,7 @@ master_def: create: CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident { + THD *thd=current_thd; LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_TABLE; if (!add_table_to_list($5, @@ -771,7 +778,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; - lex->create_info.table_charset=NULL; + lex->create_info.table_charset=thd->db_charset?thd->db_charset:default_charset_info; } create2 @@ -793,13 +800,13 @@ create: lex->key_list.push_back(new Key($2,$4.str, $5, lex->col_list)); lex->col_list.empty(); } - | CREATE DATABASE opt_if_not_exists ident default_charset + | CREATE DATABASE opt_if_not_exists ident opt_db_default_character_set { LEX *lex=Lex; lex->sql_command=SQLCOM_CREATE_DB; lex->name=$4.str; lex->create_info.options=$3; - lex->create_info.table_charset=lex->charset; + lex->create_info.table_charset=$5; } | CREATE udf_func_type UDF_SYM ident { @@ -886,9 +893,9 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } - | CHARSET EQ charset_or_nocharset + | CHARSET EQ charset_name_or_default { - Lex->create_info.table_charset=Lex->charset; + Lex->create_info.table_charset= $3; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} @@ -996,7 +1003,7 @@ type: $$=FIELD_TYPE_TINY; } | BOOL_SYM { Lex->length=(char*) "1"; $$=FIELD_TYPE_TINY; } - | char '(' NUM ')' opt_binary { Lex->length=$3.str; + | char '(' NUM ')' opt_binary { Lex->length=$3.str; $$=FIELD_TYPE_STRING; } | char opt_binary { Lex->length=(char*) "1"; $$=FIELD_TYPE_STRING; } @@ -1125,28 +1132,28 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | COMMENT_SYM text_literal { Lex->comment= $2; }; -charset: +charset_name: ident { - if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) + if (!($$=get_charset_by_name($1.str,MYF(0)))) { net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; -charset_or_nocharset: - charset - | DEFAULT {Lex->charset=NULL; } +charset_name_or_default: + charset_name { $$=$1; } + | DEFAULT { $$=NULL; } ; + +opt_db_default_character_set: + /* empty */ { $$=default_charset_info; } + | DEFAULT CHAR_SYM SET charset_name_or_default { $$=$4; }; opt_binary: - /* empty */ { Lex->charset=NULL; } - | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } - | CHAR_SYM SET charset {/* charset is already in Lex->charset */} ; - -default_charset: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET charset_or_nocharset ; + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } + | CHAR_SYM SET charset_name { Lex->charset=$3; } ; references: REFERENCES table_ident @@ -1247,6 +1254,7 @@ string_list: alter: ALTER opt_ignore TABLE_SYM table_ident { + THD *thd=current_thd; LEX *lex=Lex; lex->sql_command = SQLCOM_ALTER_TABLE; lex->name=0; @@ -1264,20 +1272,20 @@ alter: lex->select->db=lex->name=0; bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; + lex->create_info.table_charset=thd->db_charset?thd->db_charset:default_charset_info; lex->create_info.row_type= ROW_TYPE_NOT_USED; - lex->create_info.table_charset=NULL; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } alter_list; - | ALTER DATABASE ident default_charset + | ALTER DATABASE ident opt_db_default_character_set { LEX *lex=Lex; lex->sql_command=SQLCOM_ALTER_DB; lex->name=$3.str; - lex->create_info.table_charset=lex->charset; - } + lex->create_info.table_charset=$4; + }; alter_list: @@ -1660,15 +1668,8 @@ expr_expr: { $$= new Item_date_add_interval($1,$4,$5,0); } | expr '-' INTERVAL_SYM expr interval { $$= new Item_date_add_interval($1,$4,$5,1); } - | expr COLLATE_SYM ident - { - if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); - YYABORT; - } - $$= new Item_func_set_collation($1,Lex->charset); - }; + | expr COLLATE_SYM charset_name + { $$= new Item_func_set_collation($1,$3); }; /* expressions that begin with 'expr' that do NOT follow IN_SYM */ no_in_expr: @@ -1783,12 +1784,10 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } - | CONVERT_SYM '(' expr USING charset ')' - { $$= new Item_func_conv_charset($3,Lex->charset); } + | CONVERT_SYM '(' expr USING charset_name ')' + { $$= new Item_func_conv_charset($3,$5); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new Item_func_conv_charset3($3,$7,$5); - } + { $$= new Item_func_conv_charset3($3,$7,$5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')'