Commit d9f7c443 authored by gshchepa/uchum@gleb.loc's avatar gshchepa/uchum@gleb.loc

Merge gleb.loc:/home/uchum/work/bk/5.0

into  gleb.loc:/home/uchum/work/bk/5.0-opt
parents 81905ee1 e4f4a46f
...@@ -136,8 +136,8 @@ update ignore t1 set id=1023 where id=1010; ...@@ -136,8 +136,8 @@ update ignore t1 set id=1023 where id=1010;
select * from t1 where parent_id=102 order by parent_id,id; select * from t1 where parent_id=102 order by parent_id,id;
id parent_id level id parent_id level
1008 102 2 1008 102 2
1010 102 2
1015 102 2 1015 102 2
1010 102 2
explain select level from t1 where level=1; explain select level from t1 where level=1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref level level 1 const X Using index 1 SIMPLE t1 ref level level 1 const X Using index
......
...@@ -29,3 +29,26 @@ id name ...@@ -29,3 +29,26 @@ id name
10 my name 10 my name
20 is Bond 20 is Bond
drop table t1; drop table t1;
CREATE TABLE t1(a int, UNIQUE(a));
INSERT DELAYED IGNORE INTO t1 VALUES(1);
INSERT DELAYED IGNORE INTO t1 VALUES(1);
flush table t1;
show binlog events limit 11,100;
Log_name Pos Event_type Server_id End_log_pos Info
x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
x x x x x use `test`; flush table t1
select * from t1;
a
1
On slave
show binlog events limit 12,100;
Log_name Pos Event_type Server_id End_log_pos Info
x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
x x x x x use `test`; flush table t1
select * from t1;
a
1
drop table t1;
End of 5.0 tests
...@@ -41,3 +41,13 @@ select * from t2 order by b; ...@@ -41,3 +41,13 @@ select * from t2 order by b;
b a b a
1 1 1 1
drop table t1,t2; 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;
...@@ -65,3 +65,33 @@ connection master; ...@@ -65,3 +65,33 @@ connection master;
drop table t1; drop table t1;
sync_slave_with_master; sync_slave_with_master;
connection master; connection master;
#
# Bug #29571: INSERT DELAYED IGNORE written to binary log on the master but
# on the slave
#
CREATE TABLE t1(a int, UNIQUE(a));
INSERT DELAYED IGNORE INTO t1 VALUES(1);
INSERT DELAYED IGNORE INTO t1 VALUES(1);
flush table t1; # to wait for INSERT DELAYED to be done
#must show two INSERT DELAYED
--replace_column 1 x 2 x 3 x 4 x 5 x
show binlog events limit 11,100;
select * from t1;
sync_slave_with_master;
echo On slave;
#must show two INSERT DELAYED
--replace_column 1 x 2 x 3 x 4 x 5 x
show binlog events limit 12,100;
select * from t1;
# clean up
connection master;
drop table t1;
sync_slave_with_master;
connection master;
--echo End of 5.0 tests
...@@ -40,3 +40,25 @@ drop table t1,t2; ...@@ -40,3 +40,25 @@ drop table t1,t2;
save_master_pos; save_master_pos;
connection slave; connection slave;
sync_with_master; 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;
...@@ -2646,7 +2646,11 @@ ha_rows ha_berkeley::estimate_rows_upper_bound() ...@@ -2646,7 +2646,11 @@ ha_rows ha_berkeley::estimate_rows_upper_bound()
int ha_berkeley::cmp_ref(const byte *ref1, const byte *ref2) int ha_berkeley::cmp_ref(const byte *ref1, const byte *ref2)
{ {
if (hidden_primary_key) if (hidden_primary_key)
return memcmp(ref1, ref2, BDB_HIDDEN_PRIMARY_KEY_LENGTH); {
ulonglong a=uint5korr((char*) ref1);
ulonglong b=uint5korr((char*) ref2);
return a < b ? -1 : (a > b ? 1 : 0);
}
int result; int result;
Field *field; Field *field;
......
...@@ -336,6 +336,37 @@ int Item::save_date_in_field(Field *field) ...@@ -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(): Item::Item():
rsize(0), name(0), orig_name(0), name_length(0), fixed(0), rsize(0), name(0), orig_name(0), name_length(0), fixed(0),
is_autogenerated_name(TRUE), is_autogenerated_name(TRUE),
...@@ -3009,16 +3040,6 @@ my_decimal *Item_copy_string::val_decimal(my_decimal *decimal_value) ...@@ -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) Functions to convert item to field (for send_fields)
*/ */
...@@ -4417,6 +4438,12 @@ int Item_null::save_safe_in_field(Field *field) ...@@ -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 Item::save_in_field(Field *field, bool no_conversions)
{ {
int error; int error;
...@@ -4474,10 +4501,7 @@ int Item_string::save_in_field(Field *field, bool no_conversions) ...@@ -4474,10 +4501,7 @@ int Item_string::save_in_field(Field *field, bool no_conversions)
{ {
String *result; String *result;
result=val_str(&str_value); result=val_str(&str_value);
if (null_value) return save_str_value_in_field(field, result);
return set_field_to_null(field);
field->set_notnull();
return field->store(result->ptr(),result->length(),collation.collation);
} }
......
...@@ -612,6 +612,7 @@ public: ...@@ -612,6 +612,7 @@ public:
int save_time_in_field(Field *field); int save_time_in_field(Field *field);
int save_date_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; } virtual Field *get_tmp_table_field() { return 0; }
/* This is also used to create fields in CREATE ... SELECT: */ /* This is also used to create fields in CREATE ... SELECT: */
...@@ -2166,7 +2167,10 @@ public: ...@@ -2166,7 +2167,10 @@ public:
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
void make_field(Send_field *field) { item->make_field(field); } void make_field(Send_field *field) { item->make_field(field); }
void copy(); 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; } table_map used_tables() const { return (table_map) 1L; }
bool const_item() const { return 0; } bool const_item() const { return 0; }
bool is_null() { return null_value; } bool is_null() { return null_value; }
......
...@@ -434,6 +434,10 @@ public: ...@@ -434,6 +434,10 @@ public:
} }
const char *func_name() const { return "user"; } const char *func_name() const { return "user"; }
const char *fully_qualified_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);
}
}; };
......
...@@ -560,6 +560,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -560,6 +560,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
int error, res; int error, res;
bool transactional_table, joins_freed= FALSE; bool transactional_table, joins_freed= FALSE;
bool changed; bool changed;
bool was_insert_delayed= (table_list->lock_type == TL_WRITE_DELAYED);
uint value_count; uint value_count;
ulong counter = 1; ulong counter = 1;
ulonglong id; ulonglong id;
...@@ -859,14 +860,16 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -859,14 +860,16 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
transactional_table= table->file->has_transactions(); transactional_table= table->file->has_transactions();
if ((changed= (info.copied || info.deleted || info.updated))) if ((changed= (info.copied || info.deleted || info.updated)) ||
was_insert_delayed)
{ {
/* /*
Invalidate the table in the query cache if something changed. Invalidate the table in the query cache if something changed.
For the transactional algorithm to work the invalidation must be For the transactional algorithm to work the invalidation must be
before binlog writing and ha_autocommit_or_rollback before binlog writing and ha_autocommit_or_rollback
*/ */
query_cache_invalidate3(thd, table_list, 1); if (changed)
query_cache_invalidate3(thd, table_list, 1);
if (error <= 0 || !transactional_table) if (error <= 0 || !transactional_table)
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
...@@ -904,7 +907,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -904,7 +907,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
if (mysql_bin_log.write(&qinfo) && transactional_table) if (mysql_bin_log.write(&qinfo) && transactional_table)
error=1; error=1;
} }
if (!transactional_table) if (!transactional_table && changed)
thd->no_trans_update.all= TRUE; thd->no_trans_update.all= TRUE;
} }
} }
......
...@@ -12033,7 +12033,6 @@ static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx, ...@@ -12033,7 +12033,6 @@ static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx,
*/ */
if (!on_primary_key && if (!on_primary_key &&
(table->file->table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) && (table->file->table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) &&
table->s->db_type == DB_TYPE_INNODB &&
table->s->primary_key != MAX_KEY) table->s->primary_key != MAX_KEY)
{ {
on_primary_key= TRUE; on_primary_key= TRUE;
......
...@@ -782,8 +782,7 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, ...@@ -782,8 +782,7 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
if (ha_option & HA_PRIMARY_KEY_IN_READ_INDEX) if (ha_option & HA_PRIMARY_KEY_IN_READ_INDEX)
{ {
field->part_of_key= share->keys_in_use; field->part_of_key= share->keys_in_use;
if (share->db_type == DB_TYPE_INNODB && if (field->part_of_sortkey.is_set(key))
field->part_of_sortkey.is_set(key))
field->part_of_sortkey= share->keys_in_use; field->part_of_sortkey= share->keys_in_use;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment