Below is the list of changes that have just been committed into a local
5.1 repository of elkin. When elkin does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-07-20 00:15:06+03:00, aelkin@stripped +12 -0
wl#3915 master's cols > slave
Slave starts accepting and handling rows of master's tables which have more columns.
The most important part of implementation is how to caclulate the amount of bytes to
skip for unknown by slave
column.
To solve that issue this WL adopts results of WL#3228 which introduces an addon to
table_map event that carries
the necessary part of information about sizes of data of columns.
mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test@stripped, 2007-07-20 00:15:00+03:00,
aelkin@stripped +13 -25
basic tests checking altering and skipping extra fields by slave.
The fields can be of any possible types.
mysql-test/r/rpl_extraColmaster_innodb.result@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +275 -0
new results
mysql-test/r/rpl_extraColmaster_innodb.result@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +0 -0
mysql-test/r/rpl_extraColmaster_myisam.result@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +275 -0
new results
mysql-test/r/rpl_extraColmaster_myisam.result@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +0 -0
mysql-test/r/rpl_extraColmaster_ndb.result@stripped, 2007-07-20 00:15:03+03:00,
aelkin@stripped +275 -0
new results
mysql-test/r/rpl_extraColmaster_ndb.result@stripped, 2007-07-20 00:15:03+03:00,
aelkin@stripped +0 -0
mysql-test/t/rpl_extraColmaster_innodb-master.opt@stripped, 2007-07-20 00:15:00+03:00,
aelkin@stripped +1 -1
to start innodb
mysql-test/t/rpl_extraColmaster_innodb-slave.opt@stripped, 2007-07-20 00:15:01+03:00,
aelkin@stripped +1 -1
option for innodb
mysql-test/t/rpl_extraColmaster_innodb.test@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +14 -0
test of innodb
mysql-test/t/rpl_extraColmaster_innodb.test@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +0 -0
mysql-test/t/rpl_extraColmaster_myisam.test@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +13 -0
test for myisam
mysql-test/t/rpl_extraColmaster_myisam.test@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +0 -0
mysql-test/t/rpl_extraColmaster_ndb.test@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +11 -0
test for ndb
mysql-test/t/rpl_extraColmaster_ndb.test@stripped, 2007-07-20 00:15:02+03:00,
aelkin@stripped +0 -0
sql/log_event.cc@stripped, 2007-07-20 00:15:01+03:00, aelkin@stripped +6 -13
copying extra (slave's) fields returns early if master's table version is wider;
removing assert in the way of master > slave cols.
sql/rpl_record.cc@stripped, 2007-07-20 00:15:01+03:00, aelkin@stripped +24 -3
adding a snippet that shift exectution curson donw the row skipping unknown by slave
fields' data.
sql/rpl_utility.cc@stripped, 2007-07-20 00:15:01+03:00, aelkin@stripped +2 -2
do not panic if master's cols > slave.
diff -Nrup a/mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test
b/mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test
--- a/mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test 2007-07-19 22:56:04 +03:00
+++ b/mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test 2007-07-20 00:15:00 +03:00
@@ -79,22 +79,22 @@ connection master;
f7 INT DEFAULT '0',
f8 TEXT,
f9 LONGBLOB,
- /* f10 BIT(63), BITS TODO: uncomment here and in all other places */
+ f10 BIT(63),
f11 VARBINARY(64))
ENGINE=$engine_type;
#connection slave;
sync_slave_with_master;
- alter table t1 drop f5, drop f6, drop f7, drop f8, drop f9, /* BITS TODO: drop f10,*/
drop f11;
+ alter table t1 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
connection master;
INSERT into t1 values (1, 1, 1, 'first',
- 1.0, 'yksi', 1, 'lounge of happiness', 'very fat blob', /*
b'01010101010101', */ 0x123456);
+ 1.0, 'yksi', 1, 'lounge of happiness', 'very fat blob',
b'01010101010101', 0x123456);
INSERT into t1 values (2, 2, 2, 'second',
- 2.0, 'kaks', 2, 'got stolen from the paradise', 'very fat blob',
/* b'01010101010101', */ 0x123456),
+ 2.0, 'kaks', 2, 'got stolen from the paradise', 'very fat blob',
b'01010101010101', 0x123456),
(3, 3, 3, 'third',
- 3.0, 'kolm', 3, 'got stolen from the paradise', 'very fat blob',
/* b'01010101010101', */ 0x123456);
+ 3.0, 'kolm', 3, 'got stolen from the paradise', 'very fat blob',
b'01010101010101', 0x123456);
update t1 set f4= 'next' where f1=1;
delete from t1 where f1=1;
@@ -173,7 +173,7 @@ connection master;
f23 TINYTEXT,
f24 YEAR,
f25 BINARY(255),
- /* f26 BIT(64), */
+ f26 BIT(64),
f27 CHAR(255),
f28 DECIMAL(30,7),
f29 DOUBLE,
@@ -195,7 +195,7 @@ connection master;
drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11,
drop f12, drop f13, drop f14, drop f15, drop f16, drop f17, drop f18,
drop f19, drop f20, drop f21, drop f22, drop f23, drop f24, drop f25,
- /* BITS TODO: uncomment! drop f26,*/ drop f27, drop f28, drop f29, drop f30, drop
f31, drop f32,
+ drop f26, drop f27, drop f28, drop f29, drop f30, drop f31, drop f32,
drop f33, drop f34, drop f35;
@@ -233,7 +233,7 @@ connection master;
/* f23 TINYTEXT, */ '3',
/* f24 YEAR, */ 3000,
/* f25 BINARY(255), */ 'three_33333',
- /* f26 BIT(64), */ /* b'011', */
+ /* f26 BIT(64), */ b'011',
/* f27 CHAR(255), */ 'three',
/* f28 DECIMAL(30,7), */ 3.333,
/* f29 DOUBLE, */ 3.333333333333333333333333333,
@@ -267,7 +267,7 @@ connection master;
/* f23 TINYTEXT, */ '3',
/* f24 YEAR, */ 3000,
/* f25 BINARY(255), */ 'three_33333',
- /* f26 BIT(64), */ /* b'011', */
+ /* f26 BIT(64), */ b'011',
/* f27 CHAR(255), */ 'three',
/* f28 DECIMAL(30,7), */ 3.333,
/* f29 DOUBLE, */ 3.333333333333333333333333333,
@@ -300,7 +300,7 @@ connection master;
/* f23 TINYTEXT, */ '3',
/* f24 YEAR, */ 3000,
/* f25 BINARY(255), */ 'three_33333',
- /* f26 BIT(64), */ /* b'011', */
+ /* f26 BIT(64), */ b'011',
/* f27 CHAR(255), */ 'three',
/* f28 DECIMAL(30,7), */ 3.333,
/* f29 DOUBLE, */ 3.333333333333333333333333333,
@@ -333,7 +333,7 @@ connection master;
/* f23 TINYTEXT, */ '3',
/* f24 YEAR, */ 3000,
/* f25 BINARY(255), */ 'three_33333',
- /* f26 BIT(64), */ /* b'011',*/
+ /* f26 BIT(64), */ b'011',
/* f27 CHAR(255), */ 'three',
/* f28 DECIMAL(30,7), */ 3.333,
/* f29 DOUBLE, */ 3.333333333333333333333333333,
@@ -357,28 +357,16 @@ connection master;
connection master;
update t31 set f5=555555555555555 where f3=6;
-
-#connection slave;
- sync_slave_with_master;
-connection master;
update t31 set f2=2 where f3=2;
-#connection slave;
- sync_slave_with_master;
-connection master;
update t31 set f1=NULL where f3=1;
-#connection slave;
- sync_slave_with_master;
-connection master;
update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
-#connection slave;
- sync_slave_with_master;
- select * from t31;
-connection master;
+
delete from t1;
delete from t2;
delete from t3;
delete from t4;
delete from t31;
+
#connection slave;
sync_slave_with_master;
select * from t31;
Binary files a/mysql-test/r/rpl_extraColmaster_innodb.result and
b/mysql-test/r/rpl_extraColmaster_innodb.result differ
Binary files a/mysql-test/r/rpl_extraColmaster_myisam.result and
b/mysql-test/r/rpl_extraColmaster_myisam.result differ
Binary files a/mysql-test/r/rpl_extraColmaster_ndb.result and
b/mysql-test/r/rpl_extraColmaster_ndb.result differ
diff -Nrup a/mysql-test/t/rpl_extraColmaster_innodb-master.opt
b/mysql-test/t/rpl_extraColmaster_innodb-master.opt
--- a/mysql-test/t/rpl_extraColmaster_innodb-master.opt 2007-07-19 22:56:04 +03:00
+++ b/mysql-test/t/rpl_extraColmaster_innodb-master.opt 2007-07-20 00:15:00 +03:00
@@ -1 +1 @@
---innodb
+ --innodb
diff -Nrup a/mysql-test/t/rpl_extraColmaster_innodb-slave.opt
b/mysql-test/t/rpl_extraColmaster_innodb-slave.opt
--- a/mysql-test/t/rpl_extraColmaster_innodb-slave.opt 2007-07-19 22:56:04 +03:00
+++ b/mysql-test/t/rpl_extraColmaster_innodb-slave.opt 2007-07-20 00:15:01 +03:00
@@ -1 +1 @@
---innodb
+ --innodb
diff -Nrup a/mysql-test/t/rpl_extraColmaster_innodb.test
b/mysql-test/t/rpl_extraColmaster_innodb.test
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/rpl_extraColmaster_innodb.test 2007-07-20 00:15:02 +03:00
@@ -0,0 +1,14 @@
+#############################################################
+# Purpose: To test having extra columns on the master WL#3915
+#############################################################
+
+-- source include/have_binlog_format_row.inc
+-- source include/master-slave.inc
+
+-- source include/have_innodb.inc
+let $engine_type = 'InnoDB';
+
+
+-- source extra/rpl_tests/rpl_extraMaster_Col.test
+
+
diff -Nrup a/mysql-test/t/rpl_extraColmaster_myisam.test
b/mysql-test/t/rpl_extraColmaster_myisam.test
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/rpl_extraColmaster_myisam.test 2007-07-20 00:15:02 +03:00
@@ -0,0 +1,13 @@
+#############################################################
+# Purpose: To test having extra columns on the master WL#3915
+#############################################################
+
+-- source include/have_binlog_format_row.inc
+-- source include/master-slave.inc
+
+let $engine_type = 'MyISAM';
+
+
+-- source extra/rpl_tests/rpl_extraMaster_Col.test
+
+
diff -Nrup a/mysql-test/t/rpl_extraColmaster_ndb.test
b/mysql-test/t/rpl_extraColmaster_ndb.test
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/rpl_extraColmaster_ndb.test 2007-07-20 00:15:02 +03:00
@@ -0,0 +1,11 @@
+###########################################
+# Purpose: Wapper for rpl_extraMaster_Col.test
+# Using NDB
+###########################################
+-- source include/have_binlog_format_mixed_or_row.inc
+-- source include/have_ndb.inc
+-- source include/ndb_master-slave.inc
+let $engine_type = 'NDB';
+-- source extra/rpl_tests/rpl_extraMaster_Col.test
+
+
diff -Nrup a/sql/log_event.cc b/sql/log_event.cc
--- a/sql/log_event.cc 2007-07-19 22:56:02 +03:00
+++ b/sql/log_event.cc 2007-07-20 00:15:01 +03:00
@@ -7146,6 +7146,7 @@ copy_extra_record_fields(TABLE *table,
size_t master_reclength,
my_ptrdiff_t master_fields)
{
+ DBUG_ENTER("copy_extra_record_fields(table, master_reclen, master_fields)");
DBUG_PRINT("info", ("Copying to 0x%lx "
"from field %lu at offset %lu "
"to field %d at offset %lu",
@@ -7157,6 +7158,10 @@ copy_extra_record_fields(TABLE *table,
master into record[0] (which are basically the default values).
*/
DBUG_ASSERT(master_reclength <= table->s->reclength);
+
+ if (table->s->fields < (uint) master_fields)
+ DBUG_RETURN(0);
+
if (master_reclength < table->s->reclength)
bmove_align(table->record[0] + master_reclength,
table->record[1] + master_reclength,
@@ -7213,7 +7218,7 @@ copy_extra_record_fields(TABLE *table,
}
}
}
- return 0; // All OK
+ DBUG_RETURN(0); // All OK
}
#define DBUG_PRINT_BITSET(N,FRM,BS) \
@@ -7798,12 +7803,6 @@ int Delete_rows_log_event::do_prepare_ro
uchar const **const row_end)
{
DBUG_ASSERT(row_start && row_end);
- /*
- This assertion actually checks that there is at least as many
- columns on the slave as on the master.
- */
- DBUG_ASSERT(table->s->fields >= m_width);
-
if (int error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end,
&m_master_reclength, table->read_set,
DELETE_ROWS_EVENT))
{
@@ -7981,12 +7980,6 @@ int Update_rows_log_event::do_prepare_ro
{
int error;
DBUG_ASSERT(row_start && row_end);
- /*
- This assertion actually checks that there is at least as many
- columns on the slave as on the master.
- */
- DBUG_ASSERT(table->s->fields >= m_width);
-
/*
We need to perform some juggling below since unpack_row() always
unpacks into table->record[0]. For more information, see the
diff -Nrup a/sql/rpl_record.cc b/sql/rpl_record.cc
--- a/sql/rpl_record.cc 2007-07-19 22:56:03 +03:00
+++ b/sql/rpl_record.cc 2007-07-20 00:15:01 +03:00
@@ -144,7 +144,8 @@ pack_row(TABLE *table, MY_BITMAP const*
@param rli Relay log info
@param table Table to unpack into
@param colcnt Number of columns to read from record
- @param row Packed row data
+ @param row_data
+ Packed row data
@param cols Pointer to columns data to fill in
@param row_end Pointer to variable that will hold the value of the
one-after-end position for the row
@@ -194,7 +195,7 @@ unpack_row(RELAY_LOG_INFO const *rli,
unsigned int null_bits= *null_ptr++;
uint i= 0;
table_def *tabledef= const_cast<RELAY_LOG_INFO*>(rli)->get_tabledef(table);
- for (field_ptr= begin_ptr ; field_ptr < end_ptr && *field_ptr ; ++field_ptr)
+ for (field_ptr= begin_ptr; field_ptr < end_ptr && *field_ptr;
++field_ptr,i++)
{
Field *const f= *field_ptr;
@@ -235,7 +236,27 @@ unpack_row(RELAY_LOG_INFO const *rli,
bitmap_set_bit(rw_set, f->field_index);
null_mask <<= 1;
- i++;
+ }
+ }
+
+ /*
+ throw away master's extra fields
+ */
+ for (; i < cols->n_bits; i++)
+ {
+ if (bitmap_is_set(cols, i))
+ {
+ if ((null_mask & 0xFF) == 0)
+ {
+ DBUG_ASSERT(null_ptr < row_data + master_null_byte_count);
+ null_mask= 1U;
+ null_bits= *null_ptr++;
+ }
+ DBUG_ASSERT(null_mask & 0xFF); // One of the 8 LSB should be set
+
+ if (!((null_bits & null_mask) && tabledef->maybe_null(i)))
+ pack_ptr+= tabledef->get_field_size(i, (uchar *) pack_ptr);
+ null_mask <<= 1;
}
}
diff -Nrup a/sql/rpl_utility.cc b/sql/rpl_utility.cc
--- a/sql/rpl_utility.cc 2007-07-19 22:56:03 +03:00
+++ b/sql/rpl_utility.cc 2007-07-20 00:15:01 +03:00
@@ -142,13 +142,13 @@ table_def::compatible_with(RELAY_LOG_INF
if (tsh->fields < size())
{
DBUG_ASSERT(tsh->db.str && tsh->table_name.str);
- error= 1;
+ error= 0;
char buf[256];
my_snprintf(buf, sizeof(buf), "Table width mismatch - "
"received %u columns, %s.%s has %u columns",
(uint) size(), tsh->db.str, tsh->table_name.str,
tsh->fields);
- rli->report(ERROR_LEVEL, ER_BINLOG_ROW_WRONG_TABLE_DEF,
+ rli->report(WARNING_LEVEL, ER_BINLOG_ROW_WRONG_TABLE_DEF,
ER(ER_BINLOG_ROW_WRONG_TABLE_DEF), buf);
}
| Thread |
|---|
| • bk commit into 5.1 tree (aelkin:1.2540) | Andrei Elkin | 19 Jul |