Commit 74c64904 authored by ram@gw.mysql.r18.ru's avatar ram@gw.mysql.r18.ru

A fix (Bug #4878: Service crashes on query execution)

parent 31c0ecb2
...@@ -673,3 +673,6 @@ c1 c2 ...@@ -673,3 +673,6 @@ c1 c2
2147483647 4294967295 2147483647 4294967295
-2147483648 0 -2147483648 0
drop table t1; drop table t1;
select left(1234, 3) + 0;
left(1234, 3) + 0
123
...@@ -402,3 +402,9 @@ insert into t1 values ('-21474836461','-21474836461'); ...@@ -402,3 +402,9 @@ insert into t1 values ('-21474836461','-21474836461');
show warnings; show warnings;
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Bug #4878: LEFT() in integer/float context
#
select left(1234, 3) + 0;
...@@ -984,6 +984,9 @@ String *Item_func_left::val_str(String *str) ...@@ -984,6 +984,9 @@ String *Item_func_left::val_str(String *str)
return &my_empty_string; return &my_empty_string;
if (res->length() <= (uint) length) if (res->length() <= (uint) length)
return res; return res;
if (&str_value == res)
str_value.length(res->charpos(length));
else
str_value.set(*res, 0, res->charpos(length)); str_value.set(*res, 0, res->charpos(length));
return &str_value; return &str_value;
} }
......
...@@ -98,6 +98,7 @@ public: ...@@ -98,6 +98,7 @@ public:
void set(String &str,uint32 offset,uint32 arg_length) void set(String &str,uint32 offset,uint32 arg_length)
{ {
DBUG_ASSERT(&str != this);
free(); free();
Ptr=(char*) str.ptr()+offset; str_length=arg_length; alloced=0; Ptr=(char*) str.ptr()+offset; str_length=arg_length; alloced=0;
if (str.Alloced_length) if (str.Alloced_length)
......
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