Commit e4f4a46f authored by holyfoot/hf@hfmain.(none)'s avatar holyfoot/hf@hfmain.(none)
Browse files

Merge bk@192.168.21.1:mysql-5.0-opt

into  mysql.com:/home/hf/work/29878/my50-29878
parents 3301955b 03dfd986
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -41,3 +41,13 @@ select * from t2 order by b;
b	a
1	1
drop table t1,t2;
CREATE TABLE t1 (
`id` int(11) NOT NULL auto_increment,
`data` varchar(100),
PRIMARY KEY  (`id`)
) ENGINE=MyISAM;
INSERT INTO t1(data) VALUES(SESSION_USER());
SELECT * FROM t1;
id	data
1	
drop table t1;
+22 −0
Original line number Diff line number Diff line
@@ -40,3 +40,25 @@ drop table t1,t2;
save_master_pos;
connection slave;
sync_with_master;

#
# Bug #29878 Garbage data generation when executing SESSION_USER() on a slave. 
#

connection master;
CREATE TABLE t1 (
  `id` int(11) NOT NULL auto_increment,
  `data` varchar(100),
  PRIMARY KEY  (`id`)
 ) ENGINE=MyISAM;

INSERT INTO t1(data) VALUES(SESSION_USER());
save_master_pos;
connection slave;
sync_with_master;
SELECT * FROM t1;
connection master;
drop table t1;
save_master_pos;
connection slave;
sync_with_master;
+38 −14
Original line number Diff line number Diff line
@@ -336,6 +336,37 @@ int Item::save_date_in_field(Field *field)
}


/*
  Store the string value in field directly

  SYNOPSIS
    Item::save_str_value_in_field()
    field   a pointer to field where to store
    result  the pointer to the string value to be stored

  DESCRIPTION
    The method is used by Item_*::save_in_field implementations
    when we don't need to calculate the value to store
    See Item_string::save_in_field() implementation for example

  IMPLEMENTATION
    Check if the Item is null and stores the NULL or the
    result value in the field accordingly.

  RETURN
    Nonzero value if error
*/

int Item::save_str_value_in_field(Field *field, String *result)
{
  if (null_value)
    return set_field_to_null(field);
  field->set_notnull();
  return field->store(result->ptr(), result->length(),
		      collation.collation);
}


Item::Item():
  rsize(0), name(0), orig_name(0), name_length(0), fixed(0),
  is_autogenerated_name(TRUE),
@@ -3009,16 +3040,6 @@ my_decimal *Item_copy_string::val_decimal(my_decimal *decimal_value)
}



int Item_copy_string::save_in_field(Field *field, bool no_conversions)
{
  if (null_value)
    return set_field_to_null(field);
  field->set_notnull();
  return field->store(str_value.ptr(),str_value.length(),
		      collation.collation);
}

/*
  Functions to convert item to field (for send_fields)
*/
@@ -4417,6 +4438,12 @@ int Item_null::save_safe_in_field(Field *field)
}


/*
  This implementation can lose str_value content, so if the
  Item uses str_value to store something, it should
  reimplement it's ::save_in_field() as Item_string, for example, does
*/

int Item::save_in_field(Field *field, bool no_conversions)
{
  int error;
@@ -4474,10 +4501,7 @@ int Item_string::save_in_field(Field *field, bool no_conversions)
{
  String *result;
  result=val_str(&str_value);
  if (null_value)
    return set_field_to_null(field);
  field->set_notnull();
  return field->store(result->ptr(),result->length(),collation.collation);
  return save_str_value_in_field(field, result);
}


+5 −1
Original line number Diff line number Diff line
@@ -612,6 +612,7 @@ class Item {

  int save_time_in_field(Field *field);
  int save_date_in_field(Field *field);
  int save_str_value_in_field(Field *field, String *result);

  virtual Field *get_tmp_table_field() { return 0; }
  /* This is also used to create fields in CREATE ... SELECT: */
@@ -2166,7 +2167,10 @@ class Item_copy_string :public Item
  my_decimal *val_decimal(my_decimal *);
  void make_field(Send_field *field) { item->make_field(field); }
  void copy();
  int save_in_field(Field *field, bool no_conversions);
  int save_in_field(Field *field, bool no_conversions)
  {
    return save_str_value_in_field(field, &str_value);
  }
  table_map used_tables() const { return (table_map) 1L; }
  bool const_item() const { return 0; }
  bool is_null() { return null_value; }
+4 −0
Original line number Diff line number Diff line
@@ -434,6 +434,10 @@ class Item_func_user :public Item_func_sysconst
  }
  const char *func_name() const { return "user"; }
  const char *fully_qualified_func_name() const { return "user()"; }
  int save_in_field(Field *field, bool no_conversions)
  {
    return save_str_value_in_field(field, &str_value);
  }
};