summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.cc
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2014-02-17 11:00:51 +0100
committerSergei Golubchik <sergii@pisem.net>2014-02-17 11:00:51 +0100
commit84651126c0f101ea762eec0eb4045f533a00e96d (patch)
tree1bba1d0079b08cb10fe69e03942cd5f254dc735e /sql/item_strfunc.cc
parent1fa5183241e5a8e8e91690f0c35d676e9f3334ca (diff)
parentf7c8dd6bc7bb6d46d1ae2b6fdb47227429387e33 (diff)
downloadmariadb-git-84651126c0f101ea762eec0eb4045f533a00e96d.tar.gz
MySQL-5.5.36 merge
(without few incorrect bugfixes and with 1250 files where only a copyright year was changed)
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r--sql/item_strfunc.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 1b0f8c6acc0..469e8d2ac1c 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1005,6 +1005,7 @@ String *Item_func_reverse::val_str(String *str)
if ((l= my_ismbchar(res->charset(),ptr,end)))
{
tmp-= l;
+ DBUG_ASSERT(tmp >= tmp_value.ptr());
memcpy(tmp,ptr,l);
ptr+= l;
}
@@ -1753,18 +1754,35 @@ String *Item_func_trim::val_str(String *str)
ptr= (char*) res->ptr();
end= ptr+res->length();
r_ptr= remove_str->ptr();
- while (ptr+remove_length <= end && !memcmp(ptr,r_ptr,remove_length))
- ptr+=remove_length;
#ifdef USE_MB
if (use_mb(res->charset()))
{
+ while (ptr + remove_length <= end)
+ {
+ uint num_bytes= 0;
+ while (num_bytes < remove_length)
+ {
+ uint len;
+ if ((len= my_ismbchar(res->charset(), ptr + num_bytes, end)))
+ num_bytes+= len;
+ else
+ ++num_bytes;
+ }
+ if (num_bytes != remove_length)
+ break;
+ if (memcmp(ptr, r_ptr, remove_length))
+ break;
+ ptr+= remove_length;
+ }
char *p=ptr;
register uint32 l;
loop:
while (ptr + remove_length < end)
{
- if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l;
- else ++ptr;
+ if ((l= my_ismbchar(res->charset(), ptr,end)))
+ ptr+= l;
+ else
+ ++ptr;
}
if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length))
{
@@ -1777,6 +1795,8 @@ String *Item_func_trim::val_str(String *str)
else
#endif /* USE_MB */
{
+ while (ptr+remove_length <= end && !memcmp(ptr,r_ptr,remove_length))
+ ptr+=remove_length;
while (ptr + remove_length <= end &&
!memcmp(end-remove_length,r_ptr,remove_length))
end-=remove_length;