Commit 733b1c40 authored by unknown's avatar unknown
Browse files

Copied patch for BUG#15588 (BUG#16621) from 5.0 into 5.1-release.


sql/field.cc:
  Use memmove() instead of memcpy() -- after implementation of WL#2984
  (Make stored routine variables work according to the standard) it is
  possible to store in the field the value from this field. For instance,
  this can happen for the following statement:
    SET sp_var = SUBSTR(sp_var, 1, 3);
sql/sp_head.cc:
  Work correctly with String:
  - String length has to be be reset before use;
  - qs_append() does not allocate memory, so the memory should
    be reserved beforehand.
parent 16a849f2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -5880,7 +5880,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
                                                    field_length/
                                                    field_charset->mbmaxlen,
                                                    &well_formed_error);
  memcpy(ptr,from,copy_length);
  memmove(ptr,from,copy_length);

  /* Append spaces if the string was shorter than the field. */
  if (copy_length < field_length)
@@ -6296,7 +6296,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
						    field_length/
						    field_charset->mbmaxlen,
                                                    &well_formed_error);
  memcpy(ptr + length_bytes, from, copy_length);
  memmove(ptr + length_bytes, from, copy_length);
  if (length_bytes == 1)
    *ptr= (uchar) copy_length;
  else
+25 −12
Original line number Diff line number Diff line
@@ -105,13 +105,18 @@ sp_get_item_value(Item *item, String *str)

  case STRING_RESULT:
    {
      char buf_holder[STRING_BUFFER_USUAL_SIZE];
      String buf(buf_holder, sizeof(buf_holder), &my_charset_latin1);
      String *result= item->val_str(str);
      
      if (!result)
        return NULL;
      
      {
        char buf_holder[STRING_BUFFER_USUAL_SIZE];
        String buf(buf_holder, sizeof (buf_holder), result->charset());
      
        /* We must reset length of the buffer, because of String specificity. */
        buf.length(0);
      
        buf.append('_');
        buf.append(result->charset()->csname);
        buf.append('\'');
@@ -121,6 +126,7 @@ sp_get_item_value(Item *item, String *str)
      
        return str;
      }
    }

  case ROW_RESULT:
  default:
@@ -3076,9 +3082,16 @@ sp_instr_set_case_expr::exec_core(THD *thd, uint *nextp)
void
sp_instr_set_case_expr::print(String *str)
{
  str->append(STRING_WITH_LEN("set_case_expr "));
  const char CASE_EXPR_TAG[]= "set_case_expr ";
  const int CASE_EXPR_TAG_LEN= sizeof(CASE_EXPR_TAG) - 1;
  const int INT_STRING_MAX_LEN= 10;

  /* We must call reserve(), because qs_append() doesn't care about memory. */
  str->reserve(CASE_EXPR_TAG_LEN + INT_STRING_MAX_LEN + 2);

  str->qs_append(CASE_EXPR_TAG, CASE_EXPR_TAG_LEN);
  str->qs_append(m_case_expr_id);
  str->append(' ');
  str->qs_append(' ');
  m_case_expr->print(str);
}