diff options
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r-- | sql/item_strfunc.cc | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 9ab20281a97..4955c699315 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1780,8 +1780,20 @@ void Item_func_make_set::split_sum_func(Item **ref_pointer_array, void Item_func_make_set::fix_length_and_dec() { max_length=arg_count-1; - for (uint i=1 ; i < arg_count ; i++) + set_charset(args[0]->charset(), args[0]->coercibility); + for (uint i=0 ; i < arg_count ; i++) + { max_length+=args[i]->max_length; + 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; + } + } used_tables_cache|=item->used_tables(); const_item_cache&=item->const_item(); with_sum_func= with_sum_func || item->with_sum_func; @@ -1964,6 +1976,15 @@ err: void Item_func_rpad::fix_length_and_dec() { + if (set_charset(args[0]->charset(), args[0]->coercibility, + args[2]->charset(), args[2]->coercibility)) + { + my_error(ER_CANT_AGGREGATE_COLLATIONS,MYF(0), + args[0]->charset()->name,coercion_name(args[0]->coercibility), + args[2]->charset()->name,coercion_name(args[2]->coercibility), + func_name()); + } + if (args[1]->const_item()) { uint32 length= (uint32) args[1]->val_int(); @@ -2024,6 +2045,15 @@ String *Item_func_rpad::val_str(String *str) void Item_func_lpad::fix_length_and_dec() { + if (set_charset(args[0]->charset(), args[0]->coercibility, + args[2]->charset(), args[2]->coercibility)) + { + my_error(ER_CANT_AGGREGATE_COLLATIONS,MYF(0), + args[0]->charset()->name,coercion_name(args[0]->coercibility), + args[2]->charset()->name,coercion_name(args[2]->coercibility), + func_name()); + } + if (args[1]->const_item()) { uint32 length= (uint32) args[1]->val_int(); @@ -2433,9 +2463,24 @@ String* Item_func_export_set::val_str(String* str) void Item_func_export_set::fix_length_and_dec() { + uint i; uint length=max(args[1]->max_length,args[2]->max_length); uint sep_length=(arg_count > 3 ? args[3]->max_length : 1); max_length=length*64+sep_length*63; + + set_charset(args[1]->charset(), args[1]->coercibility); + for (i=2 ; i < 4 && i < arg_count ; 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; + } + } } String* Item_func_inet_ntoa::val_str(String* str) |