Commit dd6e56b9 authored by unknown's avatar unknown
Browse files

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
parents abe796eb 046f82e3
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1023,3 +1023,10 @@ select format(d, 2) from t1;
format(d, 2)
NULL
drop table t1;
create table t1 (c varchar(40));
insert into t1 values ('y,abc'),('y,abc');
select c, substring_index(lcase(c), @q:=',', -1) as res from t1;
c	res
y,abc	abc
y,abc	abc
drop table t1;
+8 −0
Original line number Diff line number Diff line
@@ -676,4 +676,12 @@ insert into t1 values (null);
select format(d, 2) from t1;
drop table t1;

#
# Bug #14676: substring_index() returns incorrect results
#
create table t1 (c varchar(40));
insert into t1 values ('y,abc'),('y,abc');
select c, substring_index(lcase(c), @q:=',', -1) as res from t1;
drop table t1;

# End of 5.0 tests
+22 −16
Original line number Diff line number Diff line
@@ -1129,7 +1129,7 @@ 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);
  String *delimiter= args[1]->val_str(&tmp_value);
  int32 count= (int32) args[2]->val_int();
  uint offset;

@@ -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);
@@ -1150,9 +1150,9 @@ String *Item_func_substr_index::val_str(String *str)
  {
    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 *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);
}