Loading mysql-test/r/federated.result +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading mysql-test/t/federated.test +18 −0 Original line number Diff line number Diff line Loading @@ -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; sql/ha_federated.cc +17 −27 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); Loading @@ -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 */ Loading @@ -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 Loading @@ -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); Loading Loading
mysql-test/r/federated.result +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
mysql-test/t/federated.test +18 −0 Original line number Diff line number Diff line Loading @@ -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;
sql/ha_federated.cc +17 −27 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); Loading @@ -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 */ Loading @@ -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 Loading @@ -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); Loading