Commit e57fc8a4 authored by unknown's avatar unknown
Browse files

Merge mysql.com:/home/bkroot/mysql-5.0

into  mysql.com:/home/bk/b18293-mysql-5.1-new


sql/item.cc:
  Auto merged
mysql-test/extra/binlog_tests/ctype_cp932_binlog.test:
  Auto merged
sql/log_event.cc:
  Auto merged
sql/mysql_priv.h:
  Auto merged
sql/sp_head.cc:
  Auto merged
mysql-test/r/binlog_stm_ctype_ucs.result:
  Merge with mysql-5.0
parents f6ffd3a1 bda51a42
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -34,3 +34,26 @@ DROP table t1;
# end test for bug#11338

# End of 4.1 tests

#
# Bug#18293: Values in stored procedure written to binlog unescaped
#

delimiter |;
CREATE TABLE t4 (s1 CHAR(50) CHARACTER SET latin1,
                 s2 CHAR(50) CHARACTER SET cp932,
                 d DECIMAL(10,2))|
CREATE PROCEDURE bug18293 (IN ins1 CHAR(50),
                           IN ins2 CHAR(50) CHARACTER SET cp932,
                           IN ind DECIMAL(10,2))
  BEGIN
    INSERT INTO t4 VALUES (ins1, ins2, ind);
  END|
CALL bug18293("Foo's a Bar", _cp932 0xED40ED41ED42, 47.93)|
SELECT HEX(s1),HEX(s2),d FROM t4|
DROP PROCEDURE bug18293|
DROP TABLE t4|
SHOW BINLOG EVENTS FROM 393|
delimiter ;|

# End of 5.0 tests
+1 −18
Original line number Diff line number Diff line
@@ -2646,25 +2646,8 @@ const String *Item_param::query_val_str(String* str) const
  case STRING_VALUE:
  case LONG_DATA_VALUE:
    {
      char *buf, *ptr;
      str->length(0);
      if (str->reserve(str_value.length()*2+3))
        break;

      buf= str->c_ptr_quick();
      ptr= buf;
      if (value.cs_info.character_set_client->escape_with_backslash_is_dangerous)
      {
        ptr= str_to_hex(ptr, str_value.ptr(), str_value.length());
      }
      else
      {
        *ptr++= '\'';
        ptr+= escape_string_for_mysql(str_value.charset(), ptr, 0,
                                      str_value.ptr(), str_value.length());
        *ptr++='\'';
      }
      str->length((uint32) (ptr - buf));
      append_query_string(value.cs_info.character_set_client, &str_value, str);
      break;
    }
  case NULL_VALUE:
+31 −0
Original line number Diff line number Diff line
@@ -256,6 +256,37 @@ char *str_to_hex(char *to, const char *from, uint len)
  return to;                               // pointer to end 0 of 'to'
}

/*
  Append a version of the 'from' string suitable for use in a query to
  the 'to' string.  To generate a correct escaping, the character set
  information in 'csinfo' is used.
 */
#ifndef MYSQL_CLIENT
int
append_query_string(CHARSET_INFO *csinfo,
                    String const *from, String *to)
{
  char *beg, *ptr;
  uint32 const orig_len= to->length();
  if (to->reserve(orig_len + from->length()*2+3))
    return 1;

  beg= to->c_ptr_quick() + to->length();
  ptr= beg;
  if (csinfo->escape_with_backslash_is_dangerous)
    ptr= str_to_hex(ptr, from->ptr(), from->length());
  else
  {
    *ptr++= '\'';
    ptr+= escape_string_for_mysql(from->charset(), ptr, 0,
                                  from->ptr(), from->length());
    *ptr++='\'';
  }
  to->length(orig_len + ptr - beg);
  return 0;
}
#endif

/*
  Prints a "session_var=value" string. Used by mysqlbinlog to print some SET
  commands just before it prints a query.
+2 −0
Original line number Diff line number Diff line
@@ -547,6 +547,8 @@ bool delete_precheck(THD *thd, TABLE_LIST *tables);
bool insert_precheck(THD *thd, TABLE_LIST *tables);
bool create_table_precheck(THD *thd, TABLE_LIST *tables,
                           TABLE_LIST *create_table);
int append_query_string(CHARSET_INFO *csinfo,
                        String const *from, String *to);

void get_default_definer(THD *thd, LEX_USER *definer);
LEX_USER *create_default_definer(THD *thd);
+5 −5
Original line number Diff line number Diff line
@@ -80,8 +80,8 @@ sp_map_item_type(enum enum_field_types type)
/*
  Return a string representation of the Item value.

  NOTE: this is a legacy-compatible implementation. It fails if the value
  contains non-ordinary symbols, which should be escaped.
  NOTE: If the item has a string result type, the string is escaped
  according to its character set.

  SYNOPSIS
    item    a pointer to the Item
@@ -119,9 +119,9 @@ sp_get_item_value(Item *item, String *str)

        buf.append('_');
        buf.append(result->charset()->csname);
        buf.append('\'');
        buf.append(*result);
        buf.append('\'');
        if (result->charset()->escape_with_backslash_is_dangerous)
          buf.append(' ');
        append_query_string(result->charset(), result, &buf);
        str->copy(buf);

        return str;