summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/item_cmpfunc.h7
-rw-r--r--sql/item_strfunc.cc13
-rw-r--r--sql/item_strfunc.h10
3 files changed, 19 insertions, 11 deletions
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 4438b902011..549839b4f96 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -263,13 +263,6 @@ class Item_func_strcmp :public Item_bool_func2
public:
Item_func_strcmp(Item *a,Item *b) :Item_bool_func2(a,b) {}
longlong val_int();
- void fix_length_and_dec()
- {
- max_length=2;
- /* QQ: COERCIBILITY */
- cmp_charset= args[0]->binary() || args[1]->binary() ?
- &my_charset_bin : args[0]->charset();
- }
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
const char *func_name() const { return "strcmp"; }
};
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index e5b73e7670f..d660f7c472c 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -702,6 +702,7 @@ String *Item_func_reverse::val_str(String *str)
void Item_func_reverse::fix_length_and_dec()
{
+ set_charset(args[0]->charset(),args[0]->coercibility);
max_length = args[0]->max_length;
}
@@ -860,6 +861,14 @@ null:
void Item_func_insert::fix_length_and_dec()
{
+ if (set_charset(args[0]->charset(), args[0]->coercibility,
+ args[3]->charset(), args[3]->coercibility))
+ {
+ my_error(ER_CANT_AGGREGATE_COLLATIONS,MYF(0),
+ args[0]->charset()->name,coercion_name(args[0]->coercibility),
+ args[3]->charset()->name,coercion_name(args[3]->coercibility),
+ func_name());
+ }
max_length=args[0]->max_length+args[3]->max_length;
if (max_length > MAX_BLOB_WIDTH)
{
@@ -1521,6 +1530,7 @@ String *Item_func_user::val_str(String *str)
void Item_func_soundex::fix_length_and_dec()
{
+ set_charset(args[0]->charset(), args[0]->coercibility);
max_length=args[0]->max_length;
set_if_bigger(max_length,4);
}
@@ -1552,7 +1562,7 @@ 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;
+ CHARSET_INFO *cs= charset();
if ((null_value=args[0]->null_value))
return 0; /* purecov: inspected */
@@ -2538,6 +2548,7 @@ String *Item_func_quote::val_str(String *str)
}
*to= '\'';
str->length(new_length);
+ str->set_charset(charset());
return str;
null:
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index a70c9b39255..26c69668b0a 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -536,8 +536,8 @@ public:
const char *func_name() const { return "load_file"; }
void fix_length_and_dec()
{
- set_charset(&my_charset_bin);
- maybe_null=1;
+ set_charset(&my_charset_bin, COER_COERCIBLE);
+ maybe_null=1;
max_length=MAX_BLOB_WIDTH;
}
};
@@ -571,7 +571,11 @@ public:
Item_func_quote(Item *a) :Item_str_func(a) {}
const char *func_name() const { return "quote"; }
String *val_str(String *);
- void fix_length_and_dec() { max_length= args[0]->max_length * 2 + 2; }
+ void fix_length_and_dec()
+ {
+ set_charset(args[0]->charset(), args[0]->coercibility);
+ max_length= args[0]->max_length * 2 + 2;
+ }
};
class Item_func_conv_charset :public Item_str_func