Loading mysql-test/r/rpl_session_var.result +10 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/rpl_session_var.test +22 −0 Original line number Diff line number Diff line Loading @@ -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; sql/item.cc +38 −14 Original line number Diff line number Diff line Loading @@ -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), Loading Loading @@ -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) */ Loading Loading @@ -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; Loading Loading @@ -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); } Loading sql/item.h +5 −1 Original line number Diff line number Diff line Loading @@ -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: */ Loading Loading @@ -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; } Loading sql/item_strfunc.h +4 −0 Original line number Diff line number Diff line Loading @@ -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); } }; Loading Loading
mysql-test/r/rpl_session_var.result +10 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/rpl_session_var.test +22 −0 Original line number Diff line number Diff line Loading @@ -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;
sql/item.cc +38 −14 Original line number Diff line number Diff line Loading @@ -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), Loading Loading @@ -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) */ Loading Loading @@ -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; Loading Loading @@ -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); } Loading
sql/item.h +5 −1 Original line number Diff line number Diff line Loading @@ -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: */ Loading Loading @@ -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; } Loading
sql/item_strfunc.h +4 −0 Original line number Diff line number Diff line Loading @@ -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); } }; Loading