mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge bk-internal:/home/bk/mysql-5.0-engines
into mysql.com:/home/jimw/my/mysql-5.0-16494 sql/ha_federated.cc: Auto merged mysql-test/r/federated.result: Resolve conflict mysql-test/t/federated.test: Resolve conflict
This commit is contained in:
@ -1689,6 +1689,22 @@ id c1 c2
|
||||
9 abc ppc
|
||||
drop table federated.t1, federated.t2;
|
||||
drop table federated.t1, federated.t2;
|
||||
create table t1 (id int not null auto_increment primary key, val int);
|
||||
create table t1
|
||||
(id int not null auto_increment primary key, val int) engine=federated
|
||||
connection='mysql://root@127.0.0.1:9308/test/t1';
|
||||
insert into t1 values (1,0),(2,0);
|
||||
update t1 set val = NULL where id = 1;
|
||||
select * from t1;
|
||||
id val
|
||||
1 NULL
|
||||
2 0
|
||||
select * from t1;
|
||||
id val
|
||||
1 NULL
|
||||
2 0
|
||||
drop table t1;
|
||||
drop table t1;
|
||||
DROP TABLE IF EXISTS federated.t1;
|
||||
DROP DATABASE IF EXISTS federated;
|
||||
DROP TABLE IF EXISTS federated.t1;
|
||||
|
@ -1361,4 +1361,22 @@ drop table federated.t1, federated.t2;
|
||||
connection slave;
|
||||
drop table federated.t1, federated.t2;
|
||||
|
||||
#
|
||||
# Bug #16494: Updates that set a column to NULL fail sometimes
|
||||
#
|
||||
connection slave;
|
||||
create table t1 (id int not null auto_increment primary key, val int);
|
||||
connection master;
|
||||
eval create table t1
|
||||
(id int not null auto_increment primary key, val int) engine=federated
|
||||
connection='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1';
|
||||
insert into t1 values (1,0),(2,0);
|
||||
update t1 set val = NULL where id = 1;
|
||||
select * from t1;
|
||||
connection slave;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
connection master;
|
||||
drop table t1;
|
||||
|
||||
source include/federated_cleanup.inc;
|
||||
|
@ -1810,18 +1810,12 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||
/*
|
||||
buffers for following strings
|
||||
*/
|
||||
char old_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
||||
char new_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
||||
char field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
||||
char update_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
||||
char where_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
||||
|
||||
/* stores the value to be replaced of the field were are updating */
|
||||
String old_field_value(old_field_value_buffer,
|
||||
sizeof(old_field_value_buffer),
|
||||
&my_charset_bin);
|
||||
/* stores the new value of the field */
|
||||
String new_field_value(new_field_value_buffer,
|
||||
sizeof(new_field_value_buffer),
|
||||
/* Work area for field values */
|
||||
String field_value(field_value_buffer, sizeof(field_value_buffer),
|
||||
&my_charset_bin);
|
||||
/* stores the update query */
|
||||
String update_string(update_buffer,
|
||||
@ -1835,8 +1829,7 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||
/*
|
||||
set string lengths to 0 to avoid misc chars in string
|
||||
*/
|
||||
old_field_value.length(0);
|
||||
new_field_value.length(0);
|
||||
field_value.length(0);
|
||||
update_string.length(0);
|
||||
where_string.length(0);
|
||||
|
||||
@ -1850,8 +1843,8 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||
In this loop, we want to match column names to values being inserted
|
||||
(while building INSERT statement).
|
||||
|
||||
Iterate through table->field (new data) and share->old_filed (old_data)
|
||||
using the same index to created an SQL UPDATE statement, new data is
|
||||
Iterate through table->field (new data) and share->old_field (old_data)
|
||||
using the same index to create an SQL UPDATE statement. New data is
|
||||
used to create SET field=value and old data is used to create WHERE
|
||||
field=oldvalue
|
||||
*/
|
||||
@ -1863,30 +1856,28 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||
update_string.append(FEDERATED_EQ);
|
||||
|
||||
if ((*field)->is_null())
|
||||
new_field_value.append(FEDERATED_NULL);
|
||||
update_string.append(FEDERATED_NULL);
|
||||
else
|
||||
{
|
||||
/* otherwise = */
|
||||
(*field)->val_str(&new_field_value);
|
||||
(*field)->quote_data(&new_field_value);
|
||||
|
||||
if (!field_in_record_is_null(table, *field, (char*) old_data))
|
||||
where_string.append(FEDERATED_EQ);
|
||||
(*field)->val_str(&field_value);
|
||||
(*field)->quote_data(&field_value);
|
||||
update_string.append(field_value);
|
||||
field_value.length(0);
|
||||
}
|
||||
|
||||
if (field_in_record_is_null(table, *field, (char*) old_data))
|
||||
where_string.append(FEDERATED_ISNULL);
|
||||
else
|
||||
{
|
||||
(*field)->val_str(&old_field_value,
|
||||
where_string.append(FEDERATED_EQ);
|
||||
(*field)->val_str(&field_value,
|
||||
(char*) (old_data + (*field)->offset()));
|
||||
(*field)->quote_data(&old_field_value);
|
||||
where_string.append(old_field_value);
|
||||
(*field)->quote_data(&field_value);
|
||||
where_string.append(field_value);
|
||||
field_value.length(0);
|
||||
}
|
||||
|
||||
update_string.append(new_field_value);
|
||||
new_field_value.length(0);
|
||||
|
||||
/*
|
||||
Only append conjunctions if we have another field in which
|
||||
to iterate
|
||||
@ -1896,7 +1887,6 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||
update_string.append(FEDERATED_COMMA);
|
||||
where_string.append(FEDERATED_AND);
|
||||
}
|
||||
old_field_value.length(0);
|
||||
}
|
||||
update_string.append(FEDERATED_WHERE);
|
||||
update_string.append(where_string);
|
||||
|
Reference in New Issue
Block a user