summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorbar@bar.mysql.r18.ru <>2003-04-08 14:38:17 +0500
committerbar@bar.mysql.r18.ru <>2003-04-08 14:38:17 +0500
commit8cf9ada9771b6047df9dbd6c11b854a27c55cadf (patch)
tree61ea115f17b75a76465238e1d7d684f336c0f646 /sql
parent2cdc21d24aee9bf895b95d71a060ea128bb731d7 (diff)
downloadmariadb-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.cc6
-rw-r--r--sql/protocol.cc5
-rw-r--r--sql/set_var.cc48
-rw-r--r--sql/set_var.h23
-rw-r--r--sql/sql_class.h6
-rw-r--r--sql/sql_yacc.yy49
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
{