diff options
author | unknown <bar@bar.mysql.r18.ru> | 2003-05-21 17:44:12 +0500 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2003-05-21 17:44:12 +0500 |
commit | 4637832fa19b2866929c1e5cb7c9dd0a40db15c9 (patch) | |
tree | c1d41d9ae86450c3c93a4424253c8553ffcec322 | |
parent | 01add721927cf92ec3368cb56d685777aacbfe42 (diff) | |
download | mariadb-git-4637832fa19b2866929c1e5cb7c9dd0a40db15c9.tar.gz |
Some SHOW VARIABLES have been renamed:
collation_client -> character_set_client
collation_results -> character_set_results
character_set -> character_set_server
SET NAMES now doesn't start client->server conversion
SET CHARACTER SET now starts both client->server and server->client conversion
-rw-r--r-- | mysql-test/r/ctype_collate.result | 74 | ||||
-rw-r--r-- | mysql-test/r/variables.result | 6 | ||||
-rw-r--r-- | mysql-test/t/ctype_collate.test | 46 | ||||
-rw-r--r-- | mysql-test/t/variables.test | 4 | ||||
-rw-r--r-- | mysys/charset.c | 4 | ||||
-rw-r--r-- | sql/mysqld.cc | 8 | ||||
-rw-r--r-- | sql/protocol.cc | 14 | ||||
-rw-r--r-- | sql/set_var.cc | 82 | ||||
-rw-r--r-- | sql/set_var.h | 39 | ||||
-rw-r--r-- | sql/sql_class.h | 6 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 18 |
11 files changed, 133 insertions, 168 deletions
diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result index 6e09cff7fd8..e06651da30e 100644 --- a/mysql-test/r/ctype_collate.result +++ b/mysql-test/r/ctype_collate.result @@ -4,7 +4,7 @@ CREATE TABLE t1 ( latin1_f CHAR(32) CHARACTER SET latin1 NOT NULL ); CREATE TABLE t2 ( -latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r NOT NULL +latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r_general_ci NOT NULL ); COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' INSERT INTO t1 (latin1_f) VALUES (_latin1'A'); @@ -63,7 +63,7 @@ z Ä ä ß -SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1; +SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_swedish_ci; latin1_f A a @@ -179,9 +179,9 @@ z ä å ü -SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r; -COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1' -SELECT latin1_f COLLATE latin1 AS latin1_f_as FROM t1 ORDER BY latin1_f_as; +SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r_general_ci; +COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' +SELECT latin1_f COLLATE latin1_swedish_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; latin1_f_as A a @@ -297,8 +297,8 @@ z ä å ü -SELECT latin1_f COLLATE koi8r AS latin1_f_as FROM t1 ORDER BY latin1_f_as; -COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1' +SELECT latin1_f COLLATE koi8r_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; +COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f; latin1_f count(*) A 2 @@ -314,7 +314,7 @@ Z 2 Å 2 Ä 2 ß 1 -SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1; +SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_swedish_ci; latin1_f count(*) A 2 AD 2 @@ -389,8 +389,8 @@ z 1 ä 1 å 1 ü 1 -SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r; -COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1' +SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r_general_ci; +COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' SELECT DISTINCT latin1_f FROM t1; latin1_f A @@ -406,8 +406,8 @@ UE SS ß Z -SELECT DISTINCT latin1_f COLLATE latin1 FROM t1; -latin1_f COLLATE latin1 +SELECT DISTINCT latin1_f COLLATE latin1_swedish_ci FROM t1; +latin1_f COLLATE latin1_swedish_ci A AD AE @@ -511,64 +511,18 @@ SHOW FIELDS FROM t1; Field Type Collation Null Key Default Extra latin1_f char(32) latin1_bin YES NULL SET CHARACTER SET 'latin1'; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client latin1_swedish_ci -SET CHARACTER SET latin1; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client latin1_swedish_ci -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client latin1_swedish_ci -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -charset('a') collation('a') coercibility('a') 'a'='A' -latin1 latin1_swedish_ci 3 1 -SET CHARACTER SET latin1 COLLATE latin1_bin; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client latin1_bin -SET CHARACTER SET LATIN1 COLLATE Latin1_Bin; -SHOW VARIABLES LIKE 'collation_client'; +SHOW VARIABLES LIKE 'character_set_client'; Variable_name Value -collation_client latin1_bin -SET CHARACTER SET 'latin1' COLLATE 'latin1_bin'; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client latin1_bin +character_set_client latin1 SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' latin1 latin1_swedish_ci 3 1 SET CHARACTER SET koi8r; SHOW VARIABLES LIKE 'collation_client'; Variable_name Value -collation_client koi8r_general_ci -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -charset('a') collation('a') coercibility('a') 'a'='A' -latin1 latin1_swedish_ci 3 1 -SET CHARACTER SET koi8r COLLATE koi8r_bin; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client koi8r_bin -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -charset('a') collation('a') coercibility('a') 'a'='A' -latin1 latin1_swedish_ci 3 1 -SET CHARACTER SET koi8r COLLATE DEFAULT; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client koi8r_general_ci SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' latin1 latin1_swedish_ci 3 1 -SET CHARACTER SET DEFAULT; -SHOW VARIABLES LIKE 'collation_client'; -Variable_name Value -collation_client latin1_swedish_ci -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -charset('a') collation('a') coercibility('a') 'a'='A' -latin1 latin1_swedish_ci 3 1 -SET CHARACTER SET latin1 COLLATE koi8r; -COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' SET CHARACTER SET 'DEFAULT'; Unknown character set: 'DEFAULT' DROP TABLE t1; diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index 5e613418ea1..f1afcedac83 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -156,9 +156,9 @@ show variables like 'net_buffer_length'; Variable_name Value net_buffer_length 1048576 set character set cp1251_koi8; -show variables like "collation_client"; +show variables like "character_set_client"; Variable_name Value -collation_client cp1251_bulgarian_ci +character_set_client cp1251 select @@timestamp>0; @@timestamp>0 1 @@ -185,7 +185,7 @@ set SESSION query_cache_size=10000; Variable 'query_cache_size' is a GLOBAL variable and should be set with SET GLOBAL set GLOBAL table_type=DEFAULT; Variable 'table_type' doesn't have a default value -set collation_client=UNKNOWN_CHARACTER_SET; +set character_set_client=UNKNOWN_CHARACTER_SET; Unknown character set: 'UNKNOWN_CHARACTER_SET' set global autocommit=1; Variable 'autocommit' is a LOCAL variable and can't be used with SET GLOBAL diff --git a/mysql-test/t/ctype_collate.test b/mysql-test/t/ctype_collate.test index 0b32c3ccf88..0cf531156a9 100644 --- a/mysql-test/t/ctype_collate.test +++ b/mysql-test/t/ctype_collate.test @@ -9,7 +9,7 @@ CREATE TABLE t1 ( --error 1251 CREATE TABLE t2 ( - latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r NOT NULL + latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r_general_ci NOT NULL ); @@ -57,39 +57,39 @@ INSERT INTO t1 (latin1_f) VALUES (_latin1'z'); -- ORDER BY SELECT latin1_f FROM t1 ORDER BY latin1_f; -SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1; +SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_swedish_ci; SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_german2_ci; SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_general_ci; SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE latin1_bin; --error 1251 -SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r; +SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r_general_ci; --SELECT latin1_f COLLATE koi8r FROM t1 ; -- AS + ORDER BY -SELECT latin1_f COLLATE latin1 AS latin1_f_as FROM t1 ORDER BY latin1_f_as; +SELECT latin1_f COLLATE latin1_swedish_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; SELECT latin1_f COLLATE latin1_german2_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; SELECT latin1_f COLLATE latin1_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; SELECT latin1_f COLLATE latin1_bin AS latin1_f_as FROM t1 ORDER BY latin1_f_as; --error 1251 -SELECT latin1_f COLLATE koi8r AS latin1_f_as FROM t1 ORDER BY latin1_f_as; +SELECT latin1_f COLLATE koi8r_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; -- GROUP BY SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f; -SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1; +SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_swedish_ci; SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_german2_ci; SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_general_ci; SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE latin1_bin; --error 1251 -SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r; +SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r_general_ci; -- DISTINCT SELECT DISTINCT latin1_f FROM t1; -SELECT DISTINCT latin1_f COLLATE latin1 FROM t1; +SELECT DISTINCT latin1_f COLLATE latin1_swedish_ci FROM t1; SELECT DISTINCT latin1_f COLLATE latin1_german2_ci FROM t1; SELECT DISTINCT latin1_f COLLATE latin1_general_ci FROM t1; SELECT DISTINCT latin1_f COLLATE latin1_bin FROM t1; @@ -127,35 +127,19 @@ ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin; SHOW CREATE TABLE t1; SHOW FIELDS FROM t1; +# +# Check SET CHARACTER SET +# + SET CHARACTER SET 'latin1'; -SHOW VARIABLES LIKE 'collation_client'; -SET CHARACTER SET latin1; -SHOW VARIABLES LIKE 'collation_client'; -SHOW VARIABLES LIKE 'collation_client'; -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -SET CHARACTER SET latin1 COLLATE latin1_bin; -SHOW VARIABLES LIKE 'collation_client'; -SET CHARACTER SET LATIN1 COLLATE Latin1_Bin; -SHOW VARIABLES LIKE 'collation_client'; -SET CHARACTER SET 'latin1' COLLATE 'latin1_bin'; -SHOW VARIABLES LIKE 'collation_client'; +SHOW VARIABLES LIKE 'character_set_client'; SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; + SET CHARACTER SET koi8r; SHOW VARIABLES LIKE 'collation_client'; SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -SET CHARACTER SET koi8r COLLATE koi8r_bin; -SHOW VARIABLES LIKE 'collation_client'; -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -SET CHARACTER SET koi8r COLLATE DEFAULT; -SHOW VARIABLES LIKE 'collation_client'; -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; -SET CHARACTER SET DEFAULT; -SHOW VARIABLES LIKE 'collation_client'; -SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; ---error 1251 -SET CHARACTER SET latin1 COLLATE koi8r; + --error 1115 SET CHARACTER SET 'DEFAULT'; - DROP TABLE t1; diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index d1c8df64be2..32e7db12136 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -92,7 +92,7 @@ set net_buffer_length=2000000000; show variables like 'net_buffer_length'; set character set cp1251_koi8; -show variables like "collation_client"; +show variables like "character_set_client"; select @@timestamp>0; set @@rand_seed1=10000000,@@rand_seed2=1000000; @@ -119,7 +119,7 @@ set SESSION query_cache_size=10000; --error 1230 set GLOBAL table_type=DEFAULT; --error 1115 -set collation_client=UNKNOWN_CHARACTER_SET; +set character_set_client=UNKNOWN_CHARACTER_SET; --error 1228 set global autocommit=1; --error 1228 diff --git a/mysys/charset.c b/mysys/charset.c index 2d9500e4b0d..d685104abac 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -548,9 +548,7 @@ uint get_charset_number(const char *charset_name) for (cs= all_charsets; cs < all_charsets+255; ++cs) { if ( cs[0] && cs[0]->name && - (!my_strcasecmp(&my_charset_latin1, cs[0]->name, charset_name) || - (!my_strcasecmp(&my_charset_latin1, cs[0]->csname, charset_name) && - (cs[0]->state & MY_CS_PRIMARY)))) + !my_strcasecmp(&my_charset_latin1, cs[0]->name, charset_name)) return cs[0]->number; } return 0; /* this mimics find_type() */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b8b57f4e2f3..1036e4d2835 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2106,8 +2106,8 @@ static int init_common_variables(const char *conf_file_name, int argc, } default_charset_info= default_collation; } - global_system_variables.collation_results= default_charset_info; - global_system_variables.collation_client= default_charset_info; + global_system_variables.character_set_results= NULL; + global_system_variables.character_set_client= default_charset_info; global_system_variables.collation_connection= default_charset_info; if (use_temp_pool && bitmap_init(&temp_pool,1024,1)) @@ -4610,8 +4610,8 @@ static void set_options(void) sizeof(mysql_real_data_home)-1); /* Set default values for some variables */ - global_system_variables.collation_results= default_charset_info; - global_system_variables.collation_client= default_charset_info; + global_system_variables.character_set_results= NULL; + global_system_variables.character_set_client= default_charset_info; global_system_variables.collation_connection= default_charset_info; global_system_variables.table_type= DB_TYPE_MYISAM; global_system_variables.tx_isolation= ISO_REPEATABLE_READ; diff --git a/sql/protocol.cc b/sql/protocol.cc index d00ecb5dbc4..09531f0922c 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -709,7 +709,7 @@ bool Protocol_simple::store(const char *from, uint length, field_types[field_pos] <= MYSQL_TYPE_GEOMETRY)); field_pos++; #endif - if (!my_charset_same(fromcs, tocs) && + if (tocs && !my_charset_same(fromcs, tocs) && (fromcs != &my_charset_bin) && (tocs != &my_charset_bin)) { @@ -724,7 +724,7 @@ bool Protocol_simple::store(const char *from, uint length, bool Protocol_simple::store(const char *from, uint length, CHARSET_INFO *fromcs) { - CHARSET_INFO *tocs= this->thd->variables.collation_results; + CHARSET_INFO *tocs= this->thd->variables.character_set_results; #ifndef DEBUG_OFF DBUG_ASSERT(field_types == 0 || field_types[field_pos] == MYSQL_TYPE_DECIMAL || @@ -732,7 +732,7 @@ bool Protocol_simple::store(const char *from, uint length, field_types[field_pos] <= MYSQL_TYPE_GEOMETRY)); field_pos++; #endif - if (!my_charset_same(fromcs, tocs) && + if (tocs && !my_charset_same(fromcs, tocs) && (fromcs != &my_charset_bin) && (tocs != &my_charset_bin)) { @@ -831,12 +831,14 @@ bool Protocol_simple::store(Field *field) #endif char buff[MAX_FIELD_WIDTH]; String str(buff,sizeof(buff), &my_charset_bin); + CHARSET_INFO *tocs= this->thd->variables.character_set_results; + field->val_str(&str,&str); - if (!my_charset_same(field->charset(), this->thd->charset()) && + if (tocs && !my_charset_same(field->charset(), tocs) && (field->charset() != &my_charset_bin) && - (this->thd->charset() != &my_charset_bin)) + (tocs != &my_charset_bin)) { - convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset()); + convert.copy(str.ptr(), str.length(), str.charset(), tocs); return net_store_data(convert.ptr(), convert.length()); } else diff --git a/sql/set_var.cc b/sql/set_var.cc index c9b8584e672..a102991a0f2 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -101,7 +101,7 @@ sys_var_long_ptr sys_binlog_cache_size("binlog_cache_size", &binlog_cache_size); sys_var_thd_ulong sys_bulk_insert_buff_size("bulk_insert_buffer_size", &SV::bulk_insert_buff_size); -sys_var_str sys_charset("character_set", +sys_var_str sys_charset("character_set_server", sys_check_charset, sys_update_charset, sys_set_default_charset); @@ -109,9 +109,9 @@ sys_var_str sys_charset_system("character_set_system", sys_check_charset, sys_update_charset, sys_set_default_charset); -sys_var_collation_client sys_collation_client("collation_client"); +sys_var_character_set_client sys_character_set_client("character_set_client"); +sys_var_character_set_results sys_character_set_results("character_set_results"); sys_var_collation_connection sys_collation_connection("collation_connection"); -sys_var_collation_results sys_collation_results("collation_results"); sys_var_bool_ptr sys_concurrent_insert("concurrent_insert", &myisam_concurrent_insert); sys_var_long_ptr sys_connect_timeout("connect_timeout", @@ -353,9 +353,9 @@ sys_var *sys_variables[]= &sys_binlog_cache_size, &sys_buffer_results, &sys_bulk_insert_buff_size, - &sys_collation_client, + &sys_character_set_client, + &sys_character_set_results, &sys_collation_connection, - &sys_collation_results, &sys_concurrent_insert, &sys_connect_timeout, &sys_default_week_format, @@ -469,9 +469,9 @@ struct show_var_st init_vars[]= { {sys_bulk_insert_buff_size.name,(char*) &sys_bulk_insert_buff_size,SHOW_SYS}, {sys_charset.name, (char*) &sys_charset, SHOW_SYS}, {sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS}, - {sys_collation_client.name, (char*) &sys_collation_client, SHOW_SYS}, + {sys_character_set_client.name,(char*) &sys_character_set_client,SHOW_SYS}, + {sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS}, {sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS}, - {sys_collation_results.name, (char*) &sys_collation_results, SHOW_SYS}, {sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS}, {sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS}, {"datadir", mysql_real_data_home, SHOW_CHAR}, @@ -1207,7 +1207,7 @@ CHARSET_INFO *get_old_charset_by_name(const char *name) for (c= old_conv; c->old_name; c++) { if (!my_strcasecmp(&my_charset_latin1,name,c->old_name)) - return get_charset_by_name(c->new_name,MYF(0)); + return get_charset_by_csname(c->new_name,MY_CS_PRIMARY,MYF(0)); } return NULL; } @@ -1221,7 +1221,25 @@ bool sys_var_collation::check(THD *thd, set_var *var) if (!(res=var->value->val_str(&str))) res= &empty_string; - if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0))) && + if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0)))) + { + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr()); + return 1; + } + var->save_result.charset= tmp; // Save for update + return 0; +} + +bool sys_var_character_set::check(THD *thd, set_var *var) +{ + CHARSET_INFO *tmp; + char buff[80]; + String str(buff,sizeof(buff), system_charset_info), *res; + + if (!(res=var->value->val_str(&str))) + res= &empty_string; + + if (!(tmp=get_charset_by_csname(res->c_ptr(),MY_CS_PRIMARY,MYF(0))) && !(tmp=get_old_charset_by_name(res->c_ptr()))) { my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr()); @@ -1231,29 +1249,29 @@ bool sys_var_collation::check(THD *thd, set_var *var) return 0; } -bool sys_var_collation_client::update(THD *thd, set_var *var) +bool sys_var_character_set_client::update(THD *thd, set_var *var) { if (var->type == OPT_GLOBAL) - global_system_variables.collation_client= var->save_result.charset; + global_system_variables.character_set_client= var->save_result.charset; else - thd->variables.collation_client= var->save_result.charset; + thd->variables.character_set_client= var->save_result.charset; return 0; } -byte *sys_var_collation_client::value_ptr(THD *thd, enum_var_type type) +byte *sys_var_character_set_client::value_ptr(THD *thd, enum_var_type type) { CHARSET_INFO *cs= ((type == OPT_GLOBAL) ? - global_system_variables.collation_client : - thd->variables.collation_client); - return cs ? (byte*) cs->name : (byte*) ""; + global_system_variables.character_set_client : + thd->variables.character_set_client); + return cs ? (byte*) cs->csname : (byte*) "NULL"; } -void sys_var_collation_client::set_default(THD *thd, enum_var_type type) +void sys_var_character_set_client::set_default(THD *thd, enum_var_type type) { if (type == OPT_GLOBAL) - global_system_variables.collation_client= default_charset_info; + global_system_variables.character_set_client= default_charset_info; else - thd->variables.collation_client= global_system_variables.collation_client; + thd->variables.character_set_client= global_system_variables.character_set_client; } @@ -1271,7 +1289,7 @@ byte *sys_var_collation_connection::value_ptr(THD *thd, enum_var_type type) CHARSET_INFO *cs= ((type == OPT_GLOBAL) ? global_system_variables.collation_connection : thd->variables.collation_connection); - return cs ? (byte*) cs->name : (byte*) ""; + return cs ? (byte*) cs->name : (byte*) "NULL"; } void sys_var_collation_connection::set_default(THD *thd, enum_var_type type) @@ -1282,29 +1300,29 @@ void sys_var_collation_connection::set_default(THD *thd, enum_var_type type) thd->variables.collation_connection= global_system_variables.collation_connection; } -bool sys_var_collation_results::update(THD *thd, set_var *var) +bool sys_var_character_set_results::update(THD *thd, set_var *var) { if (var->type == OPT_GLOBAL) - global_system_variables.collation_results= var->save_result.charset; + global_system_variables.character_set_results= var->save_result.charset; else - thd->variables.collation_results= var->save_result.charset; + thd->variables.character_set_results= var->save_result.charset; return 0; } -byte *sys_var_collation_results::value_ptr(THD *thd, enum_var_type type) +byte *sys_var_character_set_results::value_ptr(THD *thd, enum_var_type type) { CHARSET_INFO *cs= ((type == OPT_GLOBAL) ? - global_system_variables.collation_results : - thd->variables.collation_results); - return cs ? (byte*) cs->name : (byte*) ""; + global_system_variables.character_set_results : + thd->variables.character_set_results); + return cs ? (byte*) cs->csname : (byte*) "NULL"; } -void sys_var_collation_results::set_default(THD *thd, enum_var_type type) +void sys_var_character_set_results::set_default(THD *thd, enum_var_type type) { if (type == OPT_GLOBAL) - global_system_variables.collation_results= default_charset_info; + global_system_variables.character_set_results= NULL; else - thd->variables.collation_results= global_system_variables.collation_results; + thd->variables.character_set_results= global_system_variables.character_set_results; } @@ -1319,9 +1337,9 @@ int set_var_collation_client::check(THD *thd) int set_var_collation_client::update(THD *thd) { - thd->variables.collation_client= collation_client; + thd->variables.character_set_client= character_set_client; + thd->variables.character_set_results= character_set_results; thd->variables.collation_connection= collation_connection; - thd->variables.collation_results= collation_results; thd->protocol_simple.init(thd); thd->protocol_prep.init(thd); return 0; diff --git a/sql/set_var.h b/sql/set_var.h index 03cc3b30a03..d381843df0d 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -420,34 +420,49 @@ SHOW_TYPE type() { return SHOW_CHAR; } virtual void set_default(THD *thd, enum_var_type type)= 0; }; -class sys_var_collation_client :public sys_var_collation +class sys_var_character_set :public sys_var_thd { public: - sys_var_collation_client(const char *name_arg) :sys_var_collation(name_arg) {} + sys_var_character_set(const char *name_arg) :sys_var_thd(name_arg) {} + bool check(THD *thd, set_var *var); +SHOW_TYPE type() { return SHOW_CHAR; } + bool check_update_type(Item_result type) + { + return type != STRING_RESULT; /* Only accept strings */ + } + bool check_default(enum_var_type type) { return 0; } + virtual void set_default(THD *thd, enum_var_type type)= 0; +}; + +class sys_var_character_set_client :public sys_var_character_set +{ +public: + sys_var_character_set_client(const char *name_arg) : + sys_var_character_set(name_arg) {} bool update(THD *thd, set_var *var); void set_default(THD *thd, enum_var_type type); byte *value_ptr(THD *thd, enum_var_type type); }; -class sys_var_collation_connection :public sys_var_collation +class sys_var_character_set_results :public sys_var_character_set { public: - sys_var_collation_connection(const char *name_arg) :sys_var_collation(name_arg) {} + sys_var_character_set_results(const char *name_arg) : + sys_var_character_set(name_arg) {} bool update(THD *thd, set_var *var); void set_default(THD *thd, enum_var_type type); byte *value_ptr(THD *thd, enum_var_type type); }; -class sys_var_collation_results :public sys_var_collation +class sys_var_collation_connection :public sys_var_collation { public: - sys_var_collation_results(const char *name_arg) :sys_var_collation(name_arg) {} + sys_var_collation_connection(const char *name_arg) :sys_var_collation(name_arg) {} bool update(THD *thd, set_var *var); void set_default(THD *thd, enum_var_type type); byte *value_ptr(THD *thd, enum_var_type type); }; - /* Variable that you can only read from */ class sys_var_readonly: public sys_var @@ -555,16 +570,16 @@ public: class set_var_collation_client: public set_var_base { - CHARSET_INFO *collation_client; + CHARSET_INFO *character_set_client; + CHARSET_INFO *character_set_results; CHARSET_INFO *collation_connection; - CHARSET_INFO *collation_results; public: set_var_collation_client(CHARSET_INFO *client_coll_arg, CHARSET_INFO *connection_coll_arg, CHARSET_INFO *result_coll_arg) - :collation_client(client_coll_arg), - collation_connection(connection_coll_arg), - collation_results(result_coll_arg) + :character_set_client(client_coll_arg), + character_set_results(result_coll_arg), + collation_connection(connection_coll_arg) {} int check(THD *thd); int update(THD *thd); diff --git a/sql/sql_class.h b/sql/sql_class.h index 36427eae43e..08043e7e626 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -385,9 +385,9 @@ struct system_variables my_bool low_priority_updates; my_bool new_mode; - CHARSET_INFO *collation_client; + CHARSET_INFO *character_set_client; + CHARSET_INFO *character_set_results; CHARSET_INFO *collation_connection; - CHARSET_INFO *collation_results; }; void free_tmp_table(THD *thd, TABLE *entry); @@ -670,7 +670,7 @@ public: net.report_error= 1; DBUG_PRINT("error",("Fatal error set")); } - inline CHARSET_INFO *charset() { return variables.collation_client; } + inline CHARSET_INFO *charset() { return variables.character_set_client; } }; /* diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e3b2c738949..4de0e2f8c13 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1411,7 +1411,7 @@ opt_binary: | BINARY { Lex->charset=&my_charset_bin; } | UNICODE_SYM { - if (!(Lex->charset=get_charset_by_name("ucs2",MYF(0)))) + if (!(Lex->charset=get_charset_by_csname("ucs2",MY_CS_PRIMARY,MYF(0)))) { net_printf(YYTHD,ER_UNKNOWN_CHARACTER_SET,"ucs2"); YYABORT; @@ -4420,31 +4420,25 @@ option_value: find_sys_var("tx_isolation"), new Item_int((int32) $4))); } - | charset old_or_new_charset_name_or_default opt_collate + | charset old_or_new_charset_name_or_default { THD *thd= YYTHD; LEX *lex= Lex; - $2= $2 ? $2: global_system_variables.collation_client; - $3= $3 ? $3 : $2; - if (!my_charset_same($2,$3)) - { - net_printf(thd,ER_COLLATION_CHARSET_MISMATCH,$3->name,$2->csname); - YYABORT; - } - lex->var_list.push_back(new set_var_collation_client($3,thd->db_charset,$3)); + $2= $2 ? $2: global_system_variables.character_set_client; + lex->var_list.push_back(new set_var_collation_client($2,thd->db_charset,$2)); } | NAMES_SYM charset_name_or_default opt_collate { THD *thd= YYTHD; LEX *lex= Lex; - $2= $2 ? $2 : global_system_variables.collation_client; + $2= $2 ? $2 : global_system_variables.character_set_client; $3= $3 ? $3 : $2; if (!my_charset_same($2,$3)) { net_printf(thd,ER_COLLATION_CHARSET_MISMATCH,$3->name,$2->csname); YYABORT; } - lex->var_list.push_back(new set_var_collation_client($3,$3,$3)); + lex->var_list.push_back(new set_var_collation_client($3,$3,NULL)); } | PASSWORD equal text_or_password { |