From d09d2b85fe9c1d1ca5ced68d3494d6f6bb2af2e6 Mon Sep 17 00:00:00 2001 From: "bar@bar.mysql.r18.ru" <> Date: Fri, 7 Mar 2003 11:54:26 +0400 Subject: [PATCH] New syntax to change client collation: SET COLLATION latin1 SET COLLATION 'latin1' SET COLLATION DEFAULT --- mysql-test/r/ctype_collate.result | 39 +++++++++++++++++++++++++++++++ mysql-test/t/ctype_collate.test | 15 ++++++++++++ sql/sql_yacc.yy | 30 +++++++++++++++++++++++- 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result index 4e48a94bb57..70f3eb50d00 100644 --- a/mysql-test/r/ctype_collate.result +++ b/mysql-test/r/ctype_collate.result @@ -511,16 +511,55 @@ SHOW FIELDS FROM t1; Field Type Collation Null Key Default Extra latin1_f char(32) latin1_bin YES NULL SET NAMES 'latin1'; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation latin1 SET NAMES latin1; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation latin1 +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation latin1 SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' latin1 latin1 2 1 SET NAMES latin1 COLLATE latin1_bin; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation latin1_bin SET NAMES 'latin1' COLLATE 'latin1_bin'; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation latin1_bin SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' latin1 latin1_bin 2 0 +SET NAMES koi8r; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation koi8r +SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; +charset('a') collation('a') coercibility('a') 'a'='A' +koi8r koi8r 2 1 +SET COLLATION koi8r_bin; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation koi8r_bin +SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; +charset('a') collation('a') coercibility('a') 'a'='A' +koi8r koi8r_bin 2 0 +SET COLLATION DEFAULT; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation koi8r +SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; +charset('a') collation('a') coercibility('a') 'a'='A' +koi8r koi8r 2 1 SET NAMES DEFAULT; +SHOW VARIABLES LIKE 'client_collation'; +Variable_name Value +client_collation latin1 SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' latin1 latin1 2 1 diff --git a/mysql-test/t/ctype_collate.test b/mysql-test/t/ctype_collate.test index 3dc6d3a2dfe..7fd3229e1a4 100644 --- a/mysql-test/t/ctype_collate.test +++ b/mysql-test/t/ctype_collate.test @@ -128,12 +128,27 @@ SHOW CREATE TABLE t1; SHOW FIELDS FROM t1; SET NAMES 'latin1'; +SHOW VARIABLES LIKE 'client_collation'; SET NAMES latin1; +SHOW VARIABLES LIKE 'client_collation'; +SHOW VARIABLES LIKE 'client_collation'; SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; SET NAMES latin1 COLLATE latin1_bin; +SHOW VARIABLES LIKE 'client_collation'; SET NAMES 'latin1' COLLATE 'latin1_bin'; +SHOW VARIABLES LIKE 'client_collation'; +SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; +SET NAMES koi8r; +SHOW VARIABLES LIKE 'client_collation'; +SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; +SET COLLATION koi8r_bin; +SHOW VARIABLES LIKE 'client_collation'; +SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; +SET COLLATION DEFAULT; +SHOW VARIABLES LIKE 'client_collation'; SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; SET NAMES DEFAULT; +SHOW VARIABLES LIKE 'client_collation'; SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; --error 1251 SET NAMES latin1 COLLATE koi8r; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e093a822303..0ee351ec970 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -4224,7 +4224,6 @@ option_value: { THD* thd= YYTHD; LEX *lex= &thd->lex; - system_variables vars= thd->variables; CHARSET_INFO *cs= $2 ? $2 : thd->db_charset; CHARSET_INFO *cl= $3 ? $3 : cs; @@ -4241,6 +4240,35 @@ option_value: find_sys_var("client_collation"), csname)); } + | COLLATION_SYM collation_name_or_default + { + THD* thd= YYTHD; + LEX *lex= &thd->lex; + system_variables *vars= &thd->variables; + CHARSET_INFO *cs= vars->thd_charset; + CHARSET_INFO *cl= $2; + + if (!cl) + { + if (!(cl=get_charset_by_csname(cs->csname,MY_CS_PRIMARY,MYF(0)))) + { + net_printf(YYTHD,ER_UNKNOWN_CHARACTER_SET,"DEFAULT"); + YYABORT; + } + } + else if ((cl != cs) && strcmp(cs->csname,cl->csname)) + { + net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH, + cl->name,cs->csname); + YYABORT; + } + Item_string *csname= new Item_string(cl->name, + strlen(cl->name), + &my_charset_latin1); + lex->var_list.push_back(new set_var(lex->option_type, + find_sys_var("client_collation"), + csname)); + } | PASSWORD equal text_or_password { THD *thd=YYTHD;