diff options
author | unknown <bar@bar.mysql.r18.ru> | 2003-06-19 11:36:44 +0500 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2003-06-19 11:36:44 +0500 |
commit | 59e1e7b215e589325fcb101f7d11c8a402ba72c1 (patch) | |
tree | 9813bb2c8f8898511e2321003d1c213398694b2d /sql | |
parent | 76a06a4742764e08409251590145891cbbc9d4d5 (diff) | |
download | mariadb-git-59e1e7b215e589325fcb101f7d11c8a402ba72c1.tar.gz |
These functions now return a result of proper collation:
BIN
OCT
CONV
HEX
CHAR
FORMAT
REPLACE
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.cc | 2 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 15 | ||||
-rw-r--r-- | sql/item_strfunc.h | 19 |
3 files changed, 32 insertions, 4 deletions
diff --git a/sql/item.cc b/sql/item.cc index cdd78572a0a..57efd3e7bf3 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -39,7 +39,7 @@ Item::Item(): { marker= 0; maybe_null=null_value=with_sum_func=unsigned_flag=0; - coercibility=COER_IMPLICIT; + coercibility=COER_COERCIBLE; name= 0; decimals= 0; max_length= 0; THD *thd= current_thd; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index d660f7c472c..9ab20281a97 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -813,6 +813,7 @@ null: void Item_func_replace::fix_length_and_dec() { + uint i; max_length=args[0]->max_length; int diff=(int) (args[2]->max_length - args[1]->max_length); if (diff > 0 && args[1]->max_length) @@ -825,6 +826,20 @@ void Item_func_replace::fix_length_and_dec() max_length=MAX_BLOB_WIDTH; maybe_null=1; } + set_charset(args[0]->charset(), args[0]->coercibility); + + for (i=1; i<3; i++) + { + if (set_charset(charset(), coercibility, + args[i]->charset(), args[i]->coercibility)) + { + my_error(ER_CANT_AGGREGATE_COLLATIONS,MYF(0), + charset()->name,coercion_name(coercibility), + args[i]->charset()->name,coercion_name(args[i]->coercibility), + func_name()); + break; + } + } } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 26c69668b0a..6bb1c510013 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -433,6 +433,7 @@ public: String *val_str(String *); void fix_length_and_dec() { + set_charset(default_charset()); max_length=args[0]->max_length+(args[0]->max_length-args[0]->decimals)/3; } const char *func_name() const { return "format"; } @@ -444,7 +445,11 @@ class Item_func_char :public Item_str_func public: Item_func_char(List<Item> &list) :Item_str_func(list) {} String *val_str(String *); - void fix_length_and_dec() { maybe_null=0; max_length=arg_count; } + void fix_length_and_dec() + { + set_charset(default_charset()); + maybe_null=0; max_length=arg_count; + } const char *func_name() const { return "char"; } }; @@ -490,7 +495,11 @@ public: Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {} const char *func_name() const { return "conv"; } String *val_str(String *); - void fix_length_and_dec() { decimals=0; max_length=64; } + void fix_length_and_dec() + { + set_charset(default_charset()); + decimals=0; max_length=64; + } }; @@ -501,7 +510,11 @@ public: Item_func_hex(Item *a) :Item_str_func(a) {} const char *func_name() const { return "hex"; } String *val_str(String *); - void fix_length_and_dec() { decimals=0; max_length=args[0]->max_length*2; } + void fix_length_and_dec() + { + set_charset(default_charset()); + decimals=0; max_length=args[0]->max_length*2; + } }; |