diff options
author | unknown <bar@bar.mysql.r18.ru> | 2003-03-21 15:18:52 +0400 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2003-03-21 15:18:52 +0400 |
commit | c51c782c55a5f4328d2ad08823f84adc28abad81 (patch) | |
tree | 5280bb31238ad54a66021579da84445dab7fbe68 /sql | |
parent | c2df88fa2284bc70f135bb20e509ff1bc3cfdecf (diff) | |
download | mariadb-git-c51c782c55a5f4328d2ad08823f84adc28abad81.tar.gz |
New variable to turn off automatic charset conversion of query results
Some speed improvements
Diffstat (limited to 'sql')
-rw-r--r-- | sql/mysqld.cc | 1 | ||||
-rw-r--r-- | sql/protocol.cc | 26 | ||||
-rw-r--r-- | sql/protocol.h | 2 | ||||
-rw-r--r-- | sql/set_var.cc | 5 | ||||
-rw-r--r-- | sql/sql_class.h | 1 |
5 files changed, 23 insertions, 12 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 2298ae7b9ea..8414fcb97c3 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4551,6 +4551,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.table_type= DB_TYPE_MYISAM; global_system_variables.tx_isolation= ISO_REPEATABLE_READ; global_system_variables.select_limit= (ulonglong) HA_POS_ERROR; diff --git a/sql/protocol.cc b/sql/protocol.cc index af8f966a4b6..2d53d545066 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -703,11 +703,13 @@ bool Protocol_simple::store(const char *from, uint length, CHARSET_INFO *cs) field_types[field_pos] <= MYSQL_TYPE_GEOMETRY)); field_pos++; #endif - if (cs != this->thd->charset()) + if (!my_charset_same(cs, this->thd->charset()) && + (cs != &my_charset_bin) && + (this->thd->charset() != &my_charset_bin) && + (this->thd->variables.convert_result_charset)) { - String tmp; - tmp.copy(from, length, cs, this->thd->charset()); - return net_store_data(tmp.ptr(), tmp.length()); + convert.copy(from, length, cs, this->thd->charset()); + return net_store_data(convert.ptr(), convert.length()); } else return net_store_data(from, length); @@ -800,16 +802,18 @@ bool Protocol_simple::store(Field *field) field_pos++; #endif char buff[MAX_FIELD_WIDTH]; - String tmp1(buff,sizeof(buff), &my_charset_bin); - field->val_str(&tmp1,&tmp1); - if (field->charset() != this->thd->charset()) + String str(buff,sizeof(buff), &my_charset_bin); + 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)) { - String tmp; - tmp.copy(tmp1.ptr(), tmp1.length(), tmp1.charset(), this->thd->charset()); - return net_store_data(tmp.ptr(), tmp.length()); + convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset()); + return net_store_data(convert.ptr(), convert.length()); } else - return net_store_data(tmp1.ptr(), tmp1.length()); + return net_store_data(str.ptr(), str.length()); } diff --git a/sql/protocol.h b/sql/protocol.h index 71ad5c1302b..418814a9623 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -30,6 +30,7 @@ class Protocol protected: THD *thd; String *packet; + String convert; uint field_pos; #ifndef DEBUG_OFF enum enum_field_types *field_types; @@ -44,6 +45,7 @@ protected: public: Protocol() {} Protocol(THD *thd) { init(thd); } + virtual ~Protocol() {} void init(THD* thd); bool send_fields(List<Item> *list, uint flag); bool send_records_num(List<Item> *list, ulonglong records); diff --git a/sql/set_var.cc b/sql/set_var.cc index cb49ad603d9..c4a4819689c 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -109,6 +109,8 @@ 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, @@ -337,6 +339,7 @@ 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, @@ -445,6 +448,7 @@ 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}, @@ -1455,7 +1459,6 @@ void set_var_init() (*var)->option_limits= find_option(my_long_options, (*var)->name); hash_insert(&system_variable_hash, (byte*) *var); } - /* Special cases Needed because MySQL can't find the limits for a variable it it has diff --git a/sql/sql_class.h b/sql/sql_class.h index b832bbffac8..8284a2b1ea3 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -374,6 +374,7 @@ struct system_variables my_bool log_warnings; my_bool low_priority_updates; my_bool new_mode; + my_bool convert_result_charset; CHARSET_INFO *thd_charset; }; |