summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <Sinisa@sinisa.nasamreza.org>2002-12-24 14:02:42 +0200
committerunknown <Sinisa@sinisa.nasamreza.org>2002-12-24 14:02:42 +0200
commitf46decc78025403ee118f1d30f6bed45bb854afb (patch)
tree09a4fad0fb0076a17d9ede22eebdfba0f4323b00
parent7a74837e00be97bfaaf2940f06c636da7eed73a8 (diff)
parentb861d68321b6242bc2579a4458aa137efd2e42c2 (diff)
downloadmariadb-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
-rw-r--r--BitKeeper/etc/logging_ok1
-rw-r--r--include/mysql_com.h5
-rw-r--r--libmysql/libmysql.c11
-rw-r--r--libmysqld/libmysqld.c11
-rw-r--r--mysql-test/r/ctype_many.result5
-rw-r--r--mysql-test/r/subselect.result8
-rw-r--r--mysql-test/t/ctype_many.test5
-rw-r--r--mysql-test/t/subselect.test10
-rw-r--r--sql/Makefile.am2
-rw-r--r--sql/field.cc19
-rw-r--r--sql/field.h32
-rw-r--r--sql/filesort.cc4
-rw-r--r--sql/item.cc12
-rw-r--r--sql/item_buff.cc2
-rw-r--r--sql/item_cmpfunc.cc4
-rw-r--r--sql/item_func.cc8
-rw-r--r--sql/item_strfunc.cc37
-rw-r--r--sql/item_subselect.cc14
-rw-r--r--sql/item_sum.cc41
-rw-r--r--sql/item_sum.h5
-rw-r--r--sql/key.cc3
-rw-r--r--sql/log.cc6
-rw-r--r--sql/mysqld.cc14
-rw-r--r--sql/opt_range.cc9
-rw-r--r--sql/opt_sum.cc3
-rw-r--r--sql/spatial.cc4
-rw-r--r--sql/sql_class.cc11
-rw-r--r--sql/sql_delete.cc4
-rw-r--r--sql/sql_help.cc20
-rw-r--r--sql/sql_lex.cc1
-rw-r--r--sql/sql_lex.h2
-rw-r--r--sql/sql_parse.cc16
-rw-r--r--sql/sql_select.cc9
-rw-r--r--sql/sql_string.h2
-rw-r--r--sql/time.cc48
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;