diff options
author | bar@bar.mysql.r18.ru <> | 2003-04-08 14:38:17 +0500 |
---|---|---|
committer | bar@bar.mysql.r18.ru <> | 2003-04-08 14:38:17 +0500 |
commit | 8cf9ada9771b6047df9dbd6c11b854a27c55cadf (patch) | |
tree | 61ea115f17b75a76465238e1d7d684f336c0f646 /sql | |
parent | 2cdc21d24aee9bf895b95d71a060ea128bb731d7 (diff) | |
download | mariadb-git-8cf9ada9771b6047df9dbd6c11b854a27c55cadf.tar.gz |
Use of CHARSWT_INFO *result_collation
instead of bool convert_result_charset
SET CHARACTER SET inststead of SET NAMES in tests
Diffstat (limited to 'sql')
-rw-r--r-- | sql/mysqld.cc | 6 | ||||
-rw-r--r-- | sql/protocol.cc | 5 | ||||
-rw-r--r-- | sql/set_var.cc | 48 | ||||
-rw-r--r-- | sql/set_var.h | 23 | ||||
-rw-r--r-- | sql/sql_class.h | 6 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 49 |
6 files changed, 89 insertions, 48 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a6338630568..7aa065f2177 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2087,6 +2087,10 @@ static int init_common_variables(const char *conf_file_name, int argc, #endif if (!(default_charset_info= get_charset_by_name(sys_charset.value, MYF(MY_WME)))) return 1; + global_system_variables.result_collation= default_charset_info; + global_system_variables.client_collation= default_charset_info; + global_system_variables.literal_collation= default_charset_info; + charsets_list= list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG)); if (use_temp_pool && bitmap_init(&temp_pool,1024,1)) @@ -4566,7 +4570,7 @@ static void set_options(void) sizeof(mysql_real_data_home)-1); /* Set default values for some variables */ - global_system_variables.convert_result_charset= TRUE; + global_system_variables.result_collation= default_charset_info; global_system_variables.client_collation= default_charset_info; global_system_variables.literal_collation= default_charset_info; global_system_variables.table_type= DB_TYPE_MYISAM; diff --git a/sql/protocol.cc b/sql/protocol.cc index 195fec80ed0..99b815a7840 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -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->result_charset(fromcs); + CHARSET_INFO *tocs= this->thd->variables.result_collation; #ifndef DEBUG_OFF DBUG_ASSERT(field_types == 0 || field_types[field_pos] == MYSQL_TYPE_DECIMAL || @@ -834,8 +834,7 @@ bool Protocol_simple::store(Field *field) field->val_str(&str,&str); if (!my_charset_same(field->charset(), this->thd->charset()) && (field->charset() != &my_charset_bin) && - (this->thd->charset() != &my_charset_bin) && - (this->thd->variables.convert_result_charset)) + (this->thd->charset() != &my_charset_bin)) { convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset()); return net_store_data(convert.ptr(), convert.length()); diff --git a/sql/set_var.cc b/sql/set_var.cc index b5094e6403a..8c224a745c6 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -110,8 +110,6 @@ sys_var_bool_ptr sys_concurrent_insert("concurrent_insert", &myisam_concurrent_insert); sys_var_long_ptr sys_connect_timeout("connect_timeout", &connect_timeout); -sys_var_thd_bool sys_convert_result_charset("convert_result_charset", - &SV::convert_result_charset); sys_var_enum sys_delay_key_write("delay_key_write", &delay_key_write_options, &delay_key_write_typelib, @@ -202,6 +200,7 @@ sys_var_thd_ulong sys_read_buff_size("read_buffer_size", &SV::read_buff_size); sys_var_thd_ulong sys_read_rnd_buff_size("read_rnd_buffer_size", &SV::read_rnd_buff_size); +sys_var_result_collation sys_result_collation("result_collation"); sys_var_long_ptr sys_rpl_recovery_rank("rpl_recovery_rank", &rpl_recovery_rank); sys_var_long_ptr sys_query_cache_size("query_cache_size", @@ -347,7 +346,6 @@ sys_var *sys_variables[]= &sys_client_collation, &sys_concurrent_insert, &sys_connect_timeout, - &sys_convert_result_charset, &sys_default_week_format, &sys_delay_key_write, &sys_delayed_insert_limit, @@ -408,6 +406,7 @@ sys_var *sys_variables[]= &sys_rand_seed2, &sys_read_buff_size, &sys_read_rnd_buff_size, + &sys_result_collation, &sys_rpl_recovery_rank, &sys_safe_updates, &sys_select_limit, @@ -459,7 +458,6 @@ struct show_var_st init_vars[]= { {sys_client_collation.name, (char*) &sys_client_collation, SHOW_SYS}, {sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS}, {sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS}, - {sys_convert_result_charset.name, (char*) &sys_convert_result_charset, SHOW_SYS}, {"datadir", mysql_real_data_home, SHOW_CHAR}, {"default_week_format", (char*) &sys_default_week_format, SHOW_SYS}, {sys_delay_key_write.name, (char*) &sys_delay_key_write, SHOW_SYS}, @@ -563,6 +561,7 @@ struct show_var_st init_vars[]= { {sys_pseudo_thread_id.name, (char*) &sys_pseudo_thread_id, SHOW_SYS}, {sys_read_buff_size.name, (char*) &sys_read_buff_size, SHOW_SYS}, {sys_read_rnd_buff_size.name,(char*) &sys_read_rnd_buff_size, SHOW_SYS}, + {sys_result_collation.name, (char*) &sys_result_collation, SHOW_SYS}, {sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS}, #ifdef HAVE_QUERY_CACHE {sys_query_cache_limit.name,(char*) &sys_query_cache_limit, SHOW_SYS}, @@ -1267,6 +1266,31 @@ void sys_var_literal_collation::set_default(THD *thd, enum_var_type type) thd->variables.literal_collation= global_system_variables.literal_collation; } +bool sys_var_result_collation::update(THD *thd, set_var *var) +{ + if (var->type == OPT_GLOBAL) + global_system_variables.result_collation= var->save_result.charset; + else + thd->variables.result_collation= var->save_result.charset; + return 0; +} + +byte *sys_var_result_collation::value_ptr(THD *thd, enum_var_type type) +{ + CHARSET_INFO *cs= ((type == OPT_GLOBAL) ? + global_system_variables.result_collation : + thd->variables.result_collation); + return cs ? (byte*) cs->name : (byte*) ""; +} + +void sys_var_result_collation::set_default(THD *thd, enum_var_type type) +{ + if (type == OPT_GLOBAL) + global_system_variables.result_collation= default_charset_info; + else + thd->variables.result_collation= global_system_variables.result_collation; +} + /***************************************************************************** Functions to handle SET NAMES and SET CHARACTER SET @@ -1274,24 +1298,14 @@ void sys_var_literal_collation::set_default(THD *thd, enum_var_type type) int set_var_client_collation::check(THD *thd) { - client_charset= client_charset ? - client_charset : global_system_variables.client_collation; - client_collation= client_collation ? client_collation : client_charset; - if (!my_charset_same(client_charset, client_collation)) - { - my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), - client_collation->name, client_charset->csname); - return -1; - } return 0; } int set_var_client_collation::update(THD *thd) { - thd->variables.client_collation= client_collation; - thd->variables.literal_collation= convert_result_charset ? - thd->db_charset: client_collation; - thd->variables.convert_result_charset= convert_result_charset; + thd->variables.client_collation= client_collation; + thd->variables.literal_collation= literal_collation; + thd->variables.result_collation= result_collation; 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 51f59981e14..69e6bc05a67 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -438,6 +438,15 @@ public: byte *value_ptr(THD *thd, enum_var_type type); }; +class sys_var_result_collation :public sys_var_collation +{ +public: + sys_var_result_collation(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 */ @@ -546,14 +555,16 @@ public: class set_var_client_collation: public set_var_base { - CHARSET_INFO *client_charset; CHARSET_INFO *client_collation; - my_bool convert_result_charset; + CHARSET_INFO *literal_collation; + CHARSET_INFO *result_collation; public: - set_var_client_collation(CHARSET_INFO *cset_arg, - CHARSET_INFO *coll_arg ,my_bool conv_arg) - :client_charset(cset_arg), client_collation(coll_arg), - convert_result_charset(conv_arg) + set_var_client_collation(CHARSET_INFO *client_coll_arg, + CHARSET_INFO *literal_coll_arg, + CHARSET_INFO *result_coll_arg) + :client_collation(client_coll_arg), + literal_collation(literal_coll_arg), + result_collation(result_coll_arg) {} int check(THD *thd); int update(THD *thd); diff --git a/sql/sql_class.h b/sql/sql_class.h index 1d4dafb997e..5e316267e1e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -378,10 +378,10 @@ struct system_variables my_bool log_warnings; my_bool low_priority_updates; my_bool new_mode; - my_bool convert_result_charset; - + CHARSET_INFO *client_collation; CHARSET_INFO *literal_collation; + CHARSET_INFO *result_collation; }; void free_tmp_table(THD *thd, TABLE *entry); @@ -663,8 +663,6 @@ public: DBUG_PRINT("error",("Fatal error set")); } inline CHARSET_INFO *charset() { return variables.client_collation; } - inline CHARSET_INFO *result_charset(CHARSET_INFO *cs) - { return variables.convert_result_charset ? charset() : cs; } }; /* diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index bb6e445bfc2..189a28aea51 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -563,7 +563,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type <lex_str> IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident ident_or_text - UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_db + UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_literal NCHAR_STRING %type <lex_str_ptr> @@ -2279,9 +2279,9 @@ simple_expr: Lex->uncacheable();; } | ENCRYPT '(' expr ',' expr ')' { $$= new Item_func_encrypt($3,$5); } - | DECODE_SYM '(' expr ',' TEXT_STRING_db ')' + | DECODE_SYM '(' expr ',' TEXT_STRING_literal ')' { $$= new Item_func_decode($3,$5.str); } - | ENCODE_SYM '(' expr ',' TEXT_STRING_db ')' + | ENCODE_SYM '(' expr ',' TEXT_STRING_literal ')' { $$= new Item_func_encode($3,$5.str); } | DES_DECRYPT_SYM '(' expr ')' { $$= new Item_func_des_decrypt($3); } @@ -2910,7 +2910,7 @@ having_clause: ; opt_escape: - ESCAPE_SYM TEXT_STRING_db { $$= $2.str; } + ESCAPE_SYM TEXT_STRING_literal { $$= $2.str; } | /* empty */ { $$= (char*) "\\"; }; @@ -3921,24 +3921,22 @@ opt_ignore_lines: /* Common definitions */ text_literal: - TEXT_STRING_db + TEXT_STRING_literal { THD *thd= YYTHD; - CHARSET_INFO *cs= my_charset_same(thd->charset(),thd->db_charset) ? - thd->charset() : thd->db_charset; - $$ = new Item_string($1.str,$1.length,cs); + $$ = new Item_string($1.str,$1.length,thd->variables.literal_collation); } | NCHAR_STRING { $$= new Item_string($1.str,$1.length,national_charset_info); } | UNDERSCORE_CHARSET TEXT_STRING { $$ = new Item_string($2.str,$2.length,Lex->charset); } - | text_literal TEXT_STRING_db + | text_literal TEXT_STRING_literal { ((Item_string*) $1)->append($2.str,$2.length); } ; text_string: - TEXT_STRING_db - { $$= new String($1.str,$1.length,YYTHD->db_charset); } + TEXT_STRING_literal + { $$= new String($1.str,$1.length,YYTHD->variables.literal_collation); } | HEX_NUM { Item *tmp = new Item_varbinary($1.str,$1.length); @@ -4104,18 +4102,18 @@ TEXT_STRING_sys: } ; -TEXT_STRING_db: +TEXT_STRING_literal: TEXT_STRING { THD *thd= YYTHD; - if (my_charset_same(thd->charset(),thd->db_charset)) + if (my_charset_same(thd->charset(),thd->variables.literal_collation)) { $$=$1; } else { String ident; - ident.copy($1.str,$1.length,thd->charset(),thd->db_charset); + ident.copy($1.str,$1.length,thd->charset(),thd->variables.literal_collation); $$.str= thd->strmake(ident.ptr(),ident.length()); $$.length= ident.length(); } @@ -4403,15 +4401,32 @@ option_value: find_sys_var("tx_isolation"), new Item_int((int32) $4))); } - | charset old_or_new_charset_name_or_default + | charset old_or_new_charset_name_or_default opt_collate { + THD *thd= YYTHD; LEX *lex= Lex; - lex->var_list.push_back(new set_var_client_collation($2,NULL,1)); + $2= $2 ? $2: global_system_variables.client_collation; + $3= $3 ? $3 : $2; + if (!my_charset_same($2,$3)) + { + net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH, + $3->name,$2->csname); + YYABORT; + } + lex->var_list.push_back(new set_var_client_collation($3,thd->db_charset,$3)); } | NAMES_SYM charset_name_or_default opt_collate { LEX *lex= Lex; - lex->var_list.push_back(new set_var_client_collation($2,$3,0)); + $2= $2 ? $2 : global_system_variables.client_collation; + $3= $3 ? $3 : $2; + if (!my_charset_same($2,$3)) + { + net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH, + $3->name,$2->csname); + YYABORT; + } + lex->var_list.push_back(new set_var_client_collation($3,$3,$3)); } | PASSWORD equal text_or_password { |