diff options
author | unknown <Sinisa@sinisa.nasamreza.org> | 2002-12-24 14:02:42 +0200 |
---|---|---|
committer | unknown <Sinisa@sinisa.nasamreza.org> | 2002-12-24 14:02:42 +0200 |
commit | f46decc78025403ee118f1d30f6bed45bb854afb (patch) | |
tree | 09a4fad0fb0076a17d9ede22eebdfba0f4323b00 | |
parent | 7a74837e00be97bfaaf2940f06c636da7eed73a8 (diff) | |
parent | b861d68321b6242bc2579a4458aa137efd2e42c2 (diff) | |
download | mariadb-git-f46decc78025403ee118f1d30f6bed45bb854afb.tar.gz |
Merge sinisa@work.mysql.com:/home/bk/mysql-4.1
into sinisa.nasamreza.org:/mnt/work/mysql-4.1
mysql-test/r/subselect.result:
Auto merged
mysql-test/t/subselect.test:
Auto merged
sql/item.cc:
Auto merged
sql/sql_parse.cc:
Auto merged
35 files changed, 239 insertions, 149 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 15f884302a1..c8834a9997e 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -21,6 +21,7 @@ heikki@donna.mysql.fi heikki@hundin.mysql.fi heikki@rescue. heikki@work.mysql.com +hf@deer.mysql.r18.ru hf@genie.(none) jani@dsl-jkl1657.dial.inet.fi jani@hynda.(none) diff --git a/include/mysql_com.h b/include/mysql_com.h index d5cd722a05a..d4d0b63dc78 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -57,6 +57,7 @@ enum enum_server_command #define BLOB_FLAG 16 /* Field is a blob */ #define UNSIGNED_FLAG 32 /* Field is unsigned */ #define ZEROFILL_FLAG 64 /* Field is zerofill */ +#define BINARY_FLAG 128 /* Field is binary */ /* The following are only sent to new clients */ #define ENUM_FLAG 256 /* field is an enum */ @@ -292,11 +293,11 @@ int get_password_length(my_bool force_old_scramble); char get_password_version(const char* password); void create_random_string(int length,struct rand_struct *rand_st,char* target); my_bool validate_password(const char* password, const char* message, - ulong* salt); + unsigned long* salt); void password_hash_stage1(char *to, const char *password); void password_hash_stage2(char *to,const char *salt); void password_crypt(const char* from,char* to, const char* password,int length); -void get_hash_and_password(ulong* salt, unsigned char pversion,char* hash, +void get_hash_and_password(unsigned long* salt, unsigned char pversion,char* hash, unsigned char* bin_password); void get_salt_from_password(unsigned long *res,const char *password); void create_key_from_old_password(const char* password,char* key); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 87093059d92..d0fc83bbeb3 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -947,7 +947,7 @@ static int add_init_command(struct st_mysql_options *options, const char *cmd) } if (!(tmp= my_strdup(cmd,MYF(MY_WME))) || - insert_dynamic(options->init_commands, (byte*)&tmp)) + insert_dynamic(options->init_commands, (gptr)&tmp)) { my_free(tmp, MYF(MY_ALLOW_ZERO_PTR)); return 1; @@ -2623,8 +2623,13 @@ mysql_close(MYSQL *mysql) my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR)); if (mysql->options.init_commands) { - delete_dynamic(mysql->options.init_commands); - my_free((char*)mysql->options.init_commands,MYF(MY_WME)); + DYNAMIC_ARRAY *init_commands= mysql->options.init_commands; + char **ptr= (char**)init_commands->buffer; + char **end= ptr + init_commands->elements; + for (; ptr<end; ptr++) + my_free(*ptr,MYF(MY_WME)); + delete_dynamic(init_commands); + my_free((char*)init_commands,MYF(MY_WME)); } #ifdef HAVE_OPENSSL mysql_ssl_free(mysql); diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 114a7ebf921..de8efd9d2f4 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -463,7 +463,7 @@ static int add_init_command(struct st_mysql_options *options, const char *cmd) } if (!(tmp= my_strdup(cmd,MYF(MY_WME))) || - insert_dynamic(options->init_commands, (byte*)&tmp)) + insert_dynamic(options->init_commands, (gptr)&tmp)) { my_free(tmp, MYF(MY_ALLOW_ZERO_PTR)); return 1; @@ -1152,8 +1152,13 @@ mysql_close(MYSQL *mysql) my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR)); if (mysql->options.init_commands) { - delete_dynamic(mysql->options.init_commands); - my_free((char*)mysql->options.init_commands,MYF(MY_WME)); + DYNAMIC_ARRAY *init_commands= mysql->options.init_commands; + char **ptr= (char**)init_commands->buffer; + char **end= ptr + init_commands->elements; + for (; ptr<end; ptr++) + my_free(*ptr,MYF(MY_WME)); + delete_dynamic(init_commands); + my_free((char*)init_commands,MYF(MY_WME)); } /* Clear pointers for better safety */ mysql->host_info=mysql->user=mysql->passwd=mysql->db=0; diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index 45fe91c096d..a483145e33a 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -336,6 +336,11 @@ CYR CAPIT SOFT SIGN ø Ь CYR CAPIT E ü Ð CYR CAPIT YU à Ю CYR CAPIT YA ñ Я +ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL; +UPDATE t1 SET bin_f=koi8_ru_f; +SELECT COUNT(DISTINCT bin_f),COUNT(DISTINCT koi8_ru_f),COUNT(DISTINCT utf8_f) FROM t1; +COUNT(DISTINCT bin_f) COUNT(DISTINCT koi8_ru_f) COUNT(DISTINCT utf8_f) +116 58 57 SELECT koi8_ru_f,MIN(comment) FROM t1 GROUP BY 1; koi8_ru_f MIN(comment) a LAT CAPIT A diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index c928538ed9c..330bf5c8e52 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -32,7 +32,7 @@ a 1 SELECT 1 FROM (SELECT (SELECT a) b) c; Unknown column 'a' in 'field list' -SELECT * FROM (SELECT 1 as id) b WHERE id IN (SELECT * FROM (SELECT 1 as id) c ORDER BY id LIMIT 1); +SELECT * FROM (SELECT 1 as id) b WHERE id IN (SELECT * FROM (SELECT 1 as id) c ORDER BY id); id 1 SELECT * FROM (SELECT 1) a WHERE 1 IN (SELECT 1,1); @@ -705,3 +705,9 @@ select 10.5 > ANY (SELECT * from t); 10.5 > ANY (SELECT * from t) 1 drop table t; +create table t (a float); +select 10.5 IN (SELECT * from t LIMIT 1); +This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' +select 10.5 IN (SELECT * from t LIMIT 1 UNION SELECT 1.5); +This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' +drop table t; diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test index 7854bc38d6f..b02684b2fb8 100644 --- a/mysql-test/t/ctype_many.test +++ b/mysql-test/t/ctype_many.test @@ -137,9 +137,12 @@ SELECT CONVERT(koi8_ru_f USING utf8),MIN(comment),COUNT(*) FROM t1 GROUP BY 1; ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); - SELECT * FROM t1; +ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL; +UPDATE t1 SET bin_f=koi8_ru_f; +SELECT COUNT(DISTINCT bin_f),COUNT(DISTINCT koi8_ru_f),COUNT(DISTINCT utf8_f) FROM t1; + SELECT koi8_ru_f,MIN(comment) FROM t1 GROUP BY 1; SELECT utf8_f,MIN(comment) FROM t1 GROUP BY 1; SELECT DISTINCT koi8_ru_f FROM t1; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index ccf66ae23a9..a4b5e168b12 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -15,7 +15,7 @@ SELECT (SELECT 1), a; SELECT 1 as a FROM (SELECT 1) as b HAVING (SELECT a)=1; -- error 1054 SELECT 1 FROM (SELECT (SELECT a) b) c; -SELECT * FROM (SELECT 1 as id) b WHERE id IN (SELECT * FROM (SELECT 1 as id) c ORDER BY id LIMIT 1); +SELECT * FROM (SELECT 1 as id) b WHERE id IN (SELECT * FROM (SELECT 1 as id) c ORDER BY id); -- error 1239 SELECT * FROM (SELECT 1) a WHERE 1 IN (SELECT 1,1); SELECT 1 IN (SELECT 1); @@ -409,3 +409,11 @@ select 10.5 > ALL (SELECT * from t); select 1.5 > ANY (SELECT * from t); select 10.5 > ANY (SELECT * from t); drop table t; + +#LIMIT is not supported now +create table t (a float); +-- error 1235 +select 10.5 IN (SELECT * from t LIMIT 1); +-- error 1235 +select 10.5 IN (SELECT * from t LIMIT 1 UNION SELECT 1.5); +drop table t;
\ No newline at end of file diff --git a/sql/Makefile.am b/sql/Makefile.am index 245e4c5d258..c4b641f714b 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -52,7 +52,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ field.h handler.h \ ha_isammrg.h ha_isam.h ha_myisammrg.h\ ha_heap.h ha_myisam.h ha_berkeley.h ha_innodb.h \ - opt_range.h opt_ft.h \ + opt_range.h opt_ft.h protocol.h \ sql_select.h structs.h table.h sql_udf.h hash_filo.h\ lex.h lex_symbol.h sql_acl.h sql_crypt.h \ log_event.h mini_client.h sql_repl.h slave.h \ diff --git a/sql/field.cc b/sql/field.cc index 6402942dbdf..9acf2e14829 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -855,12 +855,13 @@ String *Field_decimal::val_str(String *val_buffer __attribute__((unused)), String *val_ptr) { char *str; + CHARSET_INFO *cs=current_thd->variables.thd_charset; for (str=ptr ; *str == ' ' ; str++) ; uint tmp_length=(uint) (str-ptr); if (field_length < tmp_length) // Error in data val_ptr->length(0); else - val_ptr->set((const char*) str,field_length-tmp_length,default_charset_info); + val_ptr->copy((const char*) str,field_length-tmp_length,my_charset_latin1,cs); return val_ptr; } @@ -4275,7 +4276,7 @@ uint Field_varstring::max_packed_col_length(uint max_length) return (max_length > 255 ? 2 : 1)+max_length; } -void Field_varstring::get_key_image(char *buff, uint length, imagetype type) +void Field_varstring::get_key_image(char *buff, uint length, CHARSET_INFO *cs,imagetype type) { length-= HA_KEY_BLOB_LENGTH; uint f_length=uint2korr(ptr); @@ -4289,10 +4290,10 @@ void Field_varstring::get_key_image(char *buff, uint length, imagetype type) #endif } -void Field_varstring::set_key_image(char *buff,uint length) +void Field_varstring::set_key_image(char *buff,uint length, CHARSET_INFO *cs) { length=uint2korr(buff); // Real length is here - (void) Field_varstring::store(buff+2, length, default_charset_info); + (void) Field_varstring::store(buff+2, length, cs); } @@ -4541,7 +4542,7 @@ int Field_blob::cmp_binary(const char *a_ptr, const char *b_ptr, /* The following is used only when comparing a key */ -void Field_blob::get_key_image(char *buff,uint length, imagetype type) +void Field_blob::get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type) { length-= HA_KEY_BLOB_LENGTH; uint32 blob_length= get_length(ptr); @@ -4576,14 +4577,14 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type) memcpy(buff+2,blob,length); } -void Field_blob::set_key_image(char *buff,uint length) +void Field_blob::set_key_image(char *buff,uint length, CHARSET_INFO *cs) { length=uint2korr(buff); - (void) Field_blob::store(buff+2,length, default_charset_info); + (void) Field_blob::store(buff+2,length,cs); } -void Field_geom::get_key_image(char *buff,uint length, imagetype type) +void Field_geom::get_key_image(char *buff,uint length,CHARSET_INFO *cs, imagetype type) { length-=HA_KEY_BLOB_LENGTH; ulong blob_length=get_length(ptr); @@ -4602,7 +4603,7 @@ void Field_geom::get_key_image(char *buff,uint length, imagetype type) return; } -void Field_geom::set_key_image(char *buff,uint length) +void Field_geom::set_key_image(char *buff,uint length,CHARSET_INFO *cs) { } diff --git a/sql/field.h b/sql/field.h index ecb5fab121b..40578d19c82 100644 --- a/sql/field.h +++ b/sql/field.h @@ -132,7 +132,7 @@ public: tmp->key_start= tmp->part_of_key= tmp->part_of_sortkey= 0; tmp->unireg_check=Field::NONE; tmp->flags&= (NOT_NULL_FLAG | BLOB_FLAG | UNSIGNED_FLAG | - ZEROFILL_FLAG | ENUM_FLAG | SET_FLAG); + ZEROFILL_FLAG | BINARY_FLAG | ENUM_FLAG | SET_FLAG); tmp->table_name= new_table->table_name; tmp->reset_fields(); } @@ -149,14 +149,14 @@ public: if (null_ptr) null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,uchar*); } - inline void get_image(char *buff,uint length) + inline void get_image(char *buff,uint length, CHARSET_INFO *cs) { memcpy(buff,ptr,length); } - inline void set_image(char *buff,uint length) + inline void set_image(char *buff,uint length, CHARSET_INFO *cs) { memcpy(ptr,buff,length); } - virtual void get_key_image(char *buff,uint length, imagetype type) - { get_image(buff,length); } - virtual void set_key_image(char *buff,uint length) - { set_image(buff,length); } + virtual void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type) + { get_image(buff,length,cs); } + virtual void set_key_image(char *buff,uint length, CHARSET_INFO *cs) + { set_image(buff,length,cs); } inline int cmp_image(char *buff,uint length) { return memcmp(ptr,buff,length); } inline longlong val_int_offset(uint row_offset) @@ -260,7 +260,11 @@ public: struct st_table *table_arg,CHARSET_INFO *charset) :Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, table_arg) - { field_charset=charset; } + { + field_charset=charset; + if (binary()) + flags|=BINARY_FLAG; + } Item_result result_type () const { return STRING_RESULT; } void add_binary_or_charset(String &res) const; uint decimals() const { return NOT_FIXED_DEC; } @@ -832,8 +836,8 @@ public: bool send_binary(Protocol *protocol); int cmp(const char *,const char*); void sort_string(char *buff,uint length); - void get_key_image(char *buff,uint length, imagetype type); - void set_key_image(char *buff,uint length); + void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type); + void set_key_image(char *buff,uint length, CHARSET_INFO *cs); void sql_type(String &str) const; char *pack(char *to, const char *from, uint max_length=~(uint) 0); const char *unpack(char* to, const char *from); @@ -904,8 +908,8 @@ public: store_length(length); memcpy_fixed(ptr+packlength,&data,sizeof(char*)); } - void get_key_image(char *buff,uint length, imagetype type); - void set_key_image(char *buff,uint length); + void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type); + void set_key_image(char *buff,uint length, CHARSET_INFO *cs); void sql_type(String &str) const; inline bool copy() { char *tmp; @@ -946,8 +950,8 @@ public: table_arg, my_charset_bin) {} enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; } - void get_key_image(char *buff,uint length, imagetype type); - void set_key_image(char *buff,uint length); + void get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type); + void set_key_image(char *buff,uint length, CHARSET_INFO *cs); }; diff --git a/sql/filesort.cc b/sql/filesort.cc index 97e06997617..8b55a2f4aa1 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -470,10 +470,11 @@ static void make_sortkey(register SORTPARAM *param, switch (sort_field->result_type) { case STRING_RESULT: { + CHARSET_INFO *cs=item->charset(); if (item->maybe_null) *to++=1; /* All item->str() to use some extra byte for end null.. */ - String tmp((char*) to,sort_field->length+4,default_charset_info); + String tmp((char*) to,sort_field->length+4,cs); String *res=item->val_str(&tmp); if (!res) { @@ -488,7 +489,6 @@ static void make_sortkey(register SORTPARAM *param, break; } length=res->length(); - CHARSET_INFO *cs=res->charset(); int diff=(int) (sort_field->length-length); if (diff < 0) { diff --git a/sql/item.cc b/sql/item.cc index 4e20f71f7ee..b161490601c 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -121,7 +121,7 @@ bool Item_string::eq(const Item *item, bool binary_cmp) const bool Item::get_date(TIME *ltime,bool fuzzydate) { char buff[40]; - String tmp(buff,sizeof(buff),default_charset_info),*res; + String tmp(buff,sizeof(buff),NULL),*res; if (!(res=val_str(&tmp)) || str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate) == TIMESTAMP_NONE) { @@ -139,7 +139,7 @@ bool Item::get_date(TIME *ltime,bool fuzzydate) bool Item::get_time(TIME *ltime) { char buff[40]; - String tmp(buff,sizeof(buff),default_charset_info),*res; + String tmp(buff,sizeof(buff),NULL),*res; if (!(res=val_str(&tmp)) || str_to_time(res->ptr(),res->length(),ltime)) { @@ -1146,7 +1146,7 @@ Item *resolve_const_item(Item *item,Item *comp_item) if (res_type == STRING_RESULT) { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff),default_charset_info),*result; + String tmp(buff,sizeof(buff),NULL),*result; result=item->val_str(&tmp); if (item->null_value) { @@ -1160,7 +1160,7 @@ Item *resolve_const_item(Item *item,Item *comp_item) #ifdef DELETE_ITEMS delete item; #endif - return new Item_string(name,tmp_str,length,default_charset_info); + return new Item_string(name,tmp_str,length,result->charset()); } if (res_type == INT_RESULT) { @@ -1201,8 +1201,8 @@ bool field_is_equal_to_item(Field *field,Item *item) { char item_buff[MAX_FIELD_WIDTH]; char field_buff[MAX_FIELD_WIDTH]; - String item_tmp(item_buff,sizeof(item_buff),default_charset_info),*item_result; - String field_tmp(field_buff,sizeof(field_buff),default_charset_info); + String item_tmp(item_buff,sizeof(item_buff),NULL),*item_result; + String field_tmp(field_buff,sizeof(field_buff),NULL); item_result=item->val_str(&item_tmp); if (item->null_value) return 1; // This must be true diff --git a/sql/item_buff.cc b/sql/item_buff.cc index 7b8976bb572..573d4ab17e3 100644 --- a/sql/item_buff.cc +++ b/sql/item_buff.cc @@ -99,7 +99,7 @@ bool Item_field_buff::cmp(void) { bool tmp= field->cmp(buff) != 0; // This is not a blob! if (tmp) - field->get_image(buff,length); + field->get_image(buff,length,field->charset()); if (null_value != field->is_null()) { null_value= !null_value; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index a30faae9a01..851a591bae9 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -878,7 +878,7 @@ String *Item_func_case::val_str(String *str) longlong Item_func_case::val_int() { char buff[MAX_FIELD_WIDTH]; - String dummy_str(buff,sizeof(buff),default_charset_info); + String dummy_str(buff,sizeof(buff),thd_charset()); Item *item=find_item(&dummy_str); longlong res; @@ -895,7 +895,7 @@ longlong Item_func_case::val_int() double Item_func_case::val() { char buff[MAX_FIELD_WIDTH]; - String dummy_str(buff,sizeof(buff),default_charset_info); + String dummy_str(buff,sizeof(buff),thd_charset()); Item *item=find_item(&dummy_str); double res; diff --git a/sql/item_func.cc b/sql/item_func.cc index c0b6a872831..19fd6b12c67 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1883,7 +1883,7 @@ longlong Item_func_set_last_insert_id::val_int() longlong Item_func_benchmark::val_int() { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff), default_charset_info); + String tmp(buff,sizeof(buff), NULL); THD *thd=current_thd; for (ulong loop=0 ; loop < loop_count && !thd->killed; loop++) @@ -2029,7 +2029,7 @@ Item_func_set_user_var::update() case STRING_RESULT: { char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer,sizeof(buffer),default_charset_info); + String tmp(buffer,sizeof(buffer),NULL); (void) val_str(&tmp); break; } @@ -2221,7 +2221,7 @@ longlong Item_func_inet_aton::val_int() char c = '.'; // we mark c to indicate invalid IP in case length is 0 char buff[36]; - String *s,tmp(buff,sizeof(buff),default_charset_info); + String *s,tmp(buff,sizeof(buff),NULL); if (!(s = args[0]->val_str(&tmp))) // If null value goto err; null_value=0; @@ -2275,7 +2275,7 @@ void Item_func_match::init_search(bool no_order) String *ft_tmp= 0; char tmp1[FT_QUERY_MAXLEN]; - String tmp2(tmp1,sizeof(tmp1),default_charset_info); + String tmp2(tmp1,sizeof(tmp1),NULL); // MATCH ... AGAINST (NULL) is meaningless, but possible if (!(ft_tmp=key_item()->val_str(&tmp2))) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 0b9658a5c2a..78689bb3044 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1438,6 +1438,8 @@ String *Item_func_soundex::val_str(String *str) { String *res =args[0]->val_str(str); char last_ch,ch; + CHARSET_INFO *cs=my_charset_latin1; + if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ @@ -1445,22 +1447,23 @@ String *Item_func_soundex::val_str(String *str) return str; /* purecov: inspected */ char *to= (char *) tmp_value.ptr(); char *from= (char *) res->ptr(), *end=from+res->length(); - - while (from != end && my_isspace(str->charset(),*from)) // Skip pre-space + tmp_value.set_charset(cs); + + while (from != end && my_isspace(cs,*from)) // Skip pre-space from++; /* purecov: inspected */ if (from == end) return &empty_string; // No alpha characters. - *to++ = my_toupper(str->charset(),*from);// Copy first letter - last_ch = get_scode(str->charset(),from);// code of the first letter + *to++ = my_toupper(cs,*from); // Copy first letter + last_ch = get_scode(cs,from); // code of the first letter // for the first 'double-letter check. // Loop on input letters until // end of input (null) or output // letter code count = 3 for (from++ ; from < end ; from++) { - if (!my_isalpha(str->charset(),*from)) + if (!my_isalpha(cs,*from)) continue; - ch=get_scode(str->charset(),from); + ch=get_scode(cs,from); if ((ch != '0') && (ch != last_ch)) // if not skipped or double { *to++ = ch; // letter, copy to output @@ -2436,7 +2439,8 @@ General functions for spatial objects String *Item_func_geometry_from_text::val_str(String *str) { Geometry geom; - String *wkt = args[0]->val_str(str); + String arg_val; + String *wkt = args[0]->val_str(&arg_val); GTextReadStream trs(wkt->ptr(), wkt->length()); str->length(0); @@ -2454,7 +2458,8 @@ void Item_func_geometry_from_text::fix_length_and_dec() String *Item_func_as_text::val_str(String *str) { - String *wkt = args[0]->val_str(str); + String arg_val; + String *wkt = args[0]->val_str(&arg_val); Geometry geom; if ((null_value=(args[0]->null_value || @@ -2491,7 +2496,8 @@ String *Item_func_geometry_type::val_str(String *str) String *Item_func_envelope::val_str(String *str) { - String *wkb = args[0]->val_str(str); + String arg_val; + String *wkb = args[0]->val_str(&arg_val); Geometry geom; null_value = args[0]->null_value || @@ -2504,7 +2510,8 @@ String *Item_func_envelope::val_str(String *str) String *Item_func_centroid::val_str(String *str) { - String *wkb = args[0]->val_str(str); + String arg_val; + String *wkb = args[0]->val_str(&arg_val); Geometry geom; null_value = args[0]->null_value || @@ -2522,7 +2529,8 @@ String *Item_func_centroid::val_str(String *str) String *Item_func_spatial_decomp::val_str(String *str) { - String *wkb = args[0]->val_str(str); + String arg_val; + String *wkb = args[0]->val_str(&arg_val); Geometry geom; if ((null_value = (args[0]->null_value || @@ -2530,6 +2538,7 @@ String *Item_func_spatial_decomp::val_str(String *str) return 0; null_value=1; + str->length(0); switch(decomp_func) { case SP_STARTPOINT: @@ -2559,7 +2568,8 @@ ret: String *Item_func_spatial_decomp_n::val_str(String *str) { - String *wkb = args[0]->val_str(str); + String arg_val; + String *wkb = args[0]->val_str(&arg_val); long n = (long) args[1]->val_int(); Geometry geom; @@ -2639,6 +2649,7 @@ String *Item_func_point::val_str(String *str) String *Item_func_spatial_collection::val_str(String *str) { + String arg_value; uint i; null_value=1; @@ -2656,7 +2667,7 @@ String *Item_func_spatial_collection::val_str(String *str) if (args[i]->null_value) goto ret; - String *res = args[i]->val_str(str); + String *res = args[i]->val_str(&arg_value); if ( coll_type == Geometry::wkbGeometryCollection ) { diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index a8bbc433b7a..4b9e9c256d1 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -318,6 +318,13 @@ void Item_in_subselect::single_value_transformer(st_select_lex *select_lex, compare_func_creator func) { DBUG_ENTER("Item_in_subselect::single_value_transformer"); + if (select_lex->master_unit()->global_parameters->select_limit != + HA_POS_ERROR) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "LIMIT & IN/ALL/ANY/SOME subquery"); + DBUG_VOID_RETURN; + } Item_in_optimizer *optimizer; substitution= optimizer= new Item_in_optimizer(left_expr, this); if (!optimizer) @@ -334,6 +341,13 @@ void Item_in_subselect::single_value_transformer(st_select_lex *select_lex, select_lex->master_unit()->dependent= 1; for (SELECT_LEX * sl= select_lex; sl; sl= sl->next_select()) { + if (select_lex->select_limit != HA_POS_ERROR) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "LIMIT & IN/ALL/ANY/SOME subquery"); + DBUG_VOID_RETURN; + } + select_lex->dependent= 1; Item *item; if (sl->item_list.elements > 1) diff --git a/sql/item_sum.cc b/sql/item_sum.cc index f54ab87b81d..d78e535010f 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -542,7 +542,7 @@ void Item_sum_hybrid::reset_field() if (hybrid_type == STRING_RESULT) { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff),default_charset_info),*res; + String tmp(buff,sizeof(buff),result_field->charset()),*res; res=args[0]->val_str(&tmp); if (args[0]->null_value) @@ -897,17 +897,17 @@ String *Item_variance_field::val_str(String *str) #include "sql_select.h" -static int simple_raw_key_cmp(void* arg, byte* key1, byte* key2) +int simple_raw_key_cmp(void* arg, byte* key1, byte* key2) { return memcmp(key1, key2, *(uint*) arg); } -static int simple_str_key_cmp(void* arg, byte* key1, byte* key2) +int simple_str_key_cmp(void* arg, byte* key1, byte* key2) { - /* BAR TODO: remove default_charset_info */ - return my_strnncoll(default_charset_info, - (const uchar*) key1, *(uint*) arg, - (const uchar*) key2, *(uint*) arg); + Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg; + CHARSET_INFO *cs=item->key_charset; + uint len=item->key_length; + return my_strnncoll(cs, (const uchar*) key1, len, (const uchar*) key2, len); } /* @@ -1037,14 +1037,22 @@ bool Item_sum_count_distinct::setup(THD *thd) Field* field = table->field[0]; switch(field->type()) { - /* - If we have a string, we must take care of charsets and case - sensitivity - */ case FIELD_TYPE_STRING: case FIELD_TYPE_VAR_STRING: - compare_key = (qsort_cmp2)(field->binary() ? simple_raw_key_cmp: - simple_str_key_cmp); + if (field->binary()) + { + compare_key = (qsort_cmp2)simple_raw_key_cmp; + cmp_arg = (void*) &key_length; + } + else + { + /* + If we have a string, we must take care of charsets and case + sensitivity + */ + compare_key = (qsort_cmp2)simple_str_key_cmp; + cmp_arg = (void*) this; + } break; default: /* @@ -1052,11 +1060,12 @@ bool Item_sum_count_distinct::setup(THD *thd) be compared with memcmp */ compare_key = (qsort_cmp2)simple_raw_key_cmp; + cmp_arg = (void*) &key_length; break; } - key_length = field->pack_length(); - cmp_arg = (void*) &key_length; - rec_offset = 1; + key_charset = field->charset(); + key_length = field->pack_length(); + rec_offset = 1; } else // too bad, cannot cheat - there is more than one field { diff --git a/sql/item_sum.h b/sql/item_sum.h index 50375fbf77c..d16a1f2224e 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -156,7 +156,8 @@ class Item_sum_count_distinct :public Item_sum_int TMP_TABLE_PARAM *tmp_table_param; TREE tree; uint key_length; - + CHARSET_INFO *key_charset; + // calculated based on max_heap_table_size. If reached, // walk the tree and dump it into MyISAM table uint max_elements_in_tree; @@ -175,6 +176,8 @@ class Item_sum_count_distinct :public Item_sum_int int tree_to_myisam(); friend int composite_key_cmp(void* arg, byte* key1, byte* key2); + friend int simple_str_key_cmp(void* arg, byte* key1, byte* key2); + friend int simple_raw_key_cmp(void* arg, byte* key1, byte* key2); friend int dump_leaf(byte* key, uint32 count __attribute__((unused)), Item_sum_count_distinct* item); diff --git a/sql/key.cc b/sql/key.cc index 84669808b92..875a89a146f 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -192,8 +192,7 @@ int key_cmp(TABLE *table,const byte *key,uint idx,uint key_length) if (!(key_part->key_type & (FIELDFLAG_NUMBER+FIELDFLAG_BINARY+ FIELDFLAG_PACK))) { - /* BAR TODO: I'm not sure this should be system_charset_info */ - if (my_strnncoll(system_charset_info, + if (my_strnncoll(key_part->field->charset(), (const uchar*) key, length, (const uchar*) table->record[0]+key_part->offset,length)) return 1; diff --git a/sql/log.cc b/sql/log.cc index dc7b5789efb..e21963022d9 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -31,6 +31,8 @@ #include <m_ctype.h> // For test_if_number #include <assert.h> +#define files_charset_info my_charset_latin1 + MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log; extern I_List<i_string> binlog_do_db, binlog_ignore_db; @@ -1483,7 +1485,7 @@ static bool test_if_number(register const char *str, while (*str++ == ' ') ; if (*--str == '-' || *str == '+') str++; - while (my_isdigit(system_charset_info,*str) || (allow_wildcards && + while (my_isdigit(files_charset_info,*str) || (allow_wildcards && (*str == wild_many || *str == wild_one))) { flag=1; @@ -1492,7 +1494,7 @@ static bool test_if_number(register const char *str, if (*str == '.') { for (str++ ; - my_isdigit(system_charset_info,*str) || + my_isdigit(files_charset_info,*str) || (allow_wildcards && (*str == wild_many || *str == wild_one)) ; str++, flag=1) ; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 943af7b44be..694f1a49f95 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -34,6 +34,8 @@ #include <ft_global.h> #include <assert.h> +#define mysqld_charset my_charset_latin1 + #ifndef DBUG_OFF #define ONE_THREAD #endif @@ -981,7 +983,7 @@ static void set_user(const char *user) { // allow a numeric uid to be used const char *pos; - for (pos=user; my_isdigit(system_charset_info,*pos); pos++) ; + for (pos=user; my_isdigit(mysqld_charset,*pos); pos++) ; if (*pos) // Not numeric id { fprintf(stderr,"Fatal error: Can't change to run as user '%s' ; Please check that the user exists!\n",user); @@ -4373,7 +4375,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), exit(1); } val= p--; - while (my_isspace(system_charset_info, *p) && p > argument) + while (my_isspace(mysqld_charset, *p) && p > argument) *p-- = 0; if (p == argument) { @@ -4383,7 +4385,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), } *val= 0; val+= 2; - while (*val && my_isspace(system_charset_info, *val)) + while (*val && my_isspace(mysqld_charset, *val)) *val++; if (!*val) { @@ -4525,7 +4527,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), have_symlink=SHOW_OPTION_DISABLED; break; case (int) OPT_BIND_ADDRESS: - if (argument && my_isdigit(system_charset_info, argument[0])) + if (argument && my_isdigit(mysqld_charset, argument[0])) { my_bind_addr = (ulong) inet_addr(argument); } @@ -4938,8 +4940,8 @@ static ulong find_bit_type(const char *x, TYPELIB *bit_lib) j=pos; while (j != end) { - if (my_toupper(system_charset_info,*i++) != - my_toupper(system_charset_info,*j++)) + if (my_toupper(mysqld_charset,*i++) != + my_toupper(mysqld_charset,*j++)) goto skipp; } found_int=bit; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index bcea522cb6d..b117b6a5ea1 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -929,7 +929,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, { bool like_error; char buff1[MAX_FIELD_WIDTH],*min_str,*max_str; - String tmp(buff1,sizeof(buff1),default_charset_info),*res; + String tmp(buff1,sizeof(buff1),value->charset()),*res; uint length,offset,min_length,max_length; if (!field->optimize_range(param->real_keynr[key_part->key])) @@ -1043,7 +1043,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, if (maybe_null) *str= (char) field->is_real_null(); // Set to 1 if null field->get_key_image(str+maybe_null,key_part->part_length, - key_part->image_type); + field->charset(),key_part->image_type); if (!(tree=new SEL_ARG(field,str,str))) DBUG_RETURN(0); @@ -2793,7 +2793,7 @@ static void print_key(KEY_PART *key_part,const char *key,uint used_length) { char buff[1024]; - String tmp(buff,sizeof(buff),default_charset_info); + String tmp(buff,sizeof(buff),NULL); for (uint length=0; length < used_length ; @@ -2813,7 +2813,8 @@ print_key(KEY_PART *key_part,const char *key,uint used_length) } field->set_key_image((char*) key,key_part->part_length - ((field->type() == FIELD_TYPE_BLOB) ? - HA_KEY_BLOB_LENGTH : 0)); + HA_KEY_BLOB_LENGTH : 0), + field->charset()); field->val_str(&tmp,&tmp); fwrite(tmp.ptr(),sizeof(char),tmp.length(),DBUG_FILE); } diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index 1477d46e756..b1bb36353bf 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -364,7 +364,8 @@ static bool find_range_key(TABLE_REF *ref, Field* field, COND *cond) // Save found constant if (part->null_bit) *key_ptr++= (byte) test(part->field->is_null()); - part->field->get_key_image((char*) key_ptr,part->length, Field::itRAW); + part->field->get_key_image((char*) key_ptr,part->length, + part->field->charset(), Field::itRAW); key_ptr+=part->store_length - test(part->null_bit); left_length-=part->store_length; } diff --git a/sql/spatial.cc b/sql/spatial.cc index b21d30e4b53..1e2b9f1c512 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -44,7 +44,7 @@ static Geometry::GClassInfo ci_collection[] = IMPLEMENT_GEOM(GGeometryCollection, wkbGeometryCollection, "GEOMETRYCOLLECTION") }; -static Geometry::GClassInfo *ci_collection_end = ci_collection + sizeof(ci_collection); +static Geometry::GClassInfo *ci_collection_end = ci_collection + sizeof(ci_collection)/sizeof(ci_collection[0]); /***************************** Geometry *******************************/ @@ -66,7 +66,7 @@ Geometry::GClassInfo *Geometry::find_class(const char *name, size_t len) cur_rt < ci_collection_end; ++cur_rt) { if ((cur_rt->m_name[len] == 0) && - (strncmp(cur_rt->m_name, name, len) == 0)) + (strncasecmp(cur_rt->m_name, name, len) == 0)) { return cur_rt; } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 9e0489edb28..ef40ebeb273 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -526,7 +526,7 @@ bool select_send::send_data(List<Item> &items) List_iterator_fast<Item> li(items); Protocol *protocol= thd->protocol; char buff[MAX_FIELD_WIDTH]; - String buffer(buff, sizeof(buff), system_charset_info); + String buffer(buff, sizeof(buff), NULL); DBUG_ENTER("send_data"); protocol->prepare_for_resend(); @@ -649,7 +649,7 @@ bool select_export::send_data(List<Item> &items) DBUG_ENTER("send_data"); char buff[MAX_FIELD_WIDTH],null_buff[2],space[MAX_FIELD_WIDTH]; bool space_inited=0; - String tmp(buff,sizeof(buff),default_charset_info),*res; + String tmp(buff,sizeof(buff),NULL),*res; tmp.length(0); if (unit->offset_limit_cnt) @@ -710,10 +710,11 @@ bool select_export::send_data(List<Item> &items) pos++) { #ifdef USE_MB - if (use_mb(default_charset_info)) + CHARSET_INFO *res_charset=res->charset(); + if (use_mb(res_charset)) { int l; - if ((l=my_ismbchar(default_charset_info, pos, end))) + if ((l=my_ismbchar(res_charset, pos, end))) { pos += l-1; continue; @@ -856,7 +857,7 @@ bool select_dump::send_data(List<Item> &items) { List_iterator_fast<Item> li(items); char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff),default_charset_info),*res; + String tmp(buff,sizeof(buff),NULL),*res; tmp.length(0); Item *item; DBUG_ENTER("send_data"); diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 88da3e2505c..cfa7170fd0a 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -536,7 +536,7 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK); bzero((char*) &create_info,sizeof(create_info)); create_info.auto_increment_value= table->file->auto_increment_value; - create_info.table_charset=default_charset_info; + create_info.table_charset=table->table_charset; db_type table_type=table->db_type; strmov(path,table->path); @@ -580,7 +580,7 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) } bzero((char*) &create_info,sizeof(create_info)); - create_info.table_charset=default_charset_info; + create_info.table_charset=table_list->table->table_charset; *fn_ext(path)=0; // Remove the .frm extension error= ha_create_table(path,&create_info,1) ? -1 : 0; diff --git a/sql/sql_help.cc b/sql/sql_help.cc index db28823a43d..5d12f023842 100644 --- a/sql/sql_help.cc +++ b/sql/sql_help.cc @@ -22,6 +22,8 @@ ** Get help on string ***************************************************************************/ +#define help_charset my_charset_latin1 + MI_INFO *open_help_file(THD *thd, const char *name) { char path[FN_REFLEN]; @@ -104,21 +106,21 @@ int search_functions(MI_INFO *file_leafs, const char *mask, leaf.prepare_fields(); const char *lname= leaf.get_name(); - if (wild_case_compare(system_charset_info,lname,mask)) + if (wild_case_compare(help_charset,lname,mask)) continue; count++; if (count>2) { - String *s= new String(lname,system_charset_info); + String *s= new String(lname,help_charset); if (!s->copy()) names->push_back(s); } else if (count==1) { - *description= new String(leaf.get_description(),system_charset_info); - *example= new String(leaf.get_example(),system_charset_info); - *name= new String(lname,system_charset_info); + *description= new String(leaf.get_description(),help_charset); + *example= new String(leaf.get_example(),help_charset); + *name= new String(lname,help_charset); (*description)->copy(); (*example)->copy(); (*name)->copy(); @@ -132,7 +134,7 @@ int search_functions(MI_INFO *file_leafs, const char *mask, *description= 0; *example= 0; - String *s= new String(lname,system_charset_info); + String *s= new String(lname,help_charset); if (!s->copy()) names->push_back(s); } @@ -203,14 +205,14 @@ int search_categories(THD *thd, category.prepare_fields(); const char *lname= category.get_name(); - if (mask && wild_case_compare(system_charset_info,lname,mask)) + if (mask && wild_case_compare(help_charset,lname,mask)) continue; count++; if (count==1 && res_id) *res_id= category.get_cat_id(); - String *s= new String(lname,system_charset_info); + String *s= new String(lname,help_charset); if (!s->copy()) names->push_back(s); } @@ -282,7 +284,7 @@ int get_all_names_for_category(THD *thd,MI_INFO *file_leafs, (const byte*)&leaf_id,4,HA_READ_KEY_EXACT)) { leaf.prepare_fields(); - String *s= new String(leaf.get_name(),system_charset_info); + String *s= new String(leaf.get_name(),help_charset); if (!s->copy()) res->push_back(s); } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 99e465f79c0..ddbb562bdca 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -165,6 +165,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc; lex->current_select= &lex->select_lex; lex->convert_set= (lex->thd= thd)->variables.convert_set; + lex->thd_charset= lex->thd->variables.thd_charset; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); lex->slave_thd_opt=0; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 927b806a082..6e5fd6765fb 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -432,7 +432,7 @@ typedef struct st_lex create_field *last_field; Item *default_value, *comment; CONVERT *convert_set; - CONVERT *thd_convert_set; // Set with SET CHAR SET + CHARSET_INFO *thd_charset; LEX_USER *grant_user; gptr yacc_yyss,yacc_yyvs; THD *thd; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 553b9a1fe43..95a739014e5 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -23,6 +23,8 @@ #include <my_dir.h> #include <assert.h> +#define files_charset_info system_charset_info + #ifdef HAVE_INNOBASE_DB #include "ha_innodb.h" #endif @@ -1222,7 +1224,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; } if (lower_case_table_names) - my_casedn_str(system_charset_info, db); + my_casedn_str(files_charset_info, db); if (check_access(thd,CREATE_ACL,db,0,1)) break; mysql_log.write(thd,command,packet); @@ -1240,7 +1242,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; } if (lower_case_table_names) - my_casedn_str(system_charset_info, db); + my_casedn_str(files_charset_info, db); if (thd->locked_tables || thd->active_transaction()) { send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION); @@ -2488,7 +2490,7 @@ mysql_execute_command(THD *thd) break; } if (lower_case_table_names) - my_casedn_str(system_charset_info, lex->name); + my_casedn_str(files_charset_info, lex->name); if (check_access(thd,CREATE_ACL,lex->name,0,1)) break; res=mysql_create_db(thd,lex->name,&lex->create_info,0); @@ -2502,7 +2504,7 @@ mysql_execute_command(THD *thd) break; } if (lower_case_table_names) - my_casedn_str(system_charset_info, lex->name); + my_casedn_str(files_charset_info, lex->name); if (check_access(thd,DROP_ACL,lex->name,0,1)) break; if (thd->locked_tables || thd->active_transaction()) @@ -2590,7 +2592,7 @@ mysql_execute_command(THD *thd) if (user->password.str && (strcmp(thd->user,user->user.str) || user->host.str && - my_strcasecmp(system_charset_info, + my_strcasecmp(my_charset_latin1, user->host.str, thd->host_or_ip))) { if (check_access(thd, UPDATE_ACL, "mysql",0,1)) @@ -3582,8 +3584,8 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, ptr->alias= alias_str; if (lower_case_table_names) { - my_casedn_str(system_charset_info,ptr->db); - my_casedn_str(system_charset_info,table->table.str); + my_casedn_str(files_charset_info,ptr->db); + my_casedn_str(files_charset_info,table->table.str); } ptr->real_name=table->table.str; ptr->real_name_length=table->table.length; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 602a4b494b6..988cae8363b 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -6645,12 +6645,14 @@ store_record_in_cache(JOIN_CACHE *cache) { if (last_record) { - copy->blob_field->get_image((char*) pos,copy->length+sizeof(char*)); + copy->blob_field->get_image((char*) pos,copy->length+sizeof(char*), + copy->blob_field->charset()); pos+=copy->length+sizeof(char*); } else { - copy->blob_field->get_image((char*) pos,copy->length); // blob length + copy->blob_field->get_image((char*) pos,copy->length, // blob length + copy->blob_field->charset()); memcpy(pos+copy->length,copy->str,copy->blob_length); // Blob data pos+=copy->length+copy->blob_length; } @@ -6707,7 +6709,8 @@ read_cached_record(JOIN_TAB *tab) { if (last_record) { - copy->blob_field->set_image((char*) pos,copy->length+sizeof(char*)); + copy->blob_field->set_image((char*) pos,copy->length+sizeof(char*), + copy->blob_field->charset()); pos+=copy->length+sizeof(char*); } else diff --git a/sql/sql_string.h b/sql/sql_string.h index d7447dd6ed6..afcc3d74530 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -225,7 +225,7 @@ public: { Ptr[str_length++] = c; } - void q_append(const uint32 &n) + void q_append(const uint32 n) { int4store(Ptr + str_length, n); str_length += 4; diff --git a/sql/time.cc b/sql/time.cc index 282075df9eb..76e67115a92 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -268,13 +268,13 @@ void find_date(string pos,uint *vek,uint flag) DBUG_PRINT("enter",("pos: '%s' flag: %d",pos,flag)); bzero((char*) vek,sizeof(int)*4); - while (*pos && !my_isdigit(system_charset_info,*pos)) + while (*pos && !my_isdigit(my_charset_latin1,*pos)) pos++; length=(uint) strlen(pos); for (uint i=0 ; i< 3; i++) { start=pos; value=0; - while (my_isdigit(system_charset_info,pos[0]) && + while (my_isdigit(my_charset_latin1,pos[0]) && ((pos-start) < 2 || ((pos-start) < 4 && length >= 8 && !(flag & 3)))) { @@ -282,8 +282,8 @@ void find_date(string pos,uint *vek,uint flag) pos++; } vek[flag & 3]=value; flag>>=2; - while (*pos && (my_ispunct(system_charset_info,*pos) || - my_isspace(system_charset_info,*pos))) + while (*pos && (my_ispunct(my_charset_latin1,*pos) || + my_isspace(my_charset_latin1,*pos))) pos++; } DBUG_PRINT("exit",("year: %d month: %d day: %d",vek[0],vek[1],vek[2])); @@ -452,7 +452,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) DBUG_PRINT("enter",("str: %.*s",length,str)); // Skip garbage - for (; str != end && !my_isdigit(system_charset_info, *str) ; str++) ; + for (; str != end && !my_isdigit(my_charset_latin1, *str) ; str++) ; if (str == end) DBUG_RETURN(TIMESTAMP_NONE); /* @@ -460,15 +460,15 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) If length= 8 or >= 14 then year is of format YYYY. (YYYY-MM-DD, YYYYMMDD, YYYYYMMDDHHMMSS) */ - for (pos=str; pos != end && my_isdigit(system_charset_info,*pos) ; pos++) ; + for (pos=str; pos != end && my_isdigit(my_charset_latin1,*pos) ; pos++) ; digits= (uint) (pos-str); year_length= (digits == 4 || digits == 8 || digits >= 14) ? 4 : 2; field_length=year_length-1; not_zero_date= 0; - for (i=0 ; i < 6 && str != end && my_isdigit(system_charset_info,*str) ; i++) + for (i=0 ; i < 6 && str != end && my_isdigit(my_charset_latin1,*str) ; i++) { uint tmp_value=(uint) (uchar) (*str++ - '0'); - while (str != end && my_isdigit(system_charset_info,str[0]) && + while (str != end && my_isdigit(my_charset_latin1,str[0]) && field_length--) { tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); @@ -481,11 +481,11 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) else if ( i != 5 ) // Skip inter-field delimiters { while (str != end && - (my_ispunct(system_charset_info,*str) || - my_isspace(system_charset_info,*str))) + (my_ispunct(my_charset_latin1,*str) || + my_isspace(my_charset_latin1,*str))) { // Only allow space between days and hours - if (my_isspace(system_charset_info,*str) && i != 2) + if (my_isspace(my_charset_latin1,*str) && i != 2) DBUG_RETURN(TIMESTAMP_NONE); str++; } @@ -494,12 +494,12 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) } /* Handle second fractions */ if (i == 6 && (uint) (end-str) >= 2 && *str == '.' && - my_isdigit(system_charset_info,str[1])) + my_isdigit(my_charset_latin1,str[1])) { str++; uint tmp_value=(uint) (uchar) (*str - '0'); field_length=3; - while (str++ != end && my_isdigit(system_charset_info,str[0]) && + while (str++ != end && my_isdigit(my_charset_latin1,str[0]) && field_length--) tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); date[6]=tmp_value; @@ -522,7 +522,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) { for (; str != end ; str++) { - if (!my_isspace(system_charset_info, *str)) + if (!my_isspace(my_charset_latin1, *str)) { not_zero_date= 1; // Give warning break; @@ -537,7 +537,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) { for (; str != end ; str++) { - if (!my_isspace(system_charset_info,*str)) + if (!my_isspace(my_charset_latin1,*str)) { current_thd->cuted_fields++; break; @@ -599,7 +599,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) l_time->neg=0; for (; str != end && - !my_isdigit(system_charset_info,*str) && *str != '-' ; str++) + !my_isdigit(my_charset_latin1,*str) && *str != '-' ; str++) length--; if (str != end && *str == '-') { @@ -618,7 +618,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) } /* Not a timestamp. Try to get this as a DAYS_TO_SECOND string */ - for (value=0; str != end && my_isdigit(system_charset_info,*str) ; str++) + for (value=0; str != end && my_isdigit(my_charset_latin1,*str) ; str++) value=value*10L + (long) (*str - '0'); if (*str == ' ') @@ -630,7 +630,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) LINT_INIT(state); found_days=found_hours=0; if ((uint) (end-str) > 1 && (*str == ' ' && - my_isdigit(system_charset_info,str[1]))) + my_isdigit(my_charset_latin1,str[1]))) { // days ! date[0]=value; state=1; // Assume next is hours @@ -638,7 +638,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) str++; // Skip space; } else if ((end-str) > 1 && *str == ':' && - my_isdigit(system_charset_info,str[1])) + my_isdigit(my_charset_latin1,str[1])) { date[0]=0; // Assume we found hours date[1]=value; @@ -660,11 +660,11 @@ bool str_to_time(const char *str,uint length,TIME *l_time) /* Read hours, minutes and seconds */ for (;;) { - for (value=0; str != end && my_isdigit(system_charset_info,*str) ; str++) + for (value=0; str != end && my_isdigit(my_charset_latin1,*str) ; str++) value=value*10L + (long) (*str - '0'); date[state++]=value; if (state == 4 || (end-str) < 2 || *str != ':' || - !my_isdigit(system_charset_info,str[1])) + !my_isdigit(my_charset_latin1,str[1])) break; str++; // Skip ':' } @@ -684,12 +684,12 @@ bool str_to_time(const char *str,uint length,TIME *l_time) fractional: /* Get fractional second part */ - if ((end-str) >= 2 && *str == '.' && my_isdigit(system_charset_info,str[1])) + if ((end-str) >= 2 && *str == '.' && my_isdigit(my_charset_latin1,str[1])) { uint field_length=3; str++; value=(uint) (uchar) (*str - '0'); while (++str != end && - my_isdigit(system_charset_info,str[0]) && + my_isdigit(my_charset_latin1,str[0]) && field_length--) value=value*10 + (uint) (uchar) (*str - '0'); date[4]=value; @@ -715,7 +715,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) { do { - if (!my_isspace(system_charset_info,*str)) + if (!my_isspace(my_charset_latin1,*str)) { current_thd->cuted_fields++; break; |