Commit 01d3a61f authored by unknown's avatar unknown
Browse files

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
parents 23474afb 12e62a8e
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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;
+18 −0
Original line number Diff line number Diff line
@@ -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;
+17 −27
Original line number Diff line number Diff line
@@ -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);