summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-06-19 11:36:44 +0500
committerunknown <bar@bar.mysql.r18.ru>2003-06-19 11:36:44 +0500
commit59e1e7b215e589325fcb101f7d11c8a402ba72c1 (patch)
tree9813bb2c8f8898511e2321003d1c213398694b2d /sql
parent76a06a4742764e08409251590145891cbbc9d4d5 (diff)
downloadmariadb-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.cc2
-rw-r--r--sql/item_strfunc.cc15
-rw-r--r--sql/item_strfunc.h19
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;
+ }
};