mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +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
|
9 abc ppc
|
||||||
drop table federated.t1, federated.t2;
|
drop table federated.t1, federated.t2;
|
||||||
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 TABLE IF EXISTS federated.t1;
|
||||||
DROP DATABASE IF EXISTS federated;
|
DROP DATABASE IF EXISTS federated;
|
||||||
DROP TABLE IF EXISTS federated.t1;
|
DROP TABLE IF EXISTS federated.t1;
|
||||||
|
@ -1361,4 +1361,22 @@ drop table federated.t1, federated.t2;
|
|||||||
connection slave;
|
connection slave;
|
||||||
drop table federated.t1, federated.t2;
|
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;
|
source include/federated_cleanup.inc;
|
||||||
|
@ -1810,19 +1810,13 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
|||||||
/*
|
/*
|
||||||
buffers for following strings
|
buffers for following strings
|
||||||
*/
|
*/
|
||||||
char old_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
char field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
||||||
char new_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
|
||||||
char update_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
char update_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
||||||
char where_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
char where_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
||||||
|
|
||||||
/* stores the value to be replaced of the field were are updating */
|
/* Work area for field values */
|
||||||
String old_field_value(old_field_value_buffer,
|
String field_value(field_value_buffer, sizeof(field_value_buffer),
|
||||||
sizeof(old_field_value_buffer),
|
&my_charset_bin);
|
||||||
&my_charset_bin);
|
|
||||||
/* stores the new value of the field */
|
|
||||||
String new_field_value(new_field_value_buffer,
|
|
||||||
sizeof(new_field_value_buffer),
|
|
||||||
&my_charset_bin);
|
|
||||||
/* stores the update query */
|
/* stores the update query */
|
||||||
String update_string(update_buffer,
|
String update_string(update_buffer,
|
||||||
sizeof(update_buffer),
|
sizeof(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
|
set string lengths to 0 to avoid misc chars in string
|
||||||
*/
|
*/
|
||||||
old_field_value.length(0);
|
field_value.length(0);
|
||||||
new_field_value.length(0);
|
|
||||||
update_string.length(0);
|
update_string.length(0);
|
||||||
where_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
|
In this loop, we want to match column names to values being inserted
|
||||||
(while building INSERT statement).
|
(while building INSERT statement).
|
||||||
|
|
||||||
Iterate through table->field (new data) and share->old_filed (old_data)
|
Iterate through table->field (new data) and share->old_field (old_data)
|
||||||
using the same index to created an SQL UPDATE statement, new data is
|
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
|
used to create SET field=value and old data is used to create WHERE
|
||||||
field=oldvalue
|
field=oldvalue
|
||||||
*/
|
*/
|
||||||
@ -1863,30 +1856,28 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
|||||||
update_string.append(FEDERATED_EQ);
|
update_string.append(FEDERATED_EQ);
|
||||||
|
|
||||||
if ((*field)->is_null())
|
if ((*field)->is_null())
|
||||||
new_field_value.append(FEDERATED_NULL);
|
update_string.append(FEDERATED_NULL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* otherwise = */
|
/* otherwise = */
|
||||||
(*field)->val_str(&new_field_value);
|
(*field)->val_str(&field_value);
|
||||||
(*field)->quote_data(&new_field_value);
|
(*field)->quote_data(&field_value);
|
||||||
|
update_string.append(field_value);
|
||||||
if (!field_in_record_is_null(table, *field, (char*) old_data))
|
field_value.length(0);
|
||||||
where_string.append(FEDERATED_EQ);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field_in_record_is_null(table, *field, (char*) old_data))
|
if (field_in_record_is_null(table, *field, (char*) old_data))
|
||||||
where_string.append(FEDERATED_ISNULL);
|
where_string.append(FEDERATED_ISNULL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(*field)->val_str(&old_field_value,
|
where_string.append(FEDERATED_EQ);
|
||||||
|
(*field)->val_str(&field_value,
|
||||||
(char*) (old_data + (*field)->offset()));
|
(char*) (old_data + (*field)->offset()));
|
||||||
(*field)->quote_data(&old_field_value);
|
(*field)->quote_data(&field_value);
|
||||||
where_string.append(old_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
|
Only append conjunctions if we have another field in which
|
||||||
to iterate
|
to iterate
|
||||||
@ -1896,7 +1887,6 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
|||||||
update_string.append(FEDERATED_COMMA);
|
update_string.append(FEDERATED_COMMA);
|
||||||
where_string.append(FEDERATED_AND);
|
where_string.append(FEDERATED_AND);
|
||||||
}
|
}
|
||||||
old_field_value.length(0);
|
|
||||||
}
|
}
|
||||||
update_string.append(FEDERATED_WHERE);
|
update_string.append(FEDERATED_WHERE);
|
||||||
update_string.append(where_string);
|
update_string.append(where_string);
|
||||||
|
Reference in New Issue
Block a user