Commit b8153269 authored by Sergei Golubchik's avatar Sergei Golubchik

fix an overly agressive optimization in Item_func_conv_charset

parent 6cf8672f
...@@ -5,3 +5,18 @@ select '' in ('',convert(0,time)); ...@@ -5,3 +5,18 @@ select '' in ('',convert(0,time));
select case '' when '' then 1 when convert(0,time) then 2 end; select case '' when '' then 1 when convert(0,time) then 2 end;
case '' when '' then 1 when convert(0,time) then 2 end case '' when '' then 1 when convert(0,time) then 2 end
1 1
select convert(0x0030 using ucs2) div 1, concat(convert(0x0030 using ucs2)) div 1;
convert(0x0030 using ucs2) div 1 concat(convert(0x0030 using ucs2)) div 1
0 0
select cast(convert(0x0030 using ucs2) as double), cast(concat(convert(0x0030 using ucs2)) as double);
cast(convert(0x0030 using ucs2) as double) cast(concat(convert(0x0030 using ucs2)) as double)
0 0
select cast(convert(0x0030 using ucs2) as decimal(5.2)), cast(concat(convert(0x0030 using ucs2)) as decimal(5.2));
cast(convert(0x0030 using ucs2) as decimal(5.2)) cast(concat(convert(0x0030 using ucs2)) as decimal(5.2))
0 0
select cast(convert(_ucs2 0x0030 using latin1) as date), cast(concat(convert(_ucs2 0x0030 using latin1)) as date);
cast(convert(_ucs2 0x0030 using latin1) as date) cast(concat(convert(_ucs2 0x0030 using latin1)) as date)
NULL NULL
Warnings:
Warning 1292 Incorrect datetime value: '0'
Warning 1292 Incorrect datetime value: '0'
...@@ -4,3 +4,11 @@ ...@@ -4,3 +4,11 @@
set names swe7; set names swe7;
select '' in ('',convert(0,time)); select '' in ('',convert(0,time));
select case '' when '' then 1 when convert(0,time) then 2 end; select case '' when '' then 1 when convert(0,time) then 2 end;
#
# Excessive optimization of Item_func_conv_charset:
#
select convert(0x0030 using ucs2) div 1, concat(convert(0x0030 using ucs2)) div 1;
select cast(convert(0x0030 using ucs2) as double), cast(concat(convert(0x0030 using ucs2)) as double);
select cast(convert(0x0030 using ucs2) as decimal(5.2)), cast(concat(convert(0x0030 using ucs2)) as decimal(5.2));
select cast(convert(_ucs2 0x0030 using latin1) as date), cast(concat(convert(_ucs2 0x0030 using latin1)) as date);
...@@ -855,13 +855,29 @@ class Item_func_conv_charset :public Item_str_func ...@@ -855,13 +855,29 @@ class Item_func_conv_charset :public Item_str_func
} }
String *val_str(String *); String *val_str(String *);
longlong val_int() longlong val_int()
{ return args[0]->val_int(); } {
if (args[0]->result_type() == STRING_RESULT)
return Item_str_func::val_int();
return args[0]->val_int();
}
double val_real() double val_real()
{ return args[0]->val_real(); } {
if (args[0]->result_type() == STRING_RESULT)
return Item_str_func::val_real();
return args[0]->val_real();
}
my_decimal *val_decimal(my_decimal *d) my_decimal *val_decimal(my_decimal *d)
{ return args[0]->val_decimal(d); } {
if (args[0]->result_type() == STRING_RESULT)
return Item_str_func::val_decimal(d);
return args[0]->val_decimal(d);
}
bool get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) bool get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
{ return args[0]->get_date(ltime, fuzzydate); } {
if (args[0]->result_type() == STRING_RESULT)
return Item_str_func::get_date(ltime, fuzzydate);
return args[0]->get_date(ltime, fuzzydate);
}
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "convert"; } const char *func_name() const { return "convert"; }
virtual void print(String *str, enum_query_type query_type); virtual void print(String *str, enum_query_type query_type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment