summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.cc
diff options
context:
space:
mode:
authorunknown <jimw@mysql.com>2006-02-17 08:32:50 -0800
committerunknown <jimw@mysql.com>2006-02-17 08:32:50 -0800
commitdd6e56b903afc978bb0b3273727cb59c23786b1b (patch)
treedef044bcf2e3d0d4cdceefebaba0b2274b728c65 /sql/item_strfunc.cc
parentabe796eb7193e9102d36ea243356a701e7754712 (diff)
parent046f82e3a52e212cb50f3d32497030fe317d9b25 (diff)
downloadmariadb-git-dd6e56b903afc978bb0b3273727cb59c23786b1b.tar.gz
Merge mysql.com:/home/jimw/my/mysql-5.0-14676
into mysql.com:/home/jimw/my/mysql-5.0-clean sql/item_strfunc.cc: Auto merged
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r--sql/item_strfunc.cc38
1 files changed, 22 insertions, 16 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index fe02e7c5b49..a3e47154bc3 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1128,9 +1128,9 @@ void Item_func_substr_index::fix_length_and_dec()
String *Item_func_substr_index::val_str(String *str)
{
DBUG_ASSERT(fixed == 1);
- String *res =args[0]->val_str(str);
- String *delimeter =args[1]->val_str(&tmp_value);
- int32 count = (int32) args[2]->val_int();
+ String *res= args[0]->val_str(str);
+ String *delimiter= args[1]->val_str(&tmp_value);
+ int32 count= (int32) args[2]->val_int();
uint offset;
if (args[0]->null_value || args[1]->null_value || args[2]->null_value)
@@ -1139,8 +1139,8 @@ String *Item_func_substr_index::val_str(String *str)
return 0;
}
null_value=0;
- uint delimeter_length=delimeter->length();
- if (!res->length() || !delimeter_length || !count)
+ uint delimiter_length= delimiter->length();
+ if (!res->length() || !delimiter_length || !count)
return &my_empty_string; // Wrong parameters
res->set_charset(collation.collation);
@@ -1148,11 +1148,11 @@ String *Item_func_substr_index::val_str(String *str)
#ifdef USE_MB
if (use_mb(res->charset()))
{
- const char *ptr=res->ptr();
- const char *strend = ptr+res->length();
- const char *end=strend-delimeter_length+1;
- const char *search=delimeter->ptr();
- const char *search_end=search+delimeter_length;
+ const char *ptr= res->ptr();
+ const char *strend= ptr+res->length();
+ const char *end= strend-delimiter_length+1;
+ const char *search= delimiter->ptr();
+ const char *search_end= search+delimiter_length;
int32 n=0,c=count,pass;
register uint32 l;
for (pass=(count>0);pass<2;++pass)
@@ -1167,7 +1167,7 @@ String *Item_func_substr_index::val_str(String *str)
if (*i++ != *j++) goto skip;
if (pass==0) ++n;
else if (!--c) break;
- ptr+=delimeter_length;
+ ptr+= delimiter_length;
continue;
}
skip:
@@ -1189,7 +1189,7 @@ String *Item_func_substr_index::val_str(String *str)
}
else /* return right part */
{
- ptr+=delimeter_length;
+ ptr+= delimiter_length;
tmp_value.set(*res,(ulong) (ptr-res->ptr()), (ulong) (strend-ptr));
}
}
@@ -1200,9 +1200,9 @@ String *Item_func_substr_index::val_str(String *str)
{
if (count > 0)
{ // start counting from the beginning
- for (offset=0 ;; offset+=delimeter_length)
+ for (offset=0; ; offset+= delimiter_length)
{
- if ((int) (offset=res->strstr(*delimeter,offset)) < 0)
+ if ((int) (offset= res->strstr(*delimiter, offset)) < 0)
return res; // Didn't find, return org string
if (!--count)
{
@@ -1223,7 +1223,7 @@ String *Item_func_substr_index::val_str(String *str)
address space less than where the found substring is located
in res
*/
- if ((int) (offset=res->strrstr(*delimeter,offset)) < 0)
+ if ((int) (offset= res->strrstr(*delimiter, offset)) < 0)
return res; // Didn't find, return org string
/*
At this point, we've searched for the substring
@@ -1231,13 +1231,19 @@ String *Item_func_substr_index::val_str(String *str)
*/
if (!++count)
{
- offset+=delimeter_length;
+ offset+= delimiter_length;
tmp_value.set(*res,offset,res->length()- offset);
break;
}
}
}
}
+ /*
+ We always mark tmp_value as const so that if val_str() is called again
+ on this object, we don't disrupt the contents of tmp_value when it was
+ derived from another String.
+ */
+ tmp_value.mark_as_const();
return (&tmp_value);
}