Loading mysql-test/extra/rpl_tests/rpl_row_tabledefs.test +66 −2 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ eval CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=$engine_type; eval CREATE TABLE t4 (a INT) ENGINE=$engine_type; eval CREATE TABLE t5 (a INT, b INT, c INT) ENGINE=$engine_type; eval CREATE TABLE t6 (a INT, b INT, c INT) ENGINE=$engine_type; eval CREATE TABLE t7 (a INT NOT NULL) ENGINE=$engine_type; eval CREATE TABLE t8 (a INT NOT NULL) ENGINE=$engine_type; # Table used to detect that slave is running eval CREATE TABLE t9 (a INT) ENGINE=$engine_type; Loading Loading @@ -53,6 +55,17 @@ ALTER TABLE t5 MODIFY b FLOAT; # ... change the type of the last column of table 't6' ALTER TABLE t6 MODIFY c FLOAT; # ... add one byte worth of null bytes to the table on the slave ALTER TABLE t7 ADD e1 INT, ADD e2 INT, ADD e3 INT, ADD e4 INT, ADD e5 INT, ADD e6 INT, ADD e7 INT, ADD e8 INT; # ... add 8 columns that are nullable: t8 will not be entirely # nullable and have no null bits (just an X bit) ALTER TABLE t8 ADD e1 INT NOT NULL DEFAULT 0, ADD e2 INT NOT NULL DEFAULT 0, ADD e3 INT NOT NULL DEFAULT 0, ADD e4 INT NOT NULL DEFAULT 0, ADD e5 INT NOT NULL DEFAULT 0, ADD e6 INT NOT NULL DEFAULT 0, ADD e7 INT NOT NULL DEFAULT 0, ADD e8 INT NOT NULL DEFAULT 0; # Insert some values for tables on slave side. These should not be # modified when the row from the master is applied. INSERT INTO t1_int VALUES (2, 4, 4711); Loading Loading @@ -90,7 +103,7 @@ SELECT a,b,x FROM t1_int; SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit; SELECT a,b,x FROM t1_char; # Each of these should generate an error and stop the slave # Each of these inserts should generate an error and stop the slave connection master; INSERT INTO t9 VALUES (2); Loading Loading @@ -162,9 +175,60 @@ wait_for_slave_to_stop; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; START SLAVE; connection master; INSERT INTO t9 VALUES (6); sync_slave_with_master; --replace_result $MASTER_MYPORT MASTER_PORT --replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # --query_vertical SHOW SLAVE STATUS # Testing some tables extra field that can be null and cannot be null # (but have default values) connection master; INSERT INTO t7 VALUES (1),(2),(3); INSERT INTO t8 VALUES (1),(2),(3); SELECT * FROM t7; SELECT * FROM t8; sync_slave_with_master; SELECT * FROM t7; SELECT * FROM t8; # We will now try to update and then delete a row on the master where # the extra field on the slave does not have a default value. This # update should not generate an error even though there is no default # for the extra column. --echo **** On Master **** connection master; TRUNCATE t1_nodef; SET SQL_LOG_BIN=0; INSERT INTO t1_nodef VALUES (1,2); INSERT INTO t1_nodef VALUES (2,4); SET SQL_LOG_BIN=1; --echo **** On Slave **** connection slave; INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); --echo **** On Master **** connection master; UPDATE t1_nodef SET b=2*b WHERE a=1; SELECT * FROM t1_nodef; --echo **** On Slave **** sync_slave_with_master; SELECT * FROM t1_nodef; --echo **** On Master **** connection master; DELETE FROM t1_nodef WHERE a=2; SELECT * FROM t1_nodef; --echo **** On Slave **** sync_slave_with_master; SELECT * FROM t1_nodef; --echo **** Cleanup **** connection master; --disable_warnings DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t7,t8,t9; --enable_warnings sync_slave_with_master; mysql-test/r/rpl_row_tabledefs_2myisam.result +96 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE='MyISAM'; CREATE TABLE t4 (a INT) ENGINE='MyISAM'; CREATE TABLE t5 (a INT, b INT, c INT) ENGINE='MyISAM'; CREATE TABLE t6 (a INT, b INT, c INT) ENGINE='MyISAM'; CREATE TABLE t7 (a INT NOT NULL) ENGINE='MyISAM'; CREATE TABLE t8 (a INT NOT NULL) ENGINE='MyISAM'; CREATE TABLE t9 (a INT) ENGINE='MyISAM'; ALTER TABLE t1_int ADD x INT DEFAULT 42; ALTER TABLE t1_bit Loading @@ -28,6 +30,12 @@ ALTER TABLE t2 DROP b; ALTER TABLE t4 MODIFY a FLOAT; ALTER TABLE t5 MODIFY b FLOAT; ALTER TABLE t6 MODIFY c FLOAT; ALTER TABLE t7 ADD e1 INT, ADD e2 INT, ADD e3 INT, ADD e4 INT, ADD e5 INT, ADD e6 INT, ADD e7 INT, ADD e8 INT; ALTER TABLE t8 ADD e1 INT NOT NULL DEFAULT 0, ADD e2 INT NOT NULL DEFAULT 0, ADD e3 INT NOT NULL DEFAULT 0, ADD e4 INT NOT NULL DEFAULT 0, ADD e5 INT NOT NULL DEFAULT 0, ADD e6 INT NOT NULL DEFAULT 0, ADD e7 INT NOT NULL DEFAULT 0, ADD e8 INT NOT NULL DEFAULT 0; INSERT INTO t1_int VALUES (2, 4, 4711); INSERT INTO t1_char VALUES (2, 4, 'Foo is a bar'); INSERT INTO t1_bit VALUES (2, 4, b'101', b'11100', b'01'); Loading Loading @@ -282,5 +290,92 @@ Master_SSL_Key Seconds_Behind_Master # SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; START SLAVE; INSERT INTO t9 VALUES (6); SHOW SLAVE STATUS; Slave_IO_State # Master_Host 127.0.0.1 Master_User root Master_Port MASTER_PORT Connect_Retry 1 Master_Log_File master-bin.000001 Read_Master_Log_Pos # Relay_Log_File # Relay_Log_Pos # Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno 0 Last_Error Skip_Counter 0 Exec_Master_Log_Pos # Relay_Log_Space # Until_Condition None Until_Log_File Until_Log_Pos 0 Master_SSL_Allowed No Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master # INSERT INTO t7 VALUES (1),(2),(3); INSERT INTO t8 VALUES (1),(2),(3); SELECT * FROM t7; a 1 2 3 SELECT * FROM t8; a 1 2 3 SELECT * FROM t7; a e1 e2 e3 e4 e5 e6 e7 e8 1 NULL NULL NULL NULL NULL NULL NULL NULL 2 NULL NULL NULL NULL NULL NULL NULL NULL 3 NULL NULL NULL NULL NULL NULL NULL NULL SELECT * FROM t8; a e1 e2 e3 e4 e5 e6 e7 e8 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 **** On Master **** TRUNCATE t1_nodef; SET SQL_LOG_BIN=0; INSERT INTO t1_nodef VALUES (1,2); INSERT INTO t1_nodef VALUES (2,4); SET SQL_LOG_BIN=1; **** On Slave **** INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); **** On Master **** UPDATE t1_nodef SET b=2*b WHERE a=1; SELECT * FROM t1_nodef; a b 1 4 2 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 2 4 6 **** On Master **** DELETE FROM t1_nodef WHERE a=2; SELECT * FROM t1_nodef; a b 1 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 **** Cleanup **** DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t7,t8,t9; mysql-test/r/rpl_row_tabledefs_3innodb.result +96 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE='InnoDB'; CREATE TABLE t4 (a INT) ENGINE='InnoDB'; CREATE TABLE t5 (a INT, b INT, c INT) ENGINE='InnoDB'; CREATE TABLE t6 (a INT, b INT, c INT) ENGINE='InnoDB'; CREATE TABLE t7 (a INT NOT NULL) ENGINE='InnoDB'; CREATE TABLE t8 (a INT NOT NULL) ENGINE='InnoDB'; CREATE TABLE t9 (a INT) ENGINE='InnoDB'; ALTER TABLE t1_int ADD x INT DEFAULT 42; ALTER TABLE t1_bit Loading @@ -28,6 +30,12 @@ ALTER TABLE t2 DROP b; ALTER TABLE t4 MODIFY a FLOAT; ALTER TABLE t5 MODIFY b FLOAT; ALTER TABLE t6 MODIFY c FLOAT; ALTER TABLE t7 ADD e1 INT, ADD e2 INT, ADD e3 INT, ADD e4 INT, ADD e5 INT, ADD e6 INT, ADD e7 INT, ADD e8 INT; ALTER TABLE t8 ADD e1 INT NOT NULL DEFAULT 0, ADD e2 INT NOT NULL DEFAULT 0, ADD e3 INT NOT NULL DEFAULT 0, ADD e4 INT NOT NULL DEFAULT 0, ADD e5 INT NOT NULL DEFAULT 0, ADD e6 INT NOT NULL DEFAULT 0, ADD e7 INT NOT NULL DEFAULT 0, ADD e8 INT NOT NULL DEFAULT 0; INSERT INTO t1_int VALUES (2, 4, 4711); INSERT INTO t1_char VALUES (2, 4, 'Foo is a bar'); INSERT INTO t1_bit VALUES (2, 4, b'101', b'11100', b'01'); Loading Loading @@ -282,5 +290,92 @@ Master_SSL_Key Seconds_Behind_Master # SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; START SLAVE; INSERT INTO t9 VALUES (6); SHOW SLAVE STATUS; Slave_IO_State # Master_Host 127.0.0.1 Master_User root Master_Port MASTER_PORT Connect_Retry 1 Master_Log_File master-bin.000001 Read_Master_Log_Pos # Relay_Log_File # Relay_Log_Pos # Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno 0 Last_Error Skip_Counter 0 Exec_Master_Log_Pos # Relay_Log_Space # Until_Condition None Until_Log_File Until_Log_Pos 0 Master_SSL_Allowed No Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master # INSERT INTO t7 VALUES (1),(2),(3); INSERT INTO t8 VALUES (1),(2),(3); SELECT * FROM t7; a 1 2 3 SELECT * FROM t8; a 1 2 3 SELECT * FROM t7; a e1 e2 e3 e4 e5 e6 e7 e8 1 NULL NULL NULL NULL NULL NULL NULL NULL 2 NULL NULL NULL NULL NULL NULL NULL NULL 3 NULL NULL NULL NULL NULL NULL NULL NULL SELECT * FROM t8; a e1 e2 e3 e4 e5 e6 e7 e8 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 **** On Master **** TRUNCATE t1_nodef; SET SQL_LOG_BIN=0; INSERT INTO t1_nodef VALUES (1,2); INSERT INTO t1_nodef VALUES (2,4); SET SQL_LOG_BIN=1; **** On Slave **** INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); **** On Master **** UPDATE t1_nodef SET b=2*b WHERE a=1; SELECT * FROM t1_nodef; a b 1 4 2 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 2 4 6 **** On Master **** DELETE FROM t1_nodef WHERE a=2; SELECT * FROM t1_nodef; a b 1 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 **** Cleanup **** DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t7,t8,t9; sql/field.cc +8 −2 Original line number Diff line number Diff line Loading @@ -1261,7 +1261,10 @@ my_size_t Field::do_last_null_byte() const { DBUG_ASSERT(null_ptr == NULL || (byte*) null_ptr >= table->record[0]); return null_ptr ? (byte*) null_ptr - table->record[0] + 1 : 0; if (null_ptr) return (byte*) null_ptr - table->record[0] + 1; else return LAST_NULL_BYTE_UNDEF; } Loading Loading @@ -8122,7 +8125,10 @@ Field_bit::do_last_null_byte() const else result= bit_ptr; return result ? (byte*) result - table->record[0] + 1 : 0; if (result) return (byte*) result - table->record[0] + 1; else return LAST_NULL_BYTE_UNDEF; } Field *Field_bit::new_key_field(MEM_ROOT *root, Loading sql/field.h +28 −3 Original line number Diff line number Diff line Loading @@ -218,10 +218,24 @@ class Field inline bool maybe_null(void) { return null_ptr != 0 || table->maybe_null; } inline bool real_maybe_null(void) { return null_ptr != 0; } enum { LAST_NULL_BYTE_UNDEF= 0 }; /* Find the position of the last null byte for the field. SYNOPSIS last_null_byte() DESCRIPTION Return a pointer to the last byte of the null bytes where the field conceptually is placed. In the case that the field does not use any bits of the null bytes, a null pointer is returned. field conceptually is placed. RETURN VALUE The position of the last null byte relative to the beginning of the record. If the field does not use any bits of the null bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned. */ my_size_t last_null_byte() const { my_size_t bytes= do_last_null_byte(); Loading Loading @@ -392,6 +406,17 @@ class Field friend class Item_func_group_concat; private: /* Primitive for implementing last_null_byte(). SYNOPSIS do_last_null_byte() DESCRIPTION Primitive for the implementation of the last_null_byte() function. This represents the inheritance interface and can be overridden by subclasses. */ virtual my_size_t do_last_null_byte() const; }; Loading Loading
mysql-test/extra/rpl_tests/rpl_row_tabledefs.test +66 −2 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ eval CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=$engine_type; eval CREATE TABLE t4 (a INT) ENGINE=$engine_type; eval CREATE TABLE t5 (a INT, b INT, c INT) ENGINE=$engine_type; eval CREATE TABLE t6 (a INT, b INT, c INT) ENGINE=$engine_type; eval CREATE TABLE t7 (a INT NOT NULL) ENGINE=$engine_type; eval CREATE TABLE t8 (a INT NOT NULL) ENGINE=$engine_type; # Table used to detect that slave is running eval CREATE TABLE t9 (a INT) ENGINE=$engine_type; Loading Loading @@ -53,6 +55,17 @@ ALTER TABLE t5 MODIFY b FLOAT; # ... change the type of the last column of table 't6' ALTER TABLE t6 MODIFY c FLOAT; # ... add one byte worth of null bytes to the table on the slave ALTER TABLE t7 ADD e1 INT, ADD e2 INT, ADD e3 INT, ADD e4 INT, ADD e5 INT, ADD e6 INT, ADD e7 INT, ADD e8 INT; # ... add 8 columns that are nullable: t8 will not be entirely # nullable and have no null bits (just an X bit) ALTER TABLE t8 ADD e1 INT NOT NULL DEFAULT 0, ADD e2 INT NOT NULL DEFAULT 0, ADD e3 INT NOT NULL DEFAULT 0, ADD e4 INT NOT NULL DEFAULT 0, ADD e5 INT NOT NULL DEFAULT 0, ADD e6 INT NOT NULL DEFAULT 0, ADD e7 INT NOT NULL DEFAULT 0, ADD e8 INT NOT NULL DEFAULT 0; # Insert some values for tables on slave side. These should not be # modified when the row from the master is applied. INSERT INTO t1_int VALUES (2, 4, 4711); Loading Loading @@ -90,7 +103,7 @@ SELECT a,b,x FROM t1_int; SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit; SELECT a,b,x FROM t1_char; # Each of these should generate an error and stop the slave # Each of these inserts should generate an error and stop the slave connection master; INSERT INTO t9 VALUES (2); Loading Loading @@ -162,9 +175,60 @@ wait_for_slave_to_stop; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; START SLAVE; connection master; INSERT INTO t9 VALUES (6); sync_slave_with_master; --replace_result $MASTER_MYPORT MASTER_PORT --replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # --query_vertical SHOW SLAVE STATUS # Testing some tables extra field that can be null and cannot be null # (but have default values) connection master; INSERT INTO t7 VALUES (1),(2),(3); INSERT INTO t8 VALUES (1),(2),(3); SELECT * FROM t7; SELECT * FROM t8; sync_slave_with_master; SELECT * FROM t7; SELECT * FROM t8; # We will now try to update and then delete a row on the master where # the extra field on the slave does not have a default value. This # update should not generate an error even though there is no default # for the extra column. --echo **** On Master **** connection master; TRUNCATE t1_nodef; SET SQL_LOG_BIN=0; INSERT INTO t1_nodef VALUES (1,2); INSERT INTO t1_nodef VALUES (2,4); SET SQL_LOG_BIN=1; --echo **** On Slave **** connection slave; INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); --echo **** On Master **** connection master; UPDATE t1_nodef SET b=2*b WHERE a=1; SELECT * FROM t1_nodef; --echo **** On Slave **** sync_slave_with_master; SELECT * FROM t1_nodef; --echo **** On Master **** connection master; DELETE FROM t1_nodef WHERE a=2; SELECT * FROM t1_nodef; --echo **** On Slave **** sync_slave_with_master; SELECT * FROM t1_nodef; --echo **** Cleanup **** connection master; --disable_warnings DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t7,t8,t9; --enable_warnings sync_slave_with_master;
mysql-test/r/rpl_row_tabledefs_2myisam.result +96 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE='MyISAM'; CREATE TABLE t4 (a INT) ENGINE='MyISAM'; CREATE TABLE t5 (a INT, b INT, c INT) ENGINE='MyISAM'; CREATE TABLE t6 (a INT, b INT, c INT) ENGINE='MyISAM'; CREATE TABLE t7 (a INT NOT NULL) ENGINE='MyISAM'; CREATE TABLE t8 (a INT NOT NULL) ENGINE='MyISAM'; CREATE TABLE t9 (a INT) ENGINE='MyISAM'; ALTER TABLE t1_int ADD x INT DEFAULT 42; ALTER TABLE t1_bit Loading @@ -28,6 +30,12 @@ ALTER TABLE t2 DROP b; ALTER TABLE t4 MODIFY a FLOAT; ALTER TABLE t5 MODIFY b FLOAT; ALTER TABLE t6 MODIFY c FLOAT; ALTER TABLE t7 ADD e1 INT, ADD e2 INT, ADD e3 INT, ADD e4 INT, ADD e5 INT, ADD e6 INT, ADD e7 INT, ADD e8 INT; ALTER TABLE t8 ADD e1 INT NOT NULL DEFAULT 0, ADD e2 INT NOT NULL DEFAULT 0, ADD e3 INT NOT NULL DEFAULT 0, ADD e4 INT NOT NULL DEFAULT 0, ADD e5 INT NOT NULL DEFAULT 0, ADD e6 INT NOT NULL DEFAULT 0, ADD e7 INT NOT NULL DEFAULT 0, ADD e8 INT NOT NULL DEFAULT 0; INSERT INTO t1_int VALUES (2, 4, 4711); INSERT INTO t1_char VALUES (2, 4, 'Foo is a bar'); INSERT INTO t1_bit VALUES (2, 4, b'101', b'11100', b'01'); Loading Loading @@ -282,5 +290,92 @@ Master_SSL_Key Seconds_Behind_Master # SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; START SLAVE; INSERT INTO t9 VALUES (6); SHOW SLAVE STATUS; Slave_IO_State # Master_Host 127.0.0.1 Master_User root Master_Port MASTER_PORT Connect_Retry 1 Master_Log_File master-bin.000001 Read_Master_Log_Pos # Relay_Log_File # Relay_Log_Pos # Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno 0 Last_Error Skip_Counter 0 Exec_Master_Log_Pos # Relay_Log_Space # Until_Condition None Until_Log_File Until_Log_Pos 0 Master_SSL_Allowed No Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master # INSERT INTO t7 VALUES (1),(2),(3); INSERT INTO t8 VALUES (1),(2),(3); SELECT * FROM t7; a 1 2 3 SELECT * FROM t8; a 1 2 3 SELECT * FROM t7; a e1 e2 e3 e4 e5 e6 e7 e8 1 NULL NULL NULL NULL NULL NULL NULL NULL 2 NULL NULL NULL NULL NULL NULL NULL NULL 3 NULL NULL NULL NULL NULL NULL NULL NULL SELECT * FROM t8; a e1 e2 e3 e4 e5 e6 e7 e8 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 **** On Master **** TRUNCATE t1_nodef; SET SQL_LOG_BIN=0; INSERT INTO t1_nodef VALUES (1,2); INSERT INTO t1_nodef VALUES (2,4); SET SQL_LOG_BIN=1; **** On Slave **** INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); **** On Master **** UPDATE t1_nodef SET b=2*b WHERE a=1; SELECT * FROM t1_nodef; a b 1 4 2 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 2 4 6 **** On Master **** DELETE FROM t1_nodef WHERE a=2; SELECT * FROM t1_nodef; a b 1 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 **** Cleanup **** DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t7,t8,t9;
mysql-test/r/rpl_row_tabledefs_3innodb.result +96 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE='InnoDB'; CREATE TABLE t4 (a INT) ENGINE='InnoDB'; CREATE TABLE t5 (a INT, b INT, c INT) ENGINE='InnoDB'; CREATE TABLE t6 (a INT, b INT, c INT) ENGINE='InnoDB'; CREATE TABLE t7 (a INT NOT NULL) ENGINE='InnoDB'; CREATE TABLE t8 (a INT NOT NULL) ENGINE='InnoDB'; CREATE TABLE t9 (a INT) ENGINE='InnoDB'; ALTER TABLE t1_int ADD x INT DEFAULT 42; ALTER TABLE t1_bit Loading @@ -28,6 +30,12 @@ ALTER TABLE t2 DROP b; ALTER TABLE t4 MODIFY a FLOAT; ALTER TABLE t5 MODIFY b FLOAT; ALTER TABLE t6 MODIFY c FLOAT; ALTER TABLE t7 ADD e1 INT, ADD e2 INT, ADD e3 INT, ADD e4 INT, ADD e5 INT, ADD e6 INT, ADD e7 INT, ADD e8 INT; ALTER TABLE t8 ADD e1 INT NOT NULL DEFAULT 0, ADD e2 INT NOT NULL DEFAULT 0, ADD e3 INT NOT NULL DEFAULT 0, ADD e4 INT NOT NULL DEFAULT 0, ADD e5 INT NOT NULL DEFAULT 0, ADD e6 INT NOT NULL DEFAULT 0, ADD e7 INT NOT NULL DEFAULT 0, ADD e8 INT NOT NULL DEFAULT 0; INSERT INTO t1_int VALUES (2, 4, 4711); INSERT INTO t1_char VALUES (2, 4, 'Foo is a bar'); INSERT INTO t1_bit VALUES (2, 4, b'101', b'11100', b'01'); Loading Loading @@ -282,5 +290,92 @@ Master_SSL_Key Seconds_Behind_Master # SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2; START SLAVE; INSERT INTO t9 VALUES (6); SHOW SLAVE STATUS; Slave_IO_State # Master_Host 127.0.0.1 Master_User root Master_Port MASTER_PORT Connect_Retry 1 Master_Log_File master-bin.000001 Read_Master_Log_Pos # Relay_Log_File # Relay_Log_Pos # Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno 0 Last_Error Skip_Counter 0 Exec_Master_Log_Pos # Relay_Log_Space # Until_Condition None Until_Log_File Until_Log_Pos 0 Master_SSL_Allowed No Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master # INSERT INTO t7 VALUES (1),(2),(3); INSERT INTO t8 VALUES (1),(2),(3); SELECT * FROM t7; a 1 2 3 SELECT * FROM t8; a 1 2 3 SELECT * FROM t7; a e1 e2 e3 e4 e5 e6 e7 e8 1 NULL NULL NULL NULL NULL NULL NULL NULL 2 NULL NULL NULL NULL NULL NULL NULL NULL 3 NULL NULL NULL NULL NULL NULL NULL NULL SELECT * FROM t8; a e1 e2 e3 e4 e5 e6 e7 e8 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 **** On Master **** TRUNCATE t1_nodef; SET SQL_LOG_BIN=0; INSERT INTO t1_nodef VALUES (1,2); INSERT INTO t1_nodef VALUES (2,4); SET SQL_LOG_BIN=1; **** On Slave **** INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); **** On Master **** UPDATE t1_nodef SET b=2*b WHERE a=1; SELECT * FROM t1_nodef; a b 1 4 2 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 2 4 6 **** On Master **** DELETE FROM t1_nodef WHERE a=2; SELECT * FROM t1_nodef; a b 1 4 **** On Slave **** SELECT * FROM t1_nodef; a b x 1 4 3 **** Cleanup **** DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9; DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t7,t8,t9;
sql/field.cc +8 −2 Original line number Diff line number Diff line Loading @@ -1261,7 +1261,10 @@ my_size_t Field::do_last_null_byte() const { DBUG_ASSERT(null_ptr == NULL || (byte*) null_ptr >= table->record[0]); return null_ptr ? (byte*) null_ptr - table->record[0] + 1 : 0; if (null_ptr) return (byte*) null_ptr - table->record[0] + 1; else return LAST_NULL_BYTE_UNDEF; } Loading Loading @@ -8122,7 +8125,10 @@ Field_bit::do_last_null_byte() const else result= bit_ptr; return result ? (byte*) result - table->record[0] + 1 : 0; if (result) return (byte*) result - table->record[0] + 1; else return LAST_NULL_BYTE_UNDEF; } Field *Field_bit::new_key_field(MEM_ROOT *root, Loading
sql/field.h +28 −3 Original line number Diff line number Diff line Loading @@ -218,10 +218,24 @@ class Field inline bool maybe_null(void) { return null_ptr != 0 || table->maybe_null; } inline bool real_maybe_null(void) { return null_ptr != 0; } enum { LAST_NULL_BYTE_UNDEF= 0 }; /* Find the position of the last null byte for the field. SYNOPSIS last_null_byte() DESCRIPTION Return a pointer to the last byte of the null bytes where the field conceptually is placed. In the case that the field does not use any bits of the null bytes, a null pointer is returned. field conceptually is placed. RETURN VALUE The position of the last null byte relative to the beginning of the record. If the field does not use any bits of the null bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned. */ my_size_t last_null_byte() const { my_size_t bytes= do_last_null_byte(); Loading Loading @@ -392,6 +406,17 @@ class Field friend class Item_func_group_concat; private: /* Primitive for implementing last_null_byte(). SYNOPSIS do_last_null_byte() DESCRIPTION Primitive for the implementation of the last_null_byte() function. This represents the inheritance interface and can be overridden by subclasses. */ virtual my_size_t do_last_null_byte() const; }; Loading