mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge mysql.com:/users/lthalmann/bkroot/mysql-5.1-new-rpl
into mysql.com:/users/lthalmann/bk/MERGE/mysql-5.1-merge
This commit is contained in:
@ -114,7 +114,7 @@ test-unit:
|
||||
|
||||
test-ps:
|
||||
cd mysql-test ; \
|
||||
./mysql-test-run.pl $(force) --ps-protocol --mysqld=--binlog-format=statement
|
||||
./mysql-test-run.pl $(force) --ps-protocol --mysqld=--binlog-format=mixed
|
||||
|
||||
test-nr:
|
||||
cd mysql-test ; \
|
||||
@ -125,6 +125,10 @@ test-pr:
|
||||
./mysql-test-run.pl $(force) --ps-protocol --mysqld=--binlog-format=row
|
||||
|
||||
test-ns:
|
||||
cd mysql-test ; \
|
||||
./mysql-test-run.pl $(force) --mysqld=--binlog-format=mixed
|
||||
|
||||
test-binlog-statement:
|
||||
cd mysql-test ; \
|
||||
./mysql-test-run.pl $(force) --mysqld=--binlog-format=statement
|
||||
|
||||
|
@ -59,24 +59,4 @@ insert into t1 values(null);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
# Test of binlogging of INSERT_ID with INSERT DELAYED
|
||||
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
||||
# First, avoid BUG#20627:
|
||||
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
|
||||
# Verify that only one INSERT_ID event is binlogged.
|
||||
insert delayed into t1 values (207);
|
||||
|
||||
# We use sleeps between statements, that's the only way to get a
|
||||
# repeatable binlog in a normal test run and under Valgrind.
|
||||
# It may be that the "binlog missing rows" of BUG#20821 shows up
|
||||
# here.
|
||||
sleep 2;
|
||||
insert delayed into t1 values (null);
|
||||
sleep 2;
|
||||
insert delayed into t1 values (300);
|
||||
sleep 2; # time for the delayed queries to reach disk
|
||||
select * from t1;
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /table_id: [0-9]+/table_id: #/
|
||||
show binlog events from 102;
|
||||
drop table t1;
|
||||
-- source extra/binlog_tests/binlog_insert_delayed.test
|
||||
|
22
mysql-test/extra/binlog_tests/binlog_insert_delayed.test
Normal file
22
mysql-test/extra/binlog_tests/binlog_insert_delayed.test
Normal file
@ -0,0 +1,22 @@
|
||||
# Test of binlogging of INSERT_ID with INSERT DELAYED
|
||||
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
||||
# First, avoid BUG#20627:
|
||||
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
|
||||
# Verify that only one INSERT_ID event is binlogged.
|
||||
# Note, that because of WL#3368 mixed mode binlog records RBR events for the delayed
|
||||
insert delayed into t1 values (207);
|
||||
|
||||
# We use sleeps between statements, that's the only way to get a
|
||||
# repeatable binlog in a normal test run and under Valgrind.
|
||||
# It may be that the "binlog missing rows" of BUG#20821 shows up
|
||||
# here.
|
||||
sleep 2;
|
||||
insert delayed into t1 values (null);
|
||||
sleep 2;
|
||||
insert delayed into t1 values (300);
|
||||
sleep 2; # time for the delayed queries to reach disk
|
||||
select * from t1;
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /table_id: [0-9]+/table_id: #/
|
||||
show binlog events from 102;
|
||||
drop table t1;
|
@ -1,5 +1,5 @@
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
# See if replication of a "LOAD DATA in an autoincrement column"
|
||||
# Honours autoincrement values
|
||||
|
@ -3,11 +3,23 @@
|
||||
|
||||
# Consider making these part of the basic RBR tests.
|
||||
|
||||
-- source include/have_binlog_format_row.inc
|
||||
-- source include/master-slave.inc
|
||||
connection master;
|
||||
--disable_warnings
|
||||
--disable_query_log
|
||||
DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef;
|
||||
DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9;
|
||||
--enable_query_log
|
||||
--enable_warnings
|
||||
sync_slave_with_master;
|
||||
STOP SLAVE;
|
||||
SET GLOBAL SQL_MODE='STRICT_ALL_TABLES';
|
||||
START SLAVE;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t1_int (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t1_bit (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t1_char (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t1_nodef (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t4 (a INT) ENGINE=$engine_type;
|
||||
@ -15,15 +27,25 @@ 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;
|
||||
|
||||
# Table used to detect that slave is running
|
||||
eval CREATE TABLE t9 (a INT PRIMARY KEY) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t9 (a INT) ENGINE=$engine_type;
|
||||
|
||||
sync_slave_with_master;
|
||||
# On the slave, we add one column last in table 't1',
|
||||
ALTER TABLE t1 ADD x INT DEFAULT 42;
|
||||
# ... add one column in the middle of table 't2', and
|
||||
ALTER TABLE t2 ADD x INT DEFAULT 42 AFTER a;
|
||||
# ... add one column first in table 't3'.
|
||||
ALTER TABLE t3 ADD x INT DEFAULT 42 FIRST;
|
||||
|
||||
# On the slave, we add one INT column last in table 't1_int',
|
||||
ALTER TABLE t1_int ADD x INT DEFAULT 42;
|
||||
# ... and add BIT columns last in table 't1_bit' to ensure that we
|
||||
# have at least one extra null byte on the slave,
|
||||
ALTER TABLE t1_bit
|
||||
ADD x BIT(3) DEFAULT b'011',
|
||||
ADD y BIT(5) DEFAULT b'10101',
|
||||
ADD z BIT(2) DEFAULT b'10';
|
||||
# ... and add one CHAR column last in table 't1_char',
|
||||
ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test';
|
||||
# ... and add one non-nullable INT column last in table 't1_text'
|
||||
# with no default,
|
||||
ALTER TABLE t1_nodef ADD x INT NOT NULL;
|
||||
# ... and remove the last column in t2
|
||||
ALTER TABLE t2 DROP b;
|
||||
# ... change the type of the single column in table 't4'
|
||||
ALTER TABLE t4 MODIFY a FLOAT;
|
||||
# ... change the type of the middle column of table 't5'
|
||||
@ -31,19 +53,56 @@ ALTER TABLE t5 MODIFY b FLOAT;
|
||||
# ... change the type of the last column of table 't6'
|
||||
ALTER TABLE t6 MODIFY c FLOAT;
|
||||
|
||||
# Each of these should generate an error and stop the slave
|
||||
# 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);
|
||||
INSERT INTO t1_char VALUES (2, 4, 'Foo is a bar');
|
||||
INSERT INTO t1_bit VALUES (2, 4, b'101', b'11100', b'01');
|
||||
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
INSERT INTO t9 VALUES (1);
|
||||
INSERT INTO t1_int VALUES (1,2);
|
||||
INSERT INTO t1_int VALUES (2,5);
|
||||
INSERT INTO t1_bit VALUES (1,2);
|
||||
INSERT INTO t1_bit VALUES (2,5);
|
||||
INSERT INTO t1_char VALUES (1,2);
|
||||
INSERT INTO t1_char VALUES (2,5);
|
||||
SELECT * FROM t1_int;
|
||||
SELECT * FROM t1_bit;
|
||||
SELECT * FROM t1_char;
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master;
|
||||
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;
|
||||
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
UPDATE t1_int SET b=2*b WHERE a=2;
|
||||
UPDATE t1_char SET b=2*b WHERE a=2;
|
||||
UPDATE t1_bit SET b=2*b WHERE a=2;
|
||||
SELECT * FROM t1_int;
|
||||
SELECT * FROM t1_bit;
|
||||
SELECT * FROM t1_char;
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master;
|
||||
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
|
||||
|
||||
connection master;
|
||||
INSERT INTO t9 VALUES (2);
|
||||
sync_slave_with_master;
|
||||
# Now slave is guaranteed to be running
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (1,2);
|
||||
INSERT INTO t1_nodef VALUES (1,2);
|
||||
connection slave;
|
||||
wait_for_slave_to_stop;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||
--replace_column 1 # 8 # 9 # 23 # 33 #
|
||||
--vertical_results
|
||||
SHOW SLAVE STATUS;
|
||||
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
|
||||
--query_vertical SHOW SLAVE STATUS
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
|
||||
@ -56,24 +115,8 @@ INSERT INTO t2 VALUES (2,4);
|
||||
connection slave;
|
||||
wait_for_slave_to_stop;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||
--replace_column 1 # 8 # 9 # 23 # 33 #
|
||||
--vertical_results
|
||||
SHOW SLAVE STATUS;
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
|
||||
connection master;
|
||||
INSERT INTO t9 VALUES (3);
|
||||
sync_slave_with_master;
|
||||
# Now slave is guaranteed to be running
|
||||
connection master;
|
||||
INSERT INTO t3 VALUES (3,6);
|
||||
connection slave;
|
||||
wait_for_slave_to_stop;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||
--replace_column 1 # 8 # 9 # 23 # 33 #
|
||||
--vertical_results
|
||||
SHOW SLAVE STATUS;
|
||||
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
|
||||
--query_vertical SHOW SLAVE STATUS
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
|
||||
@ -86,9 +129,8 @@ INSERT INTO t4 VALUES (4);
|
||||
connection slave;
|
||||
wait_for_slave_to_stop;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||
--replace_column 1 # 8 # 9 # 23 # 33 #
|
||||
--vertical_results
|
||||
SHOW SLAVE STATUS;
|
||||
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
|
||||
--query_vertical SHOW SLAVE STATUS
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
|
||||
@ -101,9 +143,8 @@ INSERT INTO t5 VALUES (5,10,25);
|
||||
connection slave;
|
||||
wait_for_slave_to_stop;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||
--replace_column 1 # 8 # 9 # 23 # 33 #
|
||||
--vertical_results
|
||||
SHOW SLAVE STATUS;
|
||||
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
|
||||
--query_vertical SHOW SLAVE STATUS
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
|
||||
@ -116,14 +157,14 @@ INSERT INTO t6 VALUES (6,12,36);
|
||||
connection slave;
|
||||
wait_for_slave_to_stop;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||
--replace_column 1 # 8 # 9 # 23 # 33 #
|
||||
--vertical_results
|
||||
SHOW SLAVE STATUS;
|
||||
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
|
||||
--query_vertical SHOW SLAVE STATUS
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
|
||||
connection master;
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t9;
|
||||
DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef;
|
||||
DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9;
|
||||
--enable_warnings
|
||||
sync_slave_with_master;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
create table t1 (word char(20) not null);
|
||||
|
@ -2,7 +2,7 @@
|
||||
# This test will fail if the server/client does not support enough charsets.
|
||||
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
source include/master-slave.inc;
|
||||
--disable_warnings
|
||||
|
4
mysql-test/include/have_binlog_format_mixed.inc
Normal file
4
mysql-test/include/have_binlog_format_mixed.inc
Normal file
@ -0,0 +1,4 @@
|
||||
-- require r/have_binlog_format_mixed.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
enable_query_log;
|
@ -0,0 +1,5 @@
|
||||
--require r/have_binlog_format_statement.require
|
||||
--disable_query_log
|
||||
--replace_result MIXED STATEMENT
|
||||
show variables like "binlog_format";
|
||||
--enable_query_log
|
@ -28,7 +28,6 @@ INSERT INTO t1 VALUES(412,1,'Testing MySQL databases is a cool ',
|
||||
select id,hex(b1),vc,bc,d,f,total,y,t from t1 order by id;
|
||||
|
||||
sync_slave_with_master;
|
||||
--sleep 5
|
||||
--echo --- Select from t1 on slave ---
|
||||
select id,hex(b1),vc,bc,d,f,total,y,t from t1 order by id;
|
||||
|
||||
@ -44,7 +43,6 @@ SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
# into the binlog other wise we will miss the update.
|
||||
|
||||
sync_slave_with_master;
|
||||
--sleep 5
|
||||
--echo --- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
|
||||
@ -56,7 +54,6 @@ DELETE FROM t1 WHERE id = 42;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
|
||||
sync_slave_with_master;
|
||||
--sleep 5
|
||||
--echo --- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
|
||||
|
18
mysql-test/r/binlog_statement_insert_delayed.result
Normal file
18
mysql-test/r/binlog_statement_insert_delayed.result
Normal file
@ -0,0 +1,18 @@
|
||||
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
||||
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
|
||||
insert delayed into t1 values (207);
|
||||
insert delayed into t1 values (null);
|
||||
insert delayed into t1 values (300);
|
||||
select * from t1;
|
||||
a
|
||||
207
|
||||
208
|
||||
300
|
||||
show binlog events from 102;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
|
||||
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (207)
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=208
|
||||
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (null)
|
||||
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (300)
|
||||
drop table t1;
|
@ -172,8 +172,10 @@ master-bin.000001 # Intvar 1 # INSERT_ID=127
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values(null)
|
||||
master-bin.000001 # Query 1 # use `test`; drop table t1
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
|
||||
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (207)
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=208
|
||||
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (null)
|
||||
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (300)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
drop table t1;
|
||||
|
2
mysql-test/r/have_binlog_format_mixed.require
Normal file
2
mysql-test/r/have_binlog_format_mixed.require
Normal file
@ -0,0 +1,2 @@
|
||||
Variable_name Value
|
||||
binlog_format MIXED
|
@ -5,9 +5,6 @@ reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET BINLOG_FORMAT=MIXED;
|
||||
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
|
||||
@@GLOBAL.BINLOG_FORMAT @@SESSION.BINLOG_FORMAT
|
||||
STATEMENT MIXED
|
||||
SET GLOBAL BINLOG_FORMAT=MIXED;
|
||||
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
|
||||
@@GLOBAL.BINLOG_FORMAT @@SESSION.BINLOG_FORMAT
|
||||
|
@ -60,3 +60,43 @@ master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4
|
||||
master-bin.000001 102 Query 1 188 use `test`; CREATE TABLE t1 (a INT)
|
||||
master-bin.000001 188 Table_map 1 227 table_id: # (test.t1)
|
||||
master-bin.000001 227 Write_rows 1 266 table_id: # flags: STMT_END_F
|
||||
DROP TABLE t1;
|
||||
================ Test for BUG#17620 ================
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
**** On Slave ****
|
||||
SET GLOBAL QUERY_CACHE_SIZE=0;
|
||||
**** On Master ****
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
**** On Slave ****
|
||||
SET GLOBAL QUERY_CACHE_SIZE=16*1024*1024;
|
||||
**** On Master ****
|
||||
INSERT INTO t1 VALUES (4),(5),(6);
|
||||
**** On Slave ****
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
**** On Master ****
|
||||
INSERT INTO t1 VALUES (7),(8),(9);
|
||||
**** On Slave ****
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
DROP TABLE t1;
|
||||
|
286
mysql-test/r/rpl_row_tabledefs_2myisam.result
Normal file
286
mysql-test/r/rpl_row_tabledefs_2myisam.result
Normal file
@ -0,0 +1,286 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
STOP SLAVE;
|
||||
SET GLOBAL SQL_MODE='STRICT_ALL_TABLES';
|
||||
START SLAVE;
|
||||
CREATE TABLE t1_int (a INT PRIMARY KEY, b INT) ENGINE='MyISAM';
|
||||
CREATE TABLE t1_bit (a INT PRIMARY KEY, b INT) ENGINE='MyISAM';
|
||||
CREATE TABLE t1_char (a INT PRIMARY KEY, b INT) ENGINE='MyISAM';
|
||||
CREATE TABLE t1_nodef (a INT PRIMARY KEY, b INT) ENGINE='MyISAM';
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE='MyISAM';
|
||||
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 t9 (a INT) ENGINE='MyISAM';
|
||||
ALTER TABLE t1_int ADD x INT DEFAULT 42;
|
||||
ALTER TABLE t1_bit
|
||||
ADD x BIT(3) DEFAULT b'011',
|
||||
ADD y BIT(5) DEFAULT b'10101',
|
||||
ADD z BIT(2) DEFAULT b'10';
|
||||
ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test';
|
||||
ALTER TABLE t1_nodef ADD x INT NOT NULL;
|
||||
ALTER TABLE t2 DROP b;
|
||||
ALTER TABLE t4 MODIFY a FLOAT;
|
||||
ALTER TABLE t5 MODIFY b FLOAT;
|
||||
ALTER TABLE t6 MODIFY c FLOAT;
|
||||
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');
|
||||
**** On Master ****
|
||||
INSERT INTO t1_int VALUES (1,2);
|
||||
INSERT INTO t1_int VALUES (2,5);
|
||||
INSERT INTO t1_bit VALUES (1,2);
|
||||
INSERT INTO t1_bit VALUES (2,5);
|
||||
INSERT INTO t1_char VALUES (1,2);
|
||||
INSERT INTO t1_char VALUES (2,5);
|
||||
SELECT * FROM t1_int;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
SELECT * FROM t1_bit;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
SELECT * FROM t1_char;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
**** On Slave ****
|
||||
SELECT a,b,x FROM t1_int;
|
||||
a b x
|
||||
2 5 4711
|
||||
1 2 42
|
||||
SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit;
|
||||
a b HEX(x) HEX(y) HEX(z)
|
||||
2 5 5 1C 1
|
||||
1 2 3 15 2
|
||||
SELECT a,b,x FROM t1_char;
|
||||
a b x
|
||||
2 5 Foo is a bar
|
||||
1 2 Just a test
|
||||
**** On Master ****
|
||||
UPDATE t1_int SET b=2*b WHERE a=2;
|
||||
UPDATE t1_char SET b=2*b WHERE a=2;
|
||||
UPDATE t1_bit SET b=2*b WHERE a=2;
|
||||
SELECT * FROM t1_int;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
SELECT * FROM t1_bit;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
SELECT * FROM t1_char;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
**** On Slave ****
|
||||
SELECT a,b,x FROM t1_int;
|
||||
a b x
|
||||
2 10 4711
|
||||
1 2 42
|
||||
SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit;
|
||||
a b HEX(x) HEX(y) HEX(z)
|
||||
2 10 5 1C 1
|
||||
1 2 3 15 2
|
||||
SELECT a,b,x FROM t1_char;
|
||||
a b x
|
||||
2 10 Foo is a bar
|
||||
1 2 Just a test
|
||||
INSERT INTO t9 VALUES (2);
|
||||
INSERT INTO t1_nodef VALUES (1,2);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1364
|
||||
Last_Error Error in Write_rows event: error during transaction execution on table test.t1_nodef
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (2);
|
||||
INSERT INTO t2 VALUES (2,4);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1514
|
||||
Last_Error Table width mismatch - received 2 columns, test.t2 has 1 columns
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (4);
|
||||
INSERT INTO t4 VALUES (4);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1514
|
||||
Last_Error Column 0 type mismatch - received type 3, test.t4 has type 4
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (5);
|
||||
INSERT INTO t5 VALUES (5,10,25);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1514
|
||||
Last_Error Column 1 type mismatch - received type 3, test.t5 has type 4
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (6);
|
||||
INSERT INTO t6 VALUES (6,12,36);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1514
|
||||
Last_Error Column 2 type mismatch - received type 3, test.t6 has type 4
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef;
|
||||
DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9;
|
286
mysql-test/r/rpl_row_tabledefs_3innodb.result
Normal file
286
mysql-test/r/rpl_row_tabledefs_3innodb.result
Normal file
@ -0,0 +1,286 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
STOP SLAVE;
|
||||
SET GLOBAL SQL_MODE='STRICT_ALL_TABLES';
|
||||
START SLAVE;
|
||||
CREATE TABLE t1_int (a INT PRIMARY KEY, b INT) ENGINE='InnoDB';
|
||||
CREATE TABLE t1_bit (a INT PRIMARY KEY, b INT) ENGINE='InnoDB';
|
||||
CREATE TABLE t1_char (a INT PRIMARY KEY, b INT) ENGINE='InnoDB';
|
||||
CREATE TABLE t1_nodef (a INT PRIMARY KEY, b INT) ENGINE='InnoDB';
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE='InnoDB';
|
||||
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 t9 (a INT) ENGINE='InnoDB';
|
||||
ALTER TABLE t1_int ADD x INT DEFAULT 42;
|
||||
ALTER TABLE t1_bit
|
||||
ADD x BIT(3) DEFAULT b'011',
|
||||
ADD y BIT(5) DEFAULT b'10101',
|
||||
ADD z BIT(2) DEFAULT b'10';
|
||||
ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test';
|
||||
ALTER TABLE t1_nodef ADD x INT NOT NULL;
|
||||
ALTER TABLE t2 DROP b;
|
||||
ALTER TABLE t4 MODIFY a FLOAT;
|
||||
ALTER TABLE t5 MODIFY b FLOAT;
|
||||
ALTER TABLE t6 MODIFY c FLOAT;
|
||||
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');
|
||||
**** On Master ****
|
||||
INSERT INTO t1_int VALUES (1,2);
|
||||
INSERT INTO t1_int VALUES (2,5);
|
||||
INSERT INTO t1_bit VALUES (1,2);
|
||||
INSERT INTO t1_bit VALUES (2,5);
|
||||
INSERT INTO t1_char VALUES (1,2);
|
||||
INSERT INTO t1_char VALUES (2,5);
|
||||
SELECT * FROM t1_int;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
SELECT * FROM t1_bit;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
SELECT * FROM t1_char;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
**** On Slave ****
|
||||
SELECT a,b,x FROM t1_int;
|
||||
a b x
|
||||
2 5 4711
|
||||
1 2 42
|
||||
SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit;
|
||||
a b HEX(x) HEX(y) HEX(z)
|
||||
2 5 5 1C 1
|
||||
1 2 3 15 2
|
||||
SELECT a,b,x FROM t1_char;
|
||||
a b x
|
||||
2 5 Foo is a bar
|
||||
1 2 Just a test
|
||||
**** On Master ****
|
||||
UPDATE t1_int SET b=2*b WHERE a=2;
|
||||
UPDATE t1_char SET b=2*b WHERE a=2;
|
||||
UPDATE t1_bit SET b=2*b WHERE a=2;
|
||||
SELECT * FROM t1_int;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
SELECT * FROM t1_bit;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
SELECT * FROM t1_char;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
**** On Slave ****
|
||||
SELECT a,b,x FROM t1_int;
|
||||
a b x
|
||||
2 10 4711
|
||||
1 2 42
|
||||
SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit;
|
||||
a b HEX(x) HEX(y) HEX(z)
|
||||
2 10 5 1C 1
|
||||
1 2 3 15 2
|
||||
SELECT a,b,x FROM t1_char;
|
||||
a b x
|
||||
2 10 Foo is a bar
|
||||
1 2 Just a test
|
||||
INSERT INTO t9 VALUES (2);
|
||||
INSERT INTO t1_nodef VALUES (1,2);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1364
|
||||
Last_Error Error in Write_rows event: error during transaction execution on table test.t1_nodef
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (2);
|
||||
INSERT INTO t2 VALUES (2,4);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1522
|
||||
Last_Error Table width mismatch - received 2 columns, test.t2 has 1 columns
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (4);
|
||||
INSERT INTO t4 VALUES (4);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1522
|
||||
Last_Error Column 0 type mismatch - received type 3, test.t4 has type 4
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (5);
|
||||
INSERT INTO t5 VALUES (5,10,25);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1522
|
||||
Last_Error Column 1 type mismatch - received type 3, test.t5 has type 4
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (6);
|
||||
INSERT INTO t6 VALUES (6,12,36);
|
||||
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 No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1522
|
||||
Last_Error Column 2 type mismatch - received type 3, test.t6 has type 4
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef;
|
||||
DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9;
|
@ -4,21 +4,96 @@ reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
|
||||
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 t9 (a INT PRIMARY KEY) ENGINE=myisam;
|
||||
ALTER TABLE t1 ADD x INT DEFAULT 42;
|
||||
ALTER TABLE t2 ADD x INT DEFAULT 42 AFTER a;
|
||||
ALTER TABLE t3 ADD x INT DEFAULT 42 FIRST;
|
||||
STOP SLAVE;
|
||||
SET GLOBAL SQL_MODE='STRICT_ALL_TABLES';
|
||||
START SLAVE;
|
||||
CREATE TABLE t1_int (a INT PRIMARY KEY, b INT) ENGINE='NDB';
|
||||
CREATE TABLE t1_bit (a INT PRIMARY KEY, b INT) ENGINE='NDB';
|
||||
CREATE TABLE t1_char (a INT PRIMARY KEY, b INT) ENGINE='NDB';
|
||||
CREATE TABLE t1_nodef (a INT PRIMARY KEY, b INT) ENGINE='NDB';
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE='NDB';
|
||||
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE='NDB';
|
||||
CREATE TABLE t4 (a INT) ENGINE='NDB';
|
||||
CREATE TABLE t5 (a INT, b INT, c INT) ENGINE='NDB';
|
||||
CREATE TABLE t6 (a INT, b INT, c INT) ENGINE='NDB';
|
||||
CREATE TABLE t9 (a INT) ENGINE='NDB';
|
||||
ALTER TABLE t1_int ADD x INT DEFAULT 42;
|
||||
ALTER TABLE t1_bit
|
||||
ADD x BIT(3) DEFAULT b'011',
|
||||
ADD y BIT(5) DEFAULT b'10101',
|
||||
ADD z BIT(2) DEFAULT b'10';
|
||||
ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test';
|
||||
ALTER TABLE t1_nodef ADD x INT NOT NULL;
|
||||
ALTER TABLE t2 DROP b;
|
||||
ALTER TABLE t4 MODIFY a FLOAT;
|
||||
ALTER TABLE t5 MODIFY b FLOAT;
|
||||
ALTER TABLE t6 MODIFY c FLOAT;
|
||||
INSERT INTO t9 VALUES (1);
|
||||
INSERT INTO t1 VALUES (1,2);
|
||||
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');
|
||||
**** On Master ****
|
||||
INSERT INTO t1_int VALUES (1,2);
|
||||
INSERT INTO t1_int VALUES (2,5);
|
||||
INSERT INTO t1_bit VALUES (1,2);
|
||||
INSERT INTO t1_bit VALUES (2,5);
|
||||
INSERT INTO t1_char VALUES (1,2);
|
||||
INSERT INTO t1_char VALUES (2,5);
|
||||
SELECT * FROM t1_int;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
SELECT * FROM t1_bit;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
SELECT * FROM t1_char;
|
||||
a b
|
||||
1 2
|
||||
2 5
|
||||
**** On Slave ****
|
||||
SELECT a,b,x FROM t1_int;
|
||||
a b x
|
||||
1 2 42
|
||||
2 5 42
|
||||
SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit;
|
||||
a b HEX(x) HEX(y) HEX(z)
|
||||
1 2 3 15 2
|
||||
2 5 3 15 2
|
||||
SELECT a,b,x FROM t1_char;
|
||||
a b x
|
||||
1 2 Just a test
|
||||
2 5 Just a test
|
||||
**** On Master ****
|
||||
UPDATE t1_int SET b=2*b WHERE a=2;
|
||||
UPDATE t1_char SET b=2*b WHERE a=2;
|
||||
UPDATE t1_bit SET b=2*b WHERE a=2;
|
||||
SELECT * FROM t1_int;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
SELECT * FROM t1_bit;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
SELECT * FROM t1_char;
|
||||
a b
|
||||
1 2
|
||||
2 10
|
||||
**** On Slave ****
|
||||
SELECT a,b,x FROM t1_int;
|
||||
a b x
|
||||
1 2 42
|
||||
2 10 42
|
||||
SELECT a,b,HEX(x),HEX(y),HEX(z) FROM t1_bit;
|
||||
a b HEX(x) HEX(y) HEX(z)
|
||||
1 2 3 15 2
|
||||
2 10 3 15 2
|
||||
SELECT a,b,x FROM t1_char;
|
||||
a b x
|
||||
1 2 Just a test
|
||||
2 10 Just a test
|
||||
INSERT INTO t9 VALUES (2);
|
||||
INSERT INTO t1_nodef VALUES (1,2);
|
||||
SHOW SLAVE STATUS;
|
||||
Slave_IO_State #
|
||||
Master_Host 127.0.0.1
|
||||
@ -26,7 +101,7 @@ Master_User root
|
||||
Master_Port MASTER_PORT
|
||||
Connect_Retry 1
|
||||
Master_Log_File master-bin.000001
|
||||
Read_Master_Log_Pos 1042
|
||||
Read_Master_Log_Pos #
|
||||
Relay_Log_File #
|
||||
Relay_Log_Pos #
|
||||
Relay_Master_Log_File master-bin.000001
|
||||
@ -38,10 +113,10 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1454
|
||||
Last_Error Table width mismatch - received 2 columns, test.t1 has 3 columns
|
||||
Last_Errno 1364
|
||||
Last_Error Error in Write_rows event: error during transaction execution on table test.t1_nodef
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos 968
|
||||
Exec_Master_Log_Pos #
|
||||
Relay_Log_Space #
|
||||
Until_Condition None
|
||||
Until_Log_File
|
||||
@ -64,7 +139,7 @@ Master_User root
|
||||
Master_Port MASTER_PORT
|
||||
Connect_Retry 1
|
||||
Master_Log_File master-bin.000001
|
||||
Read_Master_Log_Pos 1185
|
||||
Read_Master_Log_Pos #
|
||||
Relay_Log_File #
|
||||
Relay_Log_Pos #
|
||||
Relay_Master_Log_File master-bin.000001
|
||||
@ -76,48 +151,10 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1454
|
||||
Last_Error Table width mismatch - received 2 columns, test.t2 has 3 columns
|
||||
Last_Errno 1514
|
||||
Last_Error Table width mismatch - received 2 columns, test.t2 has 1 columns
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos 1111
|
||||
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 #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
INSERT INTO t9 VALUES (3);
|
||||
INSERT INTO t3 VALUES (3,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 1328
|
||||
Relay_Log_File #
|
||||
Relay_Log_Pos #
|
||||
Relay_Master_Log_File master-bin.000001
|
||||
Slave_IO_Running Yes
|
||||
Slave_SQL_Running No
|
||||
Replicate_Do_DB
|
||||
Replicate_Ignore_DB
|
||||
Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1454
|
||||
Last_Error Table width mismatch - received 2 columns, test.t3 has 3 columns
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos 1254
|
||||
Exec_Master_Log_Pos #
|
||||
Relay_Log_Space #
|
||||
Until_Condition None
|
||||
Until_Log_File
|
||||
@ -140,7 +177,7 @@ Master_User root
|
||||
Master_Port MASTER_PORT
|
||||
Connect_Retry 1
|
||||
Master_Log_File master-bin.000001
|
||||
Read_Master_Log_Pos 1466
|
||||
Read_Master_Log_Pos #
|
||||
Relay_Log_File #
|
||||
Relay_Log_Pos #
|
||||
Relay_Master_Log_File master-bin.000001
|
||||
@ -152,10 +189,10 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1454
|
||||
Last_Errno 1514
|
||||
Last_Error Column 0 type mismatch - received type 3, test.t4 has type 4
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos 1397
|
||||
Exec_Master_Log_Pos #
|
||||
Relay_Log_Space #
|
||||
Until_Condition None
|
||||
Until_Log_File
|
||||
@ -178,7 +215,7 @@ Master_User root
|
||||
Master_Port MASTER_PORT
|
||||
Connect_Retry 1
|
||||
Master_Log_File master-bin.000001
|
||||
Read_Master_Log_Pos 1614
|
||||
Read_Master_Log_Pos #
|
||||
Relay_Log_File #
|
||||
Relay_Log_Pos #
|
||||
Relay_Master_Log_File master-bin.000001
|
||||
@ -190,10 +227,10 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1454
|
||||
Last_Errno 1514
|
||||
Last_Error Column 1 type mismatch - received type 3, test.t5 has type 4
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos 1535
|
||||
Exec_Master_Log_Pos #
|
||||
Relay_Log_Space #
|
||||
Until_Condition None
|
||||
Until_Log_File
|
||||
@ -216,7 +253,7 @@ Master_User root
|
||||
Master_Port MASTER_PORT
|
||||
Connect_Retry 1
|
||||
Master_Log_File master-bin.000001
|
||||
Read_Master_Log_Pos 1762
|
||||
Read_Master_Log_Pos #
|
||||
Relay_Log_File #
|
||||
Relay_Log_Pos #
|
||||
Relay_Master_Log_File master-bin.000001
|
||||
@ -228,10 +265,10 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1454
|
||||
Last_Errno 1514
|
||||
Last_Error Column 2 type mismatch - received type 3, test.t6 has type 4
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos 1683
|
||||
Exec_Master_Log_Pos #
|
||||
Relay_Log_Space #
|
||||
Until_Condition None
|
||||
Until_Log_File
|
||||
@ -245,4 +282,5 @@ Master_SSL_Key
|
||||
Seconds_Behind_Master #
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t9;
|
||||
DROP TABLE IF EXISTS t1_int,t1_bit,t1_char,t1_nodef;
|
||||
DROP TABLE IF EXISTS t2,t3,t4,t5,t6,t9;
|
@ -7,6 +7,8 @@ start slave;
|
||||
drop database if exists mysqltest1;
|
||||
create database mysqltest1;
|
||||
use mysqltest1;
|
||||
set session binlog_format=row;
|
||||
set global binlog_format=row;
|
||||
show global variables like "binlog_format%";
|
||||
Variable_name Value
|
||||
binlog_format ROW
|
||||
@ -358,6 +360,28 @@ count(*)
|
||||
select count(*) from t16;
|
||||
count(*)
|
||||
3
|
||||
DROP TABLE IF EXISTS t11;
|
||||
SET SESSION BINLOG_FORMAT=STATEMENT;
|
||||
CREATE TABLE t11 (song VARCHAR(255));
|
||||
LOCK TABLES t11 WRITE;
|
||||
SET SESSION BINLOG_FORMAT=ROW;
|
||||
INSERT INTO t11 VALUES('Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict');
|
||||
SET SESSION BINLOG_FORMAT=STATEMENT;
|
||||
INSERT INTO t11 VALUES('Careful With That Axe, Eugene');
|
||||
UNLOCK TABLES;
|
||||
SELECT * FROM t11;
|
||||
song Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict
|
||||
song Careful With That Axe, Eugene
|
||||
USE mysqltest1;
|
||||
SELECT * FROM t11;
|
||||
song Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict
|
||||
song Careful With That Axe, Eugene
|
||||
DROP TABLE IF EXISTS t12;
|
||||
SET SESSION BINLOG_FORMAT=MIXED;
|
||||
CREATE TABLE t12 (data LONG);
|
||||
LOCK TABLES t12 WRITE;
|
||||
INSERT INTO t12 VALUES(UUID());
|
||||
UNLOCK TABLES;
|
||||
show binlog events from 102;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query 1 # drop database if exists mysqltest1
|
||||
@ -659,4 +683,323 @@ master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t16)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t16 values("try_66_")
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; DROP TABLE IF EXISTS t11
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t11 (song VARCHAR(255))
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t11)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; INSERT INTO t11 VALUES('Careful With That Axe, Eugene')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; DROP TABLE IF EXISTS t12
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t12 (data LONG)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t12)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
show binlog events from 102;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query 1 # drop database if exists mysqltest1
|
||||
master-bin.000001 # Query 1 # create database mysqltest1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t1 (a varchar(100))
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("work_8_")
|
||||
master-bin.000001 # User var 1 # @`string`=_latin1 0x656D657267656E63795F375F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select @'string'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("work_9_")
|
||||
master-bin.000001 # User var 1 # @`string`=_latin1 0x656D657267656E63795F375F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select @'string'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("for_10_")
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select "yesterday_11_"
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("work_13_")
|
||||
master-bin.000001 # User var 1 # @`string`=_latin1 0x656D657267656E63795F31325F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select @'string'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("work_14_")
|
||||
master-bin.000001 # User var 1 # @`string`=_latin1 0x656D657267656E63795F31325F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select @'string'
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("for_15_")
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select "yesterday_16_"
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values("work_18_")
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # User var 1 # @`string`=_latin1 0x656D657267656E63795F31375F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select @'string'
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select "yesterday_21_"
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # User var 1 # @`string`=_latin1 0x656D657267656E63795F31375F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select @'string'
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select "yesterday_24_"
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE `t2` (
|
||||
`rpad(UUID(),100,' ')` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT ''
|
||||
)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE `t3` (
|
||||
`1` varbinary(108) NOT NULL DEFAULT ''
|
||||
)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t3)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE `t4` (
|
||||
`a` varchar(100) DEFAULT NULL
|
||||
)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t4)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t5 select * from t1 where 3 in (select 1 union select 2 union select curdate() union select 3)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t5)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo()
|
||||
begin
|
||||
insert into t1 values("work_25_");
|
||||
insert into t1 values(concat("for_26_",UUID()));
|
||||
insert into t1 select "yesterday_27_";
|
||||
end
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo2()
|
||||
begin
|
||||
insert into t1 values(concat("emergency_28_",UUID()));
|
||||
insert into t1 values("work_29_");
|
||||
insert into t1 values(concat("for_30_",UUID()));
|
||||
set session binlog_format=row; # accepted for stored procs
|
||||
insert into t1 values("more work_31_");
|
||||
set session binlog_format=mixed;
|
||||
end
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function foo3() returns bigint unsigned
|
||||
begin
|
||||
set session binlog_format=row; # rejected for stored funcs
|
||||
insert into t1 values("alarm");
|
||||
return 100;
|
||||
end
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo4(x varchar(100))
|
||||
begin
|
||||
insert into t1 values(concat("work_250_",x));
|
||||
insert into t1 select "yesterday_270_";
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values(concat("work_250_", NAME_CONST('x',_latin1'hello')))
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select "yesterday_270_"
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values(concat("work_250_", NAME_CONST('x',_latin1'world')))
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 select "yesterday_270_"
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop function foo3
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function foo3() returns bigint unsigned
|
||||
begin
|
||||
insert into t1 values("foo3_32_");
|
||||
call foo();
|
||||
return 100;
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function foo4() returns bigint unsigned
|
||||
begin
|
||||
insert into t2 select foo3();
|
||||
return 100;
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function foo5() returns bigint unsigned
|
||||
begin
|
||||
insert into t2 select UUID();
|
||||
return 100;
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function foo6(x varchar(100)) returns bigint unsigned
|
||||
begin
|
||||
insert into t2 select x;
|
||||
return 100;
|
||||
end
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; SELECT `foo6`(_latin1'foo6_1_')
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select uuid()
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t11 (data varchar(255))
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t11)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t11 select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysqltest1' and TABLE_NAME IN ('v1','t11')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t11 select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysqltest1' and TABLE_NAME IN ('v1','t11')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t11 select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysqltest1' and TABLE_NAME IN ('v1','t11')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` trigger t11_bi before insert on t11 for each row
|
||||
begin
|
||||
set NEW.data = concat(NEW.data,UUID());
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t11)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t20 select * from t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t21 select * from t2
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t22 select * from t3
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop table t1,t2,t3
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t1 (a int primary key auto_increment, b varchar(100))
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t2 (a int primary key auto_increment, b varchar(100))
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t3 (b varchar(100))
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function f (x varchar(100)) returns int deterministic
|
||||
begin
|
||||
insert into t1 values(null,x);
|
||||
insert into t2 values(null,x);
|
||||
return 1;
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=3
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values(null,"try_44_")
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t12 select * from t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop table t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t1 (a int, b varchar(100), key(a))
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=4
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; SELECT `f`(_latin1'try_45_')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t13 select * from t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop table t1
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t1 (a int primary key auto_increment, b varchar(100))
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop function f
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; create table t14 (unique (a)) select * from t2
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; truncate table t2
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function f1 (x varchar(100)) returns int deterministic
|
||||
begin
|
||||
insert into t1 values(null,x);
|
||||
return 1;
|
||||
end
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function f2 (x varchar(100)) returns int deterministic
|
||||
begin
|
||||
insert into t2 values(null,x);
|
||||
return 1;
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t3)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop function f2
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function f2 (x varchar(100)) returns int deterministic
|
||||
begin
|
||||
declare y int;
|
||||
insert into t1 values(null,x);
|
||||
set y = (select count(*) from t2);
|
||||
return y;
|
||||
end
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=4
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; SELECT `f1`(_latin1'try_53_')
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=5
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; SELECT `f2`(_latin1'try_54_')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; drop function f2
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` trigger t1_bi before insert on t1 for each row
|
||||
begin
|
||||
insert into t2 values(null,"try_55_");
|
||||
end
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t2)
|
||||
master-bin.000001 # Write_rows 1 # table_id: #
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; alter table t1 modify a int, drop primary key
|
||||
master-bin.000001 # Intvar 1 # INSERT_ID=5
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values(null,"try_57_")
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE `t16` (
|
||||
`UUID()` varchar(36) CHARACTER SET utf8 NOT NULL DEFAULT ''
|
||||
)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t16)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t16)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t16 values("try_66_")
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; DROP TABLE IF EXISTS t11
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t11 (song VARCHAR(255))
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t11)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; INSERT INTO t11 VALUES('Careful With That Axe, Eugene')
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; DROP TABLE IF EXISTS t12
|
||||
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t12 (data LONG)
|
||||
master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t12)
|
||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
drop database mysqltest1;
|
||||
|
@ -3,7 +3,7 @@
|
||||
# Taken FROM the select test
|
||||
#
|
||||
-- source include/have_archive.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2,t3;
|
||||
|
9
mysql-test/t/binlog_statement_insert_delayed.test
Normal file
9
mysql-test/t/binlog_statement_insert_delayed.test
Normal file
@ -0,0 +1,9 @@
|
||||
# This test is to verify replication with INSERT DELAY through
|
||||
# unrecommended STATEMENT binlog format
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- disable_query_log
|
||||
reset master; # get rid of previous tests binlog
|
||||
-- enable_query_log
|
||||
-- source extra/binlog_tests/binlog_insert_delayed.test
|
@ -13,6 +13,6 @@ drop table t1;
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed.inc
|
||||
-- source extra/binlog_tests/binlog.test
|
||||
|
||||
|
@ -2,5 +2,5 @@
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/blackhole.test
|
||||
|
@ -2,5 +2,5 @@
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/ctype_cp932.test
|
||||
|
@ -1,6 +1,6 @@
|
||||
# This is a wrapper for binlog.test so that the same test case can be used
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/ctype_ucs_binlog.test
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This is a wrapper for binlog.test so that the same test case can be used
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/drop_temp_table.test
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This is a wrapper for binlog.test so that the same test case can be used
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/innodb_stat.test
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This is a wrapper for binlog.test so that the same test case can be used
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/insert_select-binlog.test
|
||||
|
@ -1,7 +1,7 @@
|
||||
# This is a wrapper for binlog.test so that the same test case can be used
|
||||
# For both statement and row based bin logs 9/19/2005 [jbm]
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/mix_innodb_myisam_binlog.test
|
||||
|
||||
# This piece below cannot be put into
|
||||
|
@ -6,7 +6,7 @@
|
||||
# inconsistency between binlog and the internal list of temp tables.
|
||||
|
||||
# This does not work for RBR yet.
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
-- source include/have_innodb.inc
|
||||
--disable_warnings
|
||||
|
@ -1,7 +1,7 @@
|
||||
# This is a wrapper for binlog.test so that the same test case can be used
|
||||
# For both statement and row based bin logs 11/07/2005 [jbm]
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/binlog_tests/ctype_cp932_binlog.test
|
||||
|
||||
#
|
||||
|
@ -6,9 +6,9 @@
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
--replace_result ROW <format> STATEMENT <format>
|
||||
--replace_result ROW <format> STATEMENT <format> MIXED <format>
|
||||
SHOW GLOBAL VARIABLES LIKE "%_format%";
|
||||
--replace_result ROW <format> STATEMENT <format>
|
||||
--replace_result ROW <format> STATEMENT <format> MIXED <format>
|
||||
SHOW SESSION VARIABLES LIKE "%_format%";
|
||||
|
||||
#
|
||||
@ -36,7 +36,7 @@ set datetime_format= '%H:%i:%s.%f %m-%d-%Y';
|
||||
set datetime_format= '%h:%i:%s %p %Y-%m-%d';
|
||||
set datetime_format= '%h:%i:%s.%f %p %Y-%m-%d';
|
||||
|
||||
--replace_result ROW <format> STATEMENT <format>
|
||||
--replace_result ROW <format> STATEMENT <format> MIXED <format>
|
||||
SHOW SESSION VARIABLES LIKE "%format";
|
||||
|
||||
--error 1231
|
||||
|
@ -22,18 +22,27 @@ ndb_load : BUG#17233 2006-05-04 tomas failed load data from infi
|
||||
partition_03ndb : BUG#16385 2006-03-24 mikael Partitions: crash when updating a range partitioned NDB table
|
||||
ps : BUG#21524 2006-08-08 pgalbraith 'ps' test fails in --ps-protocol test AMD64 bit
|
||||
ps_7ndb : BUG#18950 2006-02-16 jmiller create table like does not obtain LOCK_open
|
||||
rpl_ndb_2innodb : BUG#19227 2006-04-20 pekka pk delete apparently not replicated
|
||||
rpl_ndb_2myisam : BUG#19227 Seems to pass currently
|
||||
#rpl_ndb_commit_afterflush : BUG#19328 2006-05-04 tomas Slave timeout with COM_REGISTER_SLAVE error causing stop
|
||||
rpl_ndb_dd_partitions : BUG#19259 2006-04-21 rpl_ndb_dd_partitions fails on s/AMD
|
||||
rpl_ndb_ddl : BUG#18946 result file needs update + test needs to checked
|
||||
rpl_ndb_innodb2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
|
||||
#rpl_ndb_log : BUG#18947 2006-03-21 tomas CRBR: order in binlog of create table and insert (on different table) not determ
|
||||
rpl_ndb_myisam2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
|
||||
rpl_deadlock_innodb : BUG#16920 2006-04-12 kent fails in show slave status (randomly)
|
||||
rpl_ndb_2innodb : BUG#19004 2006-03-22 tomas ndb: partition by range and update hangs
|
||||
rpl_ndb_2myisam : BUG#19004 2006-03-22 tomas ndb: partition by range and update hangs
|
||||
rpl_ndb_auto_inc : BUG#17086 2006-02-16 jmiller CR: auto_increment_increment and auto_increment_offset produce duplicate key er
|
||||
rpl_ndb_commit_afterflush : LOCK TABLES cases hang in ndb injector thread
|
||||
rpl_ndb_ddl : result file needs update + test needs to checked
|
||||
rpl_ndb_innodb2ndb : BUG#18094 2006-03-16 mats Slave caches invalid table definition after atlters causes select failure
|
||||
rpl_ndb_log : BUG#18947 2006-03-21 tomas CRBR: order in binlog of create table and insert (on different table) not determ
|
||||
rpl_ndb_myisam2ndb : BUG#18094 2006-03-16 mats Slave caches invalid table definition after atlters causes select failure
|
||||
rpl_ndb_relay_space : BUG#16993 2006-02-16 jmiller RBR: ALTER TABLE ZEROFILL AUTO_INCREMENT is not replicated correctly
|
||||
rpl_switch_stm_row_mixed : BUG#18590 2006-03-28 brian
|
||||
rpl_row_basic_7ndb : BUG#17400 2006-04-09 brian Cluster Replication: delete & update of rows in table without pk fails on slave.
|
||||
rpl_row_blob_innodb : BUG#18980 2006-04-10 kent Test fails randomly
|
||||
rpl_row_func003 : BUG#19074 2006-13-04 andrei test failed
|
||||
rpl_row_func003 : BUG#19074 2006-13-04 andrei test failed
|
||||
rpl_row_inexist_tbl : BUG#18948 2006-03-09 mats Disabled since patch makes this test wait forever
|
||||
rpl_sp : BUG#16456 2006-02-16 jmiller
|
||||
rpl_sp_effects : BUG#19862 2006-06-15 mkindahl
|
||||
rpl_sp_effects : BUG#19862 2006-08-22 mats Bug appear to be fixed
|
||||
rpl_until : BUG#15886 2006-02-16 jmiller Unstable test case
|
||||
sp-goto : BUG#18949 2006-02-16 jmiller GOTO is currently is disabled - will be fixed in the future
|
||||
mysqldump : BUG#18078 2006-03-10 lars
|
||||
udf : BUG#18564 2006-03-27 ian (Permission by Brian)
|
||||
|
||||
# the below testcase have been reworked to avoid the bug, test contains comment, keep bug open
|
||||
#ndb_binlog_ddl_multi : BUG#18976 2006-04-10 kent CRBR: multiple binlog, second binlog may miss schema log events
|
||||
|
@ -1,6 +1,6 @@
|
||||
# We are using .opt file since we need small binlog size
|
||||
# TODO: Need to look at making a row based version once the new row based client is completed. [jbm]
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
# Embedded server doesn't support binlogging
|
||||
-- source include/not_embedded.inc
|
||||
|
@ -2,7 +2,7 @@
|
||||
# and a few others.
|
||||
|
||||
# TODO: Need to look at making row based version once new binlog client is complete.
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
# Embedded server doesn't support binlogging
|
||||
-- source include/not_embedded.inc
|
||||
|
@ -1,7 +1,7 @@
|
||||
-- source include/have_ndb.inc
|
||||
-- source include/have_multi_ndb.inc
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
--disable_warnings
|
||||
connection server2;
|
||||
|
@ -7,7 +7,7 @@
|
||||
# in row-based, it hangs waiting for an offset which is never
|
||||
# reached (the "sync_with_master 1"), logically.
|
||||
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_binlog_format_mixed_or_statement.inc
|
||||
source include/master-slave.inc;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
|
@ -2,7 +2,7 @@
|
||||
# replicated LOAD DATA INFILE correctly when it has binlog_*_db rules.
|
||||
# This is for BUG#1100 (LOAD DATA INFILE was half-logged).
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
connection slave;
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Mixed DDL-DML (CREATE ... SELECT ...) statements can only be
|
||||
# replicated properly in statement-based replication.
|
||||
# Currently statement based due to bug 12345
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
|
@ -1,12 +1,11 @@
|
||||
-- source include/have_row_based.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
# Test that the slave temporarily switches to ROW when seeing binrow
|
||||
# events when it is in STATEMENT or MIXED mode
|
||||
|
||||
SET BINLOG_FORMAT=MIXED;
|
||||
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
|
||||
SET GLOBAL BINLOG_FORMAT=MIXED;
|
||||
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
# TBF - difference in row level logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
--disable_warnings
|
||||
|
@ -13,7 +13,7 @@
|
||||
# - Test creating a duplicate key error and recover from it
|
||||
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
--disable_warnings
|
||||
|
@ -54,3 +54,43 @@ UPDATE t1 SET a=99 WHERE a = 0;
|
||||
--replace_result $SERVER_VERSION SERVER_VERSION
|
||||
--replace_regex /table_id: [0-9]+/table_id: #/
|
||||
SHOW BINLOG EVENTS;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
# BUG#17620: Replicate (Row Based) Fails when Query Cache enabled on
|
||||
# slave
|
||||
--echo ================ Test for BUG#17620 ================
|
||||
--disable_query_log
|
||||
--source include/master-slave-reset.inc
|
||||
--enable_query_log
|
||||
|
||||
--echo **** On Slave ****
|
||||
connection slave;
|
||||
SET GLOBAL QUERY_CACHE_SIZE=0;
|
||||
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master;
|
||||
SET GLOBAL QUERY_CACHE_SIZE=16*1024*1024;
|
||||
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (4),(5),(6);
|
||||
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (7),(8),(9);
|
||||
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
8
mysql-test/t/rpl_row_tabledefs_2myisam.test
Normal file
8
mysql-test/t/rpl_row_tabledefs_2myisam.test
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
-- source include/have_binlog_format_row.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
let $engine_type = 'MyISAM';
|
||||
-- source extra/rpl_tests/rpl_row_tabledefs.test
|
||||
|
||||
|
9
mysql-test/t/rpl_row_tabledefs_3innodb.test
Normal file
9
mysql-test/t/rpl_row_tabledefs_3innodb.test
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
-- source include/have_binlog_format_row.inc
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
let $engine_type = 'InnoDB';
|
||||
-- source extra/rpl_tests/rpl_row_tabledefs.test
|
||||
|
||||
|
@ -3,6 +3,6 @@
|
||||
# Date: 2006-01-11
|
||||
# Purpose: Engine Wrapper for rpl_stm_EE_err2.test
|
||||
##############################
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
let $engine_type=myisam;
|
||||
-- source extra/rpl_tests/rpl_stm_EE_err2.test
|
||||
|
@ -1,5 +1,5 @@
|
||||
# depends on the binlog output
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
let $rename_event_pos= 652;
|
||||
-- source extra/rpl_tests/rpl_flsh_tbls.test
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
let $engine_type=MyISAM;
|
||||
-- source extra/rpl_tests/rpl_log.test
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
# Test of manual relay log rotation with FLUSH LOGS.
|
||||
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/rpl_tests/rpl_max_relay_size.test
|
||||
|
||||
# End of 4.1 tests
|
||||
|
@ -4,7 +4,7 @@
|
||||
# one binlog event containing all queries)
|
||||
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/rpl_tests/rpl_multi_query.test
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#should proceed in a correct way.
|
||||
#################################
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
# first, cause a duplicate key problem on the slave
|
||||
|
@ -4,7 +4,7 @@
|
||||
# case. So this test is meaningul only in statement-based (and if it was
|
||||
# enabled in row-based, it would fail as expected).
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
# TBF - difference in row level logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source extra/rpl_tests/rpl_reset_slave.test
|
||||
|
||||
# End of 4.1 tests
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
# Test is dependent on binlog positions
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- source include/have_binlog_format_row.inc
|
||||
-- source include/have_row_based.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
connection master;
|
||||
@ -8,6 +8,9 @@ create database mysqltest1;
|
||||
--enable_warnings
|
||||
use mysqltest1;
|
||||
|
||||
set session binlog_format=row;
|
||||
set global binlog_format=row;
|
||||
|
||||
show global variables like "binlog_format%";
|
||||
show session variables like "binlog_format%";
|
||||
select @@global.binlog_format, @@session.binlog_format;
|
||||
@ -462,6 +465,41 @@ if ($you_want_to_test_UDF)
|
||||
}
|
||||
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# Bug#20863 If binlog format is changed between update and unlock of
|
||||
# tables, wrong binlog
|
||||
#
|
||||
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t11;
|
||||
SET SESSION BINLOG_FORMAT=STATEMENT;
|
||||
CREATE TABLE t11 (song VARCHAR(255));
|
||||
LOCK TABLES t11 WRITE;
|
||||
SET SESSION BINLOG_FORMAT=ROW;
|
||||
INSERT INTO t11 VALUES('Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict');
|
||||
SET SESSION BINLOG_FORMAT=STATEMENT;
|
||||
INSERT INTO t11 VALUES('Careful With That Axe, Eugene');
|
||||
UNLOCK TABLES;
|
||||
|
||||
--query_vertical SELECT * FROM t11
|
||||
sync_slave_with_master;
|
||||
USE mysqltest1;
|
||||
--query_vertical SELECT * FROM t11
|
||||
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t12;
|
||||
SET SESSION BINLOG_FORMAT=MIXED;
|
||||
CREATE TABLE t12 (data LONG);
|
||||
LOCK TABLES t12 WRITE;
|
||||
INSERT INTO t12 VALUES(UUID());
|
||||
UNLOCK TABLES;
|
||||
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /table_id: [0-9]+/table_id: #/
|
||||
show binlog events from 102;
|
||||
sync_slave_with_master;
|
||||
|
||||
# as we're using UUID we don't SELECT but use "diff" like in rpl_row_UUID
|
||||
--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_master.sql
|
||||
--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_slave.sql
|
||||
|
@ -1,7 +1,7 @@
|
||||
# drop table t1 t2 t3 are included int master-slave.inc
|
||||
# meaningful only in statement-based:
|
||||
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
-- source include/master-slave.inc
|
||||
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
# Test of triggers with replication
|
||||
# Adding statement include due to Bug 12574
|
||||
# TODO: Remove statement include once 12574 is patched
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_binlog_format_mixed_or_statement.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--disable_warnings
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Requires statement logging
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
# TODO: Create row based version once $MYSQL_BINLOG has new RB version
|
||||
# Embedded server does not support binlogging
|
||||
--source include/not_embedded.inc
|
||||
|
@ -52,7 +52,7 @@ ADD_EXECUTABLE(mysqld ../sql-common/client.c derror.cc des_key_file.cc
|
||||
time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.cc
|
||||
rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_timed.cc
|
||||
sql_tablespace.cc events.cc ../sql-common/my_user.c
|
||||
partition_info.cc rpl_injector.cc sql_locale.cc
|
||||
partition_info.cc rpl_utility.cc rpl_injector.cc sql_locale.cc
|
||||
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
|
||||
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
|
||||
${PROJECT_SOURCE_DIR}/include/mysqld_error.h
|
||||
|
@ -52,7 +52,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||
ha_partition.h \
|
||||
ha_ndbcluster.h ha_ndbcluster_binlog.h \
|
||||
ha_ndbcluster_tables.h \
|
||||
opt_range.h protocol.h rpl_tblmap.h \
|
||||
opt_range.h protocol.h rpl_tblmap.h rpl_utility.h \
|
||||
log.h sql_show.h rpl_rli.h \
|
||||
sql_select.h structs.h table.h sql_udf.h hash_filo.h \
|
||||
lex.h lex_symbol.h sql_acl.h sql_crypt.h \
|
||||
@ -92,7 +92,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
|
||||
sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \
|
||||
sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \
|
||||
slave.cc sql_repl.cc rpl_filter.cc rpl_tblmap.cc \
|
||||
rpl_injector.cc \
|
||||
rpl_utility.cc rpl_injector.cc \
|
||||
sql_union.cc sql_derived.cc \
|
||||
client.c sql_client.cc mini_client_errors.c pack.c\
|
||||
stacktrace.c repl_failsafe.h repl_failsafe.cc \
|
||||
|
39
sql/field.cc
39
sql/field.cc
@ -1257,6 +1257,13 @@ void Field::hash(ulong *nr, ulong *nr2)
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
void Field::copy_from_tmp(int row_offset)
|
||||
{
|
||||
@ -8094,6 +8101,30 @@ Field_bit::Field_bit(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
||||
}
|
||||
|
||||
|
||||
my_size_t
|
||||
Field_bit::do_last_null_byte() const
|
||||
{
|
||||
/*
|
||||
Code elsewhere is assuming that bytes are 8 bits, so I'm using
|
||||
that value instead of the correct one: CHAR_BIT.
|
||||
|
||||
REFACTOR SUGGESTION (Matz): Change to use the correct number of
|
||||
bits. On systems with CHAR_BIT > 8 (not very common), the storage
|
||||
will lose the extra bits.
|
||||
*/
|
||||
DBUG_PRINT("debug", ("bit_ofs=%d, bit_len=%d, bit_ptr=%p",
|
||||
bit_ofs, bit_len, bit_ptr));
|
||||
uchar *result;
|
||||
if (bit_len == 0)
|
||||
result= null_ptr;
|
||||
else if (bit_ofs + bit_len > 8)
|
||||
result= bit_ptr + 1;
|
||||
else
|
||||
result= bit_ptr;
|
||||
|
||||
return result ? (byte*) result - table->record[0] + 1 : 0;
|
||||
}
|
||||
|
||||
Field *Field_bit::new_key_field(MEM_ROOT *root,
|
||||
struct st_table *new_table,
|
||||
char *new_ptr, uchar *new_null_ptr,
|
||||
@ -8345,6 +8376,14 @@ const char *Field_bit::unpack(char *to, const char *from)
|
||||
}
|
||||
|
||||
|
||||
void Field_bit::set_default()
|
||||
{
|
||||
my_ptrdiff_t const offset= table->s->default_values - table->record[0];
|
||||
uchar bits= get_rec_bits(bit_ptr + offset, bit_ofs, bit_len);
|
||||
set_rec_bits(bits, bit_ptr, bit_ofs, bit_len);
|
||||
Field::set_default();
|
||||
}
|
||||
|
||||
/*
|
||||
Bit field support for non-MyISAM tables.
|
||||
*/
|
||||
|
21
sql/field.h
21
sql/field.h
@ -217,6 +217,19 @@ public:
|
||||
{ if (null_ptr) null_ptr[row_offset]&= (uchar) ~null_bit; }
|
||||
inline bool maybe_null(void) { return null_ptr != 0 || table->maybe_null; }
|
||||
inline bool real_maybe_null(void) { return null_ptr != 0; }
|
||||
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
my_size_t last_null_byte() const {
|
||||
my_size_t bytes= do_last_null_byte();
|
||||
DBUG_PRINT("debug", ("last_null_byte() ==> %d", bytes));
|
||||
DBUG_ASSERT(bytes <= table->s->null_bytes);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
virtual void make_field(Send_field *);
|
||||
virtual void sort_string(char *buff,uint length)=0;
|
||||
virtual bool optimize_range(uint idx, uint part);
|
||||
@ -377,6 +390,9 @@ public:
|
||||
friend class Item_sum_min;
|
||||
friend class Item_sum_max;
|
||||
friend class Item_func_group_concat;
|
||||
|
||||
private:
|
||||
virtual my_size_t do_last_null_byte() const;
|
||||
};
|
||||
|
||||
|
||||
@ -1412,6 +1428,8 @@ public:
|
||||
void sql_type(String &str) const;
|
||||
char *pack(char *to, const char *from, uint max_length=~(uint) 0);
|
||||
const char *unpack(char* to, const char *from);
|
||||
virtual void set_default();
|
||||
|
||||
Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,
|
||||
char *new_ptr, uchar *new_null_ptr,
|
||||
uint new_null_bit);
|
||||
@ -1432,6 +1450,9 @@ public:
|
||||
Field::move_field_offset(ptr_diff);
|
||||
bit_ptr= ADD_TO_PTR(bit_ptr, ptr_diff, uchar*);
|
||||
}
|
||||
|
||||
private:
|
||||
virtual my_size_t do_last_null_byte() const;
|
||||
};
|
||||
|
||||
|
||||
|
@ -3171,7 +3171,7 @@ int MYSQL_BIN_LOG::
|
||||
flush_and_set_pending_rows_event(THD *thd, Rows_log_event* event)
|
||||
{
|
||||
DBUG_ENTER("MYSQL_BIN_LOG::flush_and_set_pending_rows_event(event)");
|
||||
DBUG_ASSERT(thd->current_stmt_binlog_row_based && mysql_bin_log.is_open());
|
||||
DBUG_ASSERT(mysql_bin_log.is_open());
|
||||
DBUG_PRINT("enter", ("event=%p", event));
|
||||
|
||||
int error= 0;
|
||||
|
413
sql/log_event.cc
413
sql/log_event.cc
@ -24,6 +24,7 @@
|
||||
#include "mysql_priv.h"
|
||||
#include "slave.h"
|
||||
#include "rpl_filter.h"
|
||||
#include "rpl_utility.h"
|
||||
#include <my_dir.h>
|
||||
#endif /* MYSQL_CLIENT */
|
||||
#include <base64.h>
|
||||
@ -5290,38 +5291,114 @@ int Rows_log_event::do_add_row_data(byte *const row_data,
|
||||
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
/*
|
||||
Unpack a row into a record. The row is assumed to only consist of the fields
|
||||
for which the bitset represented by 'arr' and 'bits'; the other parts of the
|
||||
record are left alone.
|
||||
Unpack a row into a record.
|
||||
|
||||
SYNOPSIS
|
||||
unpack_row()
|
||||
rli Relay log info
|
||||
table Table to unpack into
|
||||
colcnt Number of columns to read from record
|
||||
record Record where the data should be unpacked
|
||||
row Packed row data
|
||||
cols Pointer to columns data to fill in
|
||||
row_end Pointer to variable that will hold the value of the
|
||||
one-after-end position for the row
|
||||
master_reclength
|
||||
Pointer to variable that will hold the length of the
|
||||
record on the master side
|
||||
rw_set Pointer to bitmap that holds either the read_set or the
|
||||
write_set of the table
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
The row is assumed to only consist of the fields for which the
|
||||
bitset represented by 'arr' and 'bits'; the other parts of the
|
||||
record are left alone.
|
||||
|
||||
At most 'colcnt' columns are read: if the table is larger than
|
||||
that, the remaining fields are not filled in.
|
||||
*/
|
||||
static char const *unpack_row(TABLE *table,
|
||||
byte *record, char const *row,
|
||||
MY_BITMAP const *cols)
|
||||
static int
|
||||
unpack_row(RELAY_LOG_INFO *rli,
|
||||
TABLE *table, uint const colcnt, byte *record,
|
||||
char const *row, MY_BITMAP const *cols,
|
||||
char const **row_end, ulong *master_reclength,
|
||||
MY_BITMAP* const rw_set)
|
||||
{
|
||||
DBUG_ASSERT(record && row);
|
||||
|
||||
MY_BITMAP *write_set= table->write_set;
|
||||
my_size_t const n_null_bytes= table->s->null_bytes;
|
||||
my_ptrdiff_t const offset= record - (byte*) table->record[0];
|
||||
my_size_t master_null_bytes= table->s->null_bytes;
|
||||
|
||||
memcpy(record, row, n_null_bytes);
|
||||
char const *ptr= row + n_null_bytes;
|
||||
|
||||
bitmap_set_all(write_set);
|
||||
Field **const begin_ptr = table->field;
|
||||
for (Field **field_ptr= begin_ptr ; *field_ptr ; ++field_ptr)
|
||||
if (colcnt != table->s->fields)
|
||||
{
|
||||
Field *const f= *field_ptr;
|
||||
Field **fptr= &table->field[colcnt-1];
|
||||
do
|
||||
master_null_bytes= (*fptr)->last_null_byte();
|
||||
while (master_null_bytes == 0 && fptr-- > table->field);
|
||||
|
||||
if (bitmap_is_set(cols, (uint) (field_ptr - begin_ptr)))
|
||||
if (master_null_bytes == 0)
|
||||
master_null_bytes= table->s->null_bytes;
|
||||
}
|
||||
|
||||
DBUG_ASSERT(master_null_bytes <= table->s->null_bytes);
|
||||
memcpy(record, row, master_null_bytes); // [1]
|
||||
int error= 0;
|
||||
|
||||
bitmap_set_all(rw_set);
|
||||
|
||||
Field **const begin_ptr = table->field;
|
||||
Field **field_ptr;
|
||||
{
|
||||
char const *ptr= row + master_null_bytes;
|
||||
Field **const end_ptr= begin_ptr + colcnt;
|
||||
for (field_ptr= begin_ptr ; field_ptr < end_ptr ; ++field_ptr)
|
||||
{
|
||||
/* Field...::unpack() cannot return 0 */
|
||||
ptr= f->unpack(f->ptr + offset, ptr);
|
||||
Field *const f= *field_ptr;
|
||||
|
||||
if (bitmap_is_set(cols, field_ptr - begin_ptr))
|
||||
{
|
||||
ptr= f->unpack(f->ptr + offset, ptr);
|
||||
/* Field...::unpack() cannot return 0 */
|
||||
DBUG_ASSERT(ptr != NULL);
|
||||
}
|
||||
else
|
||||
bitmap_clear_bit(rw_set, field_ptr - begin_ptr);
|
||||
}
|
||||
|
||||
*row_end = ptr;
|
||||
if (master_reclength)
|
||||
{
|
||||
if (*field_ptr)
|
||||
*master_reclength = (*field_ptr)->ptr - (char*) table->record[0];
|
||||
else
|
||||
*master_reclength = table->s->reclength;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Set properties for remaining columns, if there are any. We let the
|
||||
corresponding bit in the write_set be set, to write the value if
|
||||
it was not there already. We iterate over all remaining columns,
|
||||
even if there were an error, to get as many error messages as
|
||||
possible. We are still able to return a pointer to the next row,
|
||||
so wedo that.
|
||||
*/
|
||||
for ( ; *field_ptr ; ++field_ptr)
|
||||
{
|
||||
if ((*field_ptr)->flags & (NOT_NULL_FLAG | NO_DEFAULT_VALUE_FLAG))
|
||||
{
|
||||
slave_print_msg(ERROR_LEVEL, rli, ER_NO_DEFAULT_FOR_FIELD,
|
||||
"Field `%s` of table `%s`.`%s` "
|
||||
"has no default value and cannot be NULL",
|
||||
(*field_ptr)->field_name, table->s->db.str,
|
||||
table->s->table_name.str);
|
||||
error = ER_NO_DEFAULT_FOR_FIELD;
|
||||
}
|
||||
else
|
||||
bitmap_clear_bit(write_set, (uint) (field_ptr - begin_ptr));
|
||||
(*field_ptr)->set_default();
|
||||
}
|
||||
return ptr;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
int Rows_log_event::exec_event(st_relay_log_info *rli)
|
||||
@ -5425,6 +5502,9 @@ int Rows_log_event::exec_event(st_relay_log_info *rli)
|
||||
/*
|
||||
When the open and locking succeeded, we add all the tables to
|
||||
the table map and remove them from tables to lock.
|
||||
|
||||
We also invalidate the query cache for all the tables, since
|
||||
they will now be changed.
|
||||
*/
|
||||
|
||||
TABLE_LIST *ptr;
|
||||
@ -5433,6 +5513,9 @@ int Rows_log_event::exec_event(st_relay_log_info *rli)
|
||||
rli->m_table_map.set_table(ptr->table_id, ptr->table);
|
||||
rli->touching_table(ptr->db, ptr->table_name, ptr->table_id);
|
||||
}
|
||||
#ifdef HAVE_QUERY_CACHE
|
||||
query_cache.invalidate_locked_for_write(rli->tables_to_lock);
|
||||
#endif
|
||||
rli->clear_tables_to_lock();
|
||||
}
|
||||
|
||||
@ -5477,7 +5560,11 @@ int Rows_log_event::exec_event(st_relay_log_info *rli)
|
||||
error= do_before_row_operations(table);
|
||||
while (error == 0 && row_start < (const char*) m_rows_end)
|
||||
{
|
||||
char const *row_end= do_prepare_row(thd, table, row_start);
|
||||
char const *row_end= NULL;
|
||||
if ((error= do_prepare_row(thd, rli, table, row_start, &row_end)))
|
||||
break; // We should to the after-row operation even in the
|
||||
// case of error
|
||||
|
||||
DBUG_ASSERT(row_end != NULL); // cannot happen
|
||||
DBUG_ASSERT(row_end <= (const char*)m_rows_end);
|
||||
|
||||
@ -5682,7 +5769,7 @@ void Rows_log_event::pack_info(Protocol *protocol)
|
||||
#endif
|
||||
|
||||
/**************************************************************************
|
||||
Table_map_log_event member functions
|
||||
Table_map_log_event member functions and support functions
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
@ -5924,72 +6011,9 @@ int Table_map_log_event::exec_event(st_relay_log_info *rli)
|
||||
*/
|
||||
DBUG_ASSERT(m_table->in_use);
|
||||
|
||||
/*
|
||||
Check that the number of columns and the field types in the
|
||||
event match the number of columns and field types in the opened
|
||||
table.
|
||||
*/
|
||||
uint col= m_table->s->fields;
|
||||
|
||||
if (col == m_colcnt)
|
||||
table_def const def(m_coltype, m_colcnt);
|
||||
if (def.compatible_with(rli, m_table))
|
||||
{
|
||||
while (col-- > 0)
|
||||
if (m_table->field[col]->type() != m_coltype[col])
|
||||
break;
|
||||
}
|
||||
|
||||
TABLE_SHARE const *const tsh= m_table->s;
|
||||
|
||||
/*
|
||||
Check the following termination conditions:
|
||||
|
||||
(col == m_table->s->fields)
|
||||
==> (m_table->s->fields != m_colcnt)
|
||||
(0 <= col < m_table->s->fields)
|
||||
==> (m_table->field[col]->type() != m_coltype[col])
|
||||
|
||||
Logically, A ==> B is equivalent to !A || B
|
||||
|
||||
Since col is unsigned, is suffices to check that col <=
|
||||
tsh->fields. If col wrapped (by decreasing col when it is 0),
|
||||
the number will be UINT_MAX, which is greater than tsh->fields.
|
||||
*/
|
||||
DBUG_ASSERT(!(col == tsh->fields) || tsh->fields != m_colcnt);
|
||||
DBUG_ASSERT(!(col < tsh->fields) ||
|
||||
(m_table->field[col]->type() != m_coltype[col]));
|
||||
|
||||
if (col <= tsh->fields)
|
||||
{
|
||||
/* purecov: begin inspected */
|
||||
/*
|
||||
If we get here, the number of columns in the event didn't
|
||||
match the number of columns in the table on the slave, *or*
|
||||
there were a column in the table on the slave that did not
|
||||
have the same type as given in the event.
|
||||
|
||||
If 'col' has the value that was assigned to it, it was a
|
||||
mismatch between the number of columns on the master and the
|
||||
slave.
|
||||
*/
|
||||
if (col == tsh->fields)
|
||||
{
|
||||
DBUG_ASSERT(tsh->db.str && tsh->table_name.str);
|
||||
slave_print_msg(ERROR_LEVEL, rli, ER_BINLOG_ROW_WRONG_TABLE_DEF,
|
||||
"Table width mismatch - "
|
||||
"received %u columns, %s.%s has %u columns",
|
||||
m_colcnt, tsh->db.str, tsh->table_name.str, tsh->fields);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_ASSERT(col < m_colcnt && col < tsh->fields);
|
||||
DBUG_ASSERT(tsh->db.str && tsh->table_name.str);
|
||||
slave_print_msg(ERROR_LEVEL, rli, ER_BINLOG_ROW_WRONG_TABLE_DEF,
|
||||
"Column %d type mismatch - "
|
||||
"received type %d, %s.%s has type %d",
|
||||
col, m_coltype[col], tsh->db.str, tsh->table_name.str,
|
||||
m_table->field[col]->type());
|
||||
}
|
||||
|
||||
thd->query_error= 1;
|
||||
error= ERR_BAD_TABLE_DEF;
|
||||
goto err;
|
||||
@ -6188,19 +6212,21 @@ int Write_rows_log_event::do_after_row_operations(TABLE *table, int error)
|
||||
return error;
|
||||
}
|
||||
|
||||
char const *Write_rows_log_event::do_prepare_row(THD *thd, TABLE *table,
|
||||
char const *row_start)
|
||||
int Write_rows_log_event::do_prepare_row(THD *thd, RELAY_LOG_INFO *rli,
|
||||
TABLE *table,
|
||||
char const *row_start,
|
||||
char const **row_end)
|
||||
{
|
||||
char const *ptr= row_start;
|
||||
DBUG_ASSERT(table != NULL);
|
||||
/*
|
||||
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);
|
||||
DBUG_ASSERT(ptr);
|
||||
ptr= unpack_row(table, (byte*)table->record[0], ptr, &m_cols);
|
||||
return ptr;
|
||||
DBUG_ASSERT(row_start && row_end);
|
||||
|
||||
int error;
|
||||
error= unpack_row(rli,
|
||||
table, m_width, table->record[0],
|
||||
row_start, &m_cols, row_end, &m_master_reclength,
|
||||
table->write_set);
|
||||
bitmap_copy(table->read_set, table->write_set);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6247,21 +6273,104 @@ namespace {
|
||||
|
||||
|
||||
/*
|
||||
Replace the provided record in the database.
|
||||
Copy "extra" columns from record[1] to record[0].
|
||||
|
||||
Similar to how it is done in <code>mysql_insert()</code>, we first
|
||||
try to do a <code>ha_write_row()</code> and of that fails due to
|
||||
duplicated keys (or indices), we do an <code>ha_update_row()</code>
|
||||
or a <code>ha_delete_row()</code> instead.
|
||||
|
||||
@param thd Thread context for writing the record.
|
||||
@param table Table to which record should be written.
|
||||
|
||||
@return Error code on failure, 0 on success.
|
||||
Copy the extra fields that are not present on the master but are
|
||||
present on the slave from record[1] to record[0]. This is used
|
||||
after fetching a record that are to be updated, either inside
|
||||
replace_record() or as part of executing an update_row().
|
||||
*/
|
||||
static int
|
||||
replace_record(THD *thd, TABLE *table)
|
||||
copy_extra_record_fields(TABLE *table,
|
||||
my_size_t master_reclength,
|
||||
my_ptrdiff_t master_fields)
|
||||
{
|
||||
DBUG_PRINT("info", ("Copying to %p from field %d at offset %u to field %d at offset %u",
|
||||
table->record[0],
|
||||
master_fields, master_reclength,
|
||||
table->s->fields, table->s->reclength));
|
||||
if (master_reclength < table->s->reclength)
|
||||
bmove_align(table->record[0] + master_reclength,
|
||||
table->record[1] + master_reclength,
|
||||
table->s->reclength - master_reclength);
|
||||
|
||||
/*
|
||||
Bit columns are special. We iterate over all the remaining
|
||||
columns and copy the "extra" bits to the new record. This is
|
||||
not a very good solution: it should be refactored on
|
||||
opportunity.
|
||||
|
||||
REFACTORING SUGGESTION (Matz). Introduce a member function
|
||||
similar to move_field_offset() called copy_field_offset() to
|
||||
copy field values and implement it for all Field subclasses. Use
|
||||
this function to copy data from the found record to the record
|
||||
that are going to be inserted.
|
||||
|
||||
The copy_field_offset() function need to be a virtual function,
|
||||
which in this case will prevent copying an entire range of
|
||||
fields efficiently.
|
||||
*/
|
||||
{
|
||||
Field **field_ptr= table->field + master_fields;
|
||||
for ( ; *field_ptr ; ++field_ptr)
|
||||
{
|
||||
/*
|
||||
Set the null bit according to the values in record[1]
|
||||
*/
|
||||
if ((*field_ptr)->maybe_null() &&
|
||||
(*field_ptr)->is_null_in_record(reinterpret_cast<uchar*>(table->record[1])))
|
||||
(*field_ptr)->set_null();
|
||||
else
|
||||
(*field_ptr)->set_notnull();
|
||||
|
||||
/*
|
||||
Do the extra work for special columns.
|
||||
*/
|
||||
switch ((*field_ptr)->real_type())
|
||||
{
|
||||
default:
|
||||
/* Nothing to do */
|
||||
break;
|
||||
|
||||
case FIELD_TYPE_BIT:
|
||||
Field_bit *f= static_cast<Field_bit*>(*field_ptr);
|
||||
my_ptrdiff_t const offset= table->record[1] - table->record[0];
|
||||
uchar const bits=
|
||||
get_rec_bits(f->bit_ptr + offset, f->bit_ofs, f->bit_len);
|
||||
set_rec_bits(bits, f->bit_ptr, f->bit_ofs, f->bit_len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0; // All OK
|
||||
}
|
||||
|
||||
/*
|
||||
Replace the provided record in the database.
|
||||
|
||||
SYNOPSIS
|
||||
replace_record()
|
||||
thd Thread context for writing the record.
|
||||
table Table to which record should be written.
|
||||
master_reclength
|
||||
Offset to first column that is not present on the master,
|
||||
alternatively the length of the record on the master
|
||||
side.
|
||||
|
||||
RETURN VALUE
|
||||
Error code on failure, 0 on success.
|
||||
|
||||
DESCRIPTION
|
||||
Similar to how it is done in mysql_insert(), we first try to do
|
||||
a ha_write_row() and of that fails due to duplicated keys (or
|
||||
indices), we do an ha_update_row() or a ha_delete_row() instead.
|
||||
*/
|
||||
static int
|
||||
replace_record(THD *thd, TABLE *table,
|
||||
ulong const master_reclength,
|
||||
uint const master_fields)
|
||||
{
|
||||
DBUG_ENTER("replace_record");
|
||||
DBUG_ASSERT(table != NULL && thd != NULL);
|
||||
|
||||
int error;
|
||||
@ -6273,7 +6382,7 @@ replace_record(THD *thd, TABLE *table)
|
||||
if ((keynum= table->file->get_dup_key(error)) < 0)
|
||||
{
|
||||
/* We failed to retrieve the duplicate key */
|
||||
return HA_ERR_FOUND_DUPP_KEY;
|
||||
DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6290,20 +6399,20 @@ replace_record(THD *thd, TABLE *table)
|
||||
{
|
||||
error= table->file->rnd_pos(table->record[1], table->file->dup_ref);
|
||||
if (error)
|
||||
return error;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (table->file->extra(HA_EXTRA_FLUSH_CACHE))
|
||||
{
|
||||
return my_errno;
|
||||
DBUG_RETURN(my_errno);
|
||||
}
|
||||
|
||||
if (key.get() == NULL)
|
||||
{
|
||||
key.assign(static_cast<char*>(my_alloca(table->s->max_unique_length)));
|
||||
if (key.get() == NULL)
|
||||
return ENOMEM;
|
||||
DBUG_RETURN(ENOMEM);
|
||||
}
|
||||
|
||||
key_copy((byte*)key.get(), table->record[0], table->key_info + keynum, 0);
|
||||
@ -6312,7 +6421,7 @@ replace_record(THD *thd, TABLE *table)
|
||||
table->key_info[keynum].key_length,
|
||||
HA_READ_KEY_EXACT);
|
||||
if (error)
|
||||
return error;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6320,6 +6429,12 @@ replace_record(THD *thd, TABLE *table)
|
||||
will enable us to update it or, alternatively, delete it (so
|
||||
that we can insert the new row afterwards).
|
||||
|
||||
First we copy the columns into table->record[0] that are not
|
||||
present on the master from table->record[1], if there are any.
|
||||
*/
|
||||
copy_extra_record_fields(table, master_reclength, master_fields);
|
||||
|
||||
/*
|
||||
REPLACE is defined as either INSERT or DELETE + INSERT. If
|
||||
possible, we can replace it with an UPDATE, but that will not
|
||||
work on InnoDB if FOREIGN KEY checks are necessary.
|
||||
@ -6339,22 +6454,22 @@ replace_record(THD *thd, TABLE *table)
|
||||
{
|
||||
error=table->file->ha_update_row(table->record[1],
|
||||
table->record[0]);
|
||||
return error;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((error= table->file->ha_delete_row(table->record[1])))
|
||||
return error;
|
||||
DBUG_RETURN(error);
|
||||
/* Will retry ha_write_row() with the offending row removed. */
|
||||
}
|
||||
}
|
||||
return error;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
int Write_rows_log_event::do_exec_row(TABLE *table)
|
||||
{
|
||||
DBUG_ASSERT(table != NULL);
|
||||
int error= replace_record(thd, table);
|
||||
int error= replace_record(thd, table, m_master_reclength, m_width);
|
||||
return error;
|
||||
}
|
||||
#endif /* !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) */
|
||||
@ -6640,20 +6755,23 @@ int Delete_rows_log_event::do_after_row_operations(TABLE *table, int error)
|
||||
return error;
|
||||
}
|
||||
|
||||
char const *Delete_rows_log_event::do_prepare_row(THD *thd, TABLE *table,
|
||||
char const *row_start)
|
||||
int Delete_rows_log_event::do_prepare_row(THD *thd, RELAY_LOG_INFO *rli,
|
||||
TABLE *table,
|
||||
char const *row_start,
|
||||
char const **row_end)
|
||||
{
|
||||
char const *ptr= row_start;
|
||||
DBUG_ASSERT(ptr);
|
||||
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);
|
||||
|
||||
DBUG_ASSERT(ptr != NULL);
|
||||
ptr= unpack_row(table, table->record[0], ptr, &m_cols);
|
||||
|
||||
error= unpack_row(rli,
|
||||
table, m_width, table->record[0],
|
||||
row_start, &m_cols, row_end, &m_master_reclength,
|
||||
table->read_set);
|
||||
/*
|
||||
If we will access rows using the random access method, m_key will
|
||||
be set to NULL, so we do not need to make a key copy in that case.
|
||||
@ -6665,7 +6783,7 @@ char const *Delete_rows_log_event::do_prepare_row(THD *thd, TABLE *table,
|
||||
key_copy(m_key, table->record[0], key_info, 0);
|
||||
}
|
||||
|
||||
return ptr;
|
||||
return error;
|
||||
}
|
||||
|
||||
int Delete_rows_log_event::do_exec_row(TABLE *table)
|
||||
@ -6779,11 +6897,13 @@ int Update_rows_log_event::do_after_row_operations(TABLE *table, int error)
|
||||
return error;
|
||||
}
|
||||
|
||||
char const *Update_rows_log_event::do_prepare_row(THD *thd, TABLE *table,
|
||||
char const *row_start)
|
||||
int Update_rows_log_event::do_prepare_row(THD *thd, RELAY_LOG_INFO *rli,
|
||||
TABLE *table,
|
||||
char const *row_start,
|
||||
char const **row_end)
|
||||
{
|
||||
char const *ptr= row_start;
|
||||
DBUG_ASSERT(ptr);
|
||||
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.
|
||||
@ -6791,10 +6911,16 @@ char const *Update_rows_log_event::do_prepare_row(THD *thd, TABLE *table,
|
||||
DBUG_ASSERT(table->s->fields >= m_width);
|
||||
|
||||
/* record[0] is the before image for the update */
|
||||
ptr= unpack_row(table, table->record[0], ptr, &m_cols);
|
||||
DBUG_ASSERT(ptr != NULL);
|
||||
error= unpack_row(rli,
|
||||
table, m_width, table->record[0],
|
||||
row_start, &m_cols, row_end, &m_master_reclength,
|
||||
table->read_set);
|
||||
row_start = *row_end;
|
||||
/* m_after_image is the after image for the update */
|
||||
ptr= unpack_row(table, m_after_image, ptr, &m_cols);
|
||||
error= unpack_row(rli,
|
||||
table, m_width, m_after_image,
|
||||
row_start, &m_cols, row_end, &m_master_reclength,
|
||||
table->write_set);
|
||||
|
||||
/*
|
||||
If we will access rows using the random access method, m_key will
|
||||
@ -6807,7 +6933,7 @@ char const *Update_rows_log_event::do_prepare_row(THD *thd, TABLE *table,
|
||||
key_copy(m_key, table->record[0], key_info, 0);
|
||||
}
|
||||
|
||||
return ptr;
|
||||
return error;
|
||||
}
|
||||
|
||||
int Update_rows_log_event::do_exec_row(TABLE *table)
|
||||
@ -6825,17 +6951,20 @@ int Update_rows_log_event::do_exec_row(TABLE *table)
|
||||
example, the partition engine).
|
||||
|
||||
Since find_and_fetch_row() puts the fetched record (i.e., the old
|
||||
record) in record[0], we have to move it out of the way and into
|
||||
record[1]. After that, we can put the new record (i.e., the after
|
||||
image) into record[0].
|
||||
record) in record[1], we can keep it there. We put the new record
|
||||
(i.e., the after image) into record[0], and copy the fields that
|
||||
are on the slave (i.e., in record[1]) into record[0], effectively
|
||||
overwriting the default values that where put there by the
|
||||
unpack_row() function.
|
||||
*/
|
||||
bmove_align(table->record[1], table->record[0], table->s->reclength);
|
||||
bmove_align(table->record[0], m_after_image, table->s->reclength);
|
||||
copy_extra_record_fields(table, m_master_reclength, m_width);
|
||||
|
||||
/*
|
||||
Now we should have the right row to update. The old row (the one
|
||||
we're looking for) has to be in record[1] and the new row has to
|
||||
be in record[0] for all storage engines to work correctly.
|
||||
Now we have the right row to update. The old row (the one we're
|
||||
looking for) is in record[1] and the new row has is in record[0].
|
||||
We also have copied the original values already in the slave's
|
||||
database into the after image delivered from the master.
|
||||
*/
|
||||
error= table->file->ha_update_row(table->record[1], table->record[0]);
|
||||
|
||||
|
@ -1874,6 +1874,7 @@ protected:
|
||||
ulong m_table_id; /* Table ID */
|
||||
MY_BITMAP m_cols; /* Bitmap denoting columns available */
|
||||
ulong m_width; /* The width of the columns bitmap */
|
||||
ulong m_master_reclength; /* Length of record on master side */
|
||||
|
||||
/* Bit buffer in the same memory as the class */
|
||||
uint32 m_bitbuf[128/(sizeof(uint32)*8)];
|
||||
@ -1927,12 +1928,15 @@ private:
|
||||
since SQL thread specific data is not available: that data is made
|
||||
available for the do_exec function.
|
||||
|
||||
RETURN VALUE
|
||||
A pointer to the start of the next row, or NULL if the preparation
|
||||
failed. Currently, preparation cannot fail, but don't rely on this
|
||||
behavior.
|
||||
|
||||
RETURN VALUE
|
||||
Error code, if something went wrong, 0 otherwise.
|
||||
*/
|
||||
virtual char const *do_prepare_row(THD*, TABLE*, char const *row_start) = 0;
|
||||
virtual int do_prepare_row(THD*, RELAY_LOG_INFO*, TABLE*,
|
||||
char const *row_start, char const **row_end) = 0;
|
||||
|
||||
/*
|
||||
Primitive to do the actual execution necessary for a row.
|
||||
@ -2000,10 +2004,11 @@ private:
|
||||
gptr m_memory;
|
||||
byte *m_after_image;
|
||||
|
||||
virtual int do_before_row_operations(TABLE *table);
|
||||
virtual int do_after_row_operations(TABLE *table, int error);
|
||||
virtual char const *do_prepare_row(THD*, TABLE*, char const *row_start);
|
||||
virtual int do_exec_row(TABLE *table);
|
||||
virtual int do_before_row_operations(TABLE *table);
|
||||
virtual int do_after_row_operations(TABLE *table, int error);
|
||||
virtual int do_prepare_row(THD*, RELAY_LOG_INFO*, TABLE*,
|
||||
char const *row_start, char const **row_end);
|
||||
virtual int do_exec_row(TABLE *table);
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -2064,10 +2069,11 @@ private:
|
||||
byte *m_key;
|
||||
byte *m_after_image;
|
||||
|
||||
virtual int do_before_row_operations(TABLE *table);
|
||||
virtual int do_after_row_operations(TABLE *table, int error);
|
||||
virtual char const *do_prepare_row(THD*, TABLE*, char const *row_start);
|
||||
virtual int do_exec_row(TABLE *table);
|
||||
virtual int do_before_row_operations(TABLE *table);
|
||||
virtual int do_after_row_operations(TABLE *table, int error);
|
||||
virtual int do_prepare_row(THD*, RELAY_LOG_INFO*, TABLE*,
|
||||
char const *row_start, char const **row_end);
|
||||
virtual int do_exec_row(TABLE *table);
|
||||
#endif /* !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) */
|
||||
};
|
||||
|
||||
@ -2134,10 +2140,11 @@ private:
|
||||
byte *m_key;
|
||||
byte *m_after_image;
|
||||
|
||||
virtual int do_before_row_operations(TABLE *table);
|
||||
virtual int do_after_row_operations(TABLE *table, int error);
|
||||
virtual char const *do_prepare_row(THD*, TABLE*, char const *row_start);
|
||||
virtual int do_exec_row(TABLE *table);
|
||||
virtual int do_before_row_operations(TABLE *table);
|
||||
virtual int do_after_row_operations(TABLE *table, int error);
|
||||
virtual int do_prepare_row(THD*, RELAY_LOG_INFO*, TABLE*,
|
||||
char const *row_start, char const **row_end);
|
||||
virtual int do_exec_row(TABLE *table);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -21,6 +21,9 @@
|
||||
except the part which must be in the server and in the client.
|
||||
*/
|
||||
|
||||
#ifndef MYSQL_PRIV_H
|
||||
#define MYSQL_PRIV_H
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
|
||||
#include <my_global.h>
|
||||
@ -2036,3 +2039,5 @@ bool schema_table_store_record(THD *thd, TABLE *table);
|
||||
|
||||
#endif /* MYSQL_SERVER */
|
||||
#endif /* MYSQL_CLIENT */
|
||||
|
||||
#endif /* MYSQL_PRIV_H */
|
||||
|
@ -3121,7 +3121,11 @@ with --log-bin instead.");
|
||||
global_system_variables.binlog_format= BINLOG_FORMAT_ROW;
|
||||
else
|
||||
#endif
|
||||
#if defined(HAVE_ROW_BASED_REPLICATION)
|
||||
global_system_variables.binlog_format= BINLOG_FORMAT_MIXED;
|
||||
#else
|
||||
global_system_variables.binlog_format= BINLOG_FORMAT_STMT;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Check that we have not let the format to unspecified at this point */
|
||||
@ -4886,7 +4890,13 @@ struct my_option my_long_options[] =
|
||||
"supports only statement-based binary logging, so only 'statement' is "
|
||||
"a legal value."
|
||||
#endif
|
||||
, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
||||
, 0, 0, 0, GET_STR, REQUIRED_ARG,
|
||||
#ifdef HAVE_ROW_BASED_REPLICATION
|
||||
BINLOG_FORMAT_MIXED
|
||||
#else
|
||||
BINLOG_FORMAT_STMT
|
||||
#endif
|
||||
, 0, 0, 0, 0, 0 },
|
||||
{"binlog-do-db", OPT_BINLOG_DO_DB,
|
||||
"Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
158
sql/rpl_utility.cc
Normal file
158
sql/rpl_utility.cc
Normal file
@ -0,0 +1,158 @@
|
||||
/* Copyright 2006 MySQL AB. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include "rpl_utility.h"
|
||||
|
||||
uint32
|
||||
field_length_from_packed(enum_field_types const field_type,
|
||||
byte const *const data)
|
||||
{
|
||||
uint32 length;
|
||||
|
||||
switch (field_type) {
|
||||
case MYSQL_TYPE_DECIMAL:
|
||||
case MYSQL_TYPE_NEWDECIMAL:
|
||||
length= ~0UL;
|
||||
break;
|
||||
case MYSQL_TYPE_YEAR:
|
||||
case MYSQL_TYPE_TINY:
|
||||
length= 1;
|
||||
break;
|
||||
case MYSQL_TYPE_SHORT:
|
||||
length= 2;
|
||||
break;
|
||||
case MYSQL_TYPE_INT24:
|
||||
length= 3;
|
||||
break;
|
||||
case MYSQL_TYPE_LONG:
|
||||
length= 4;
|
||||
break;
|
||||
#ifdef HAVE_LONG_LONG
|
||||
case MYSQL_TYPE_LONGLONG:
|
||||
length= 8;
|
||||
break;
|
||||
#endif
|
||||
case MYSQL_TYPE_FLOAT:
|
||||
length= sizeof(float);
|
||||
break;
|
||||
case MYSQL_TYPE_DOUBLE:
|
||||
length= sizeof(double);
|
||||
break;
|
||||
case MYSQL_TYPE_NULL:
|
||||
length= 0;
|
||||
break;
|
||||
case MYSQL_TYPE_NEWDATE:
|
||||
length= 3;
|
||||
break;
|
||||
case MYSQL_TYPE_DATE:
|
||||
length= 4;
|
||||
break;
|
||||
case MYSQL_TYPE_TIME:
|
||||
length= 3;
|
||||
break;
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
length= 4;
|
||||
break;
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
length= 8;
|
||||
break;
|
||||
break;
|
||||
case MYSQL_TYPE_BIT:
|
||||
length= ~0UL;
|
||||
break;
|
||||
default:
|
||||
/* This case should never be chosen */
|
||||
DBUG_ASSERT(0);
|
||||
/* If something goes awfully wrong, it's better to get a string than die */
|
||||
case MYSQL_TYPE_STRING:
|
||||
length= uint2korr(data);
|
||||
break;
|
||||
|
||||
case MYSQL_TYPE_ENUM:
|
||||
case MYSQL_TYPE_SET:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
case MYSQL_TYPE_VARCHAR:
|
||||
length= ~0UL; // NYI
|
||||
break;
|
||||
|
||||
case MYSQL_TYPE_TINY_BLOB:
|
||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
||||
case MYSQL_TYPE_LONG_BLOB:
|
||||
case MYSQL_TYPE_BLOB:
|
||||
case MYSQL_TYPE_GEOMETRY:
|
||||
length= ~0UL; // NYI
|
||||
break;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* table_def member definitions *
|
||||
*********************************************************************/
|
||||
|
||||
/*
|
||||
Is the definition compatible with a table?
|
||||
|
||||
Compare the definition with a table to see if it is compatible with
|
||||
it. A table definition is compatible with a table if
|
||||
- the columns types of the table definition is a (not necessarily
|
||||
proper) prefix of the column type of the table, or
|
||||
- the other way around
|
||||
*/
|
||||
int
|
||||
table_def::compatible_with(RELAY_LOG_INFO *rli, TABLE *table)
|
||||
const
|
||||
{
|
||||
/*
|
||||
We only check the initial columns for the tables.
|
||||
*/
|
||||
uint const cols_to_check= min(table->s->fields, size());
|
||||
int error= 0;
|
||||
|
||||
TABLE_SHARE const *const tsh= table->s;
|
||||
|
||||
/*
|
||||
To get proper error reporting for all columns of the table, we
|
||||
both check the width and iterate over all columns.
|
||||
*/
|
||||
if (tsh->fields < size())
|
||||
{
|
||||
DBUG_ASSERT(tsh->db.str && tsh->table_name.str);
|
||||
error= 1;
|
||||
slave_print_msg(ERROR_LEVEL, rli, ER_BINLOG_ROW_WRONG_TABLE_DEF,
|
||||
"Table width mismatch - "
|
||||
"received %u columns, %s.%s has %u columns",
|
||||
size(), tsh->db.str, tsh->table_name.str, tsh->fields);
|
||||
}
|
||||
|
||||
for (uint col= 0 ; col < cols_to_check ; ++col)
|
||||
{
|
||||
if (table->field[col]->type() != type(col))
|
||||
{
|
||||
DBUG_ASSERT(col < size() && col < tsh->fields);
|
||||
DBUG_ASSERT(tsh->db.str && tsh->table_name.str);
|
||||
error= 1;
|
||||
slave_print_msg(ERROR_LEVEL, rli, ER_BINLOG_ROW_WRONG_TABLE_DEF,
|
||||
"Column %d type mismatch - "
|
||||
"received type %d, %s.%s has type %d",
|
||||
col, type(col), tsh->db.str, tsh->table_name.str,
|
||||
table->field[col]->type());
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
60
sql/rpl_utility.h
Normal file
60
sql/rpl_utility.h
Normal file
@ -0,0 +1,60 @@
|
||||
/* Copyright 2006 MySQL AB. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifndef RPL_UTILITY_H
|
||||
#define RPL_UTILITY_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
#error "Don't include this C++ header file from a non-C++ file!"
|
||||
#endif
|
||||
|
||||
#include "mysql_priv.h"
|
||||
|
||||
uint32
|
||||
field_length_from_packed(enum_field_types const field_type,
|
||||
byte const *const data);
|
||||
|
||||
/*
|
||||
A table definition from the master.
|
||||
|
||||
RESPONSIBILITIES
|
||||
|
||||
- Extract table definition data from the table map event
|
||||
- Check if table definition in table map is compatible with table
|
||||
definition on slave
|
||||
*/
|
||||
|
||||
class table_def
|
||||
{
|
||||
public:
|
||||
typedef unsigned char field_type;
|
||||
|
||||
table_def(field_type *t, my_size_t s)
|
||||
: m_type(t), m_size(s)
|
||||
{
|
||||
}
|
||||
|
||||
my_size_t size() const { return m_size; }
|
||||
field_type type(my_ptrdiff_t i) const { return m_type[i]; }
|
||||
|
||||
int compatible_with(RELAY_LOG_INFO *rli, TABLE *table) const;
|
||||
|
||||
private:
|
||||
my_size_t m_size;
|
||||
field_type *m_type;
|
||||
};
|
||||
|
||||
#endif /* RPL_UTILITY_H */
|
@ -2660,7 +2660,12 @@ int THD::binlog_delete_row(TABLE* table, bool is_trans,
|
||||
int THD::binlog_flush_pending_rows_event(bool stmt_end)
|
||||
{
|
||||
DBUG_ENTER("THD::binlog_flush_pending_rows_event");
|
||||
if (!current_stmt_binlog_row_based || !mysql_bin_log.is_open())
|
||||
/*
|
||||
We shall flush the pending event even if we are not in row-based
|
||||
mode: it might be the case that we left row-based mode before
|
||||
flushing anything (e.g., if we have explicitly locked tables).
|
||||
*/
|
||||
if (!mysql_bin_log.is_open())
|
||||
DBUG_RETURN(0);
|
||||
|
||||
/*
|
||||
@ -2726,6 +2731,21 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype,
|
||||
DBUG_PRINT("enter", ("qtype=%d, query='%s'", qtype, query));
|
||||
DBUG_ASSERT(query && mysql_bin_log.is_open());
|
||||
|
||||
/*
|
||||
If we are not in prelocked mode, mysql_unlock_tables() will be
|
||||
called after this binlog_query(), so we have to flush the pending
|
||||
rows event with the STMT_END_F set to unlock all tables at the
|
||||
slave side as well.
|
||||
|
||||
If we are in prelocked mode, the flushing will be done inside the
|
||||
top-most close_thread_tables().
|
||||
*/
|
||||
#ifdef HAVE_ROW_BASED_REPLICATION
|
||||
if (this->prelocked_mode == NON_PRELOCKED)
|
||||
if (int error= binlog_flush_pending_rows_event(TRUE))
|
||||
DBUG_RETURN(error);
|
||||
#endif /*HAVE_ROW_BASED_REPLICATION*/
|
||||
|
||||
switch (qtype) {
|
||||
case THD::MYSQL_QUERY_TYPE:
|
||||
/*
|
||||
@ -2739,25 +2759,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype,
|
||||
case THD::ROW_QUERY_TYPE:
|
||||
#ifdef HAVE_ROW_BASED_REPLICATION
|
||||
if (current_stmt_binlog_row_based)
|
||||
{
|
||||
/*
|
||||
If thd->lock is set, then we are not inside a stored function.
|
||||
In that case, mysql_unlock_tables() will be called after this
|
||||
binlog_query(), so we have to flush the pending rows event
|
||||
with the STMT_END_F set to unlock all tables at the slave side
|
||||
as well.
|
||||
|
||||
We will not flush the pending event, if thd->lock is NULL.
|
||||
This means that we are inside a stored function or trigger, so
|
||||
the flushing will be done inside the top-most
|
||||
close_thread_tables().
|
||||
*/
|
||||
#ifdef HAVE_ROW_BASED_REPLICATION
|
||||
if (this->lock)
|
||||
DBUG_RETURN(binlog_flush_pending_rows_event(TRUE));
|
||||
#endif /*HAVE_ROW_BASED_REPLICATION*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
#endif
|
||||
/* Otherwise, we fall through */
|
||||
case THD::STMT_QUERY_TYPE:
|
||||
|
@ -2106,8 +2106,6 @@ bool delayed_insert::handle_inserts(void)
|
||||
|
||||
thd.start_time=row->start_time;
|
||||
thd.query_start_used=row->query_start_used;
|
||||
/* for the binlog, forget auto_increment ids generated by previous rows */
|
||||
// thd.auto_inc_intervals_in_cur_stmt_for_binlog.empty();
|
||||
thd.first_successful_insert_id_in_prev_stmt=
|
||||
row->first_successful_insert_id_in_prev_stmt;
|
||||
thd.stmt_depends_on_first_successful_insert_id_in_prev_stmt=
|
||||
|
@ -7349,7 +7349,9 @@ innobase_xa_prepare(
|
||||
int error = 0;
|
||||
trx_t* trx = check_trx_exists(thd);
|
||||
|
||||
if (thd->lex->sql_command != SQLCOM_XA_PREPARE) {
|
||||
if (thd->lex->sql_command != SQLCOM_XA_PREPARE &&
|
||||
(all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))))
|
||||
{
|
||||
|
||||
/* For ibbackup to work the order of transactions in binlog
|
||||
and InnoDB must be the same. Consider the situation
|
||||
|
@ -1,15 +1,12 @@
|
||||
SUBDIRS = mytap . mysys examples
|
||||
|
||||
noinst_SCRIPTS = unit
|
||||
EXTRA_DIST = unit.pl
|
||||
CLEANFILES = unit
|
||||
|
||||
unittests = mytap mysys
|
||||
|
||||
test: unit
|
||||
./unit run $(unittests)
|
||||
|
||||
unit: $(srcdir)/unit.pl
|
||||
cp $(srcdir)/unit.pl $@
|
||||
chmod 700 $@
|
||||
test:
|
||||
perl unit.pl run $(unittests)
|
||||
|
||||
test-verbose:
|
||||
HARNESS_VERBOSE=1 perl unit.pl run $(unittests)
|
||||
|
@ -9,7 +9,9 @@ mytap Source for the MyTAP library
|
||||
mysys Tests for mysys components
|
||||
bitmap-t.c Unit test for MY_BITMAP
|
||||
base64-t.c Unit test for base64 encoding functions
|
||||
examples Example unit tests
|
||||
examples Example unit tests.
|
||||
core-t.c Example of raising a signal in the middle of the test
|
||||
THIS TEST WILL STOP ALL FURTHER TESTING!
|
||||
simple-t.c Example of a standard TAP unit test
|
||||
skip-t.c Example where some test points are skipped
|
||||
skip_all-t.c Example of a test where the entire test is skipped
|
||||
@ -24,6 +26,9 @@ To make and execute all unit tests in the directory:
|
||||
|
||||
make test
|
||||
|
||||
Observe that the tests in the examples/ directory are just various
|
||||
examples of tests and are not expected to pass.
|
||||
|
||||
|
||||
Adding unit tests
|
||||
-----------------
|
||||
|
@ -5,5 +5,5 @@ AM_LDFLAGS = -L$(top_builddir)/unittest/mytap
|
||||
|
||||
LDADD = -lmytap
|
||||
|
||||
noinst_PROGRAMS = simple-t skip-t todo-t skip_all-t no_plan-t
|
||||
noinst_PROGRAMS = simple-t skip-t todo-t skip_all-t no_plan-t core-t
|
||||
|
||||
|
19
unittest/examples/core-t.c
Normal file
19
unittest/examples/core-t.c
Normal file
@ -0,0 +1,19 @@
|
||||
|
||||
#include "my_config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <tap.h>
|
||||
|
||||
/*
|
||||
This is a simple test to demonstrate what happens if a signal that
|
||||
generates a core is raised.
|
||||
|
||||
Note that this test will stop all further testing!
|
||||
*/
|
||||
|
||||
int main() {
|
||||
plan(3);
|
||||
ok(1, "First test");
|
||||
abort();
|
||||
return exit_status();
|
||||
}
|
@ -20,10 +20,13 @@
|
||||
|
||||
#include "tap.h"
|
||||
|
||||
#include "my_config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
/**
|
||||
Test data structure.
|
||||
@ -70,7 +73,7 @@ emit_tap(int pass, char const *fmt, va_list ap)
|
||||
/**
|
||||
Emit a TAP directive.
|
||||
|
||||
TAP directives are comments after a have the form
|
||||
TAP directives are comments after that have the form:
|
||||
|
||||
@code
|
||||
ok 1 # skip reason for skipping
|
||||
@ -96,6 +99,25 @@ emit_endl()
|
||||
fprintf(tapout, "\n");
|
||||
}
|
||||
|
||||
static void
|
||||
handle_core_signal(int signo)
|
||||
{
|
||||
BAIL_OUT("Signal %d thrown", signo);
|
||||
}
|
||||
|
||||
void
|
||||
BAIL_OUT(char const *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
fprintf(tapout, "Bail out! ");
|
||||
vfprintf(tapout, fmt, ap);
|
||||
emit_endl();
|
||||
va_end(ap);
|
||||
exit(255);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
diag(char const *fmt, ...)
|
||||
{
|
||||
@ -103,14 +125,38 @@ diag(char const *fmt, ...)
|
||||
va_start(ap, fmt);
|
||||
fprintf(tapout, "# ");
|
||||
vfprintf(tapout, fmt, ap);
|
||||
fprintf(tapout, "\n");
|
||||
emit_endl();
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
typedef struct signal_entry {
|
||||
int signo;
|
||||
void (*handler)(int);
|
||||
} signal_entry;
|
||||
|
||||
static signal_entry install_signal[]= {
|
||||
{ SIGQUIT, handle_core_signal },
|
||||
{ SIGILL, handle_core_signal },
|
||||
{ SIGABRT, handle_core_signal },
|
||||
{ SIGFPE, handle_core_signal },
|
||||
{ SIGSEGV, handle_core_signal },
|
||||
{ SIGBUS, handle_core_signal },
|
||||
{ SIGXCPU, handle_core_signal },
|
||||
{ SIGXFSZ, handle_core_signal },
|
||||
{ SIGSYS, handle_core_signal },
|
||||
{ SIGTRAP, handle_core_signal }
|
||||
};
|
||||
|
||||
void
|
||||
plan(int const count)
|
||||
{
|
||||
/*
|
||||
Install signal handler
|
||||
*/
|
||||
size_t i;
|
||||
for (i= 0; i < sizeof(install_signal)/sizeof(*install_signal); ++i)
|
||||
signal(install_signal[i].signo, install_signal[i].handler);
|
||||
|
||||
g_test.plan= count;
|
||||
switch (count)
|
||||
{
|
||||
|
@ -24,8 +24,8 @@
|
||||
#include "my_global.h"
|
||||
|
||||
/*
|
||||
@defgroup MyTAP MySQL support for performing unit tests according to TAP.
|
||||
|
||||
@defgroup MyTAP MySQL support for performing unit tests according to
|
||||
the Test Anything Protocol (TAP).
|
||||
*/
|
||||
|
||||
#define NO_PLAN (0)
|
||||
@ -36,6 +36,7 @@
|
||||
@internal We are using the "typedef struct X { ... } X" idiom to
|
||||
create class/struct X both in C and C++.
|
||||
*/
|
||||
|
||||
typedef struct TEST_DATA {
|
||||
/**
|
||||
Number of tests that is planned to execute.
|
||||
@ -67,8 +68,13 @@ extern "C" {
|
||||
it was called with <code>NO_PLAN</code>, i.e., the test plan will
|
||||
be printed after all the test lines.
|
||||
|
||||
The plan() function will install signal handlers for all signals
|
||||
that generate a core, so if you want to override these signals, do
|
||||
it <em>after</em> you have called the plan() function.
|
||||
|
||||
@param count The planned number of tests to run.
|
||||
*/
|
||||
|
||||
void plan(int count);
|
||||
|
||||
|
||||
@ -87,9 +93,11 @@ void plan(int count);
|
||||
@param fmt Format string in printf() format. NULL is allowed, in
|
||||
which case nothing is printed.
|
||||
*/
|
||||
|
||||
void ok(int pass, char const *fmt, ...)
|
||||
__attribute__((format(printf,2,3)));
|
||||
|
||||
|
||||
/**
|
||||
Skip a determined number of tests.
|
||||
|
||||
@ -114,6 +122,7 @@ void ok(int pass, char const *fmt, ...)
|
||||
@param how_many Number of tests that are to be skipped.
|
||||
@param reason A reason for skipping the tests
|
||||
*/
|
||||
|
||||
void skip(int how_many, char const *reason, ...)
|
||||
__attribute__((format(printf,2,3)));
|
||||
|
||||
@ -130,22 +139,47 @@ void skip(int how_many, char const *reason, ...)
|
||||
for (i = 0 ; i < 2 ; ++i)
|
||||
ok(duck[i] == paddling, "is duck %d paddling?", i);
|
||||
}
|
||||
@endcode
|
||||
|
||||
@see skip
|
||||
|
||||
@endcode
|
||||
*/
|
||||
|
||||
#define SKIP_BLOCK_IF(SKIP_IF_TRUE, COUNT, REASON) \
|
||||
if (SKIP_IF_TRUE) skip((COUNT),(REASON)); else
|
||||
|
||||
|
||||
/**
|
||||
Print a diagnostics message.
|
||||
|
||||
@param fmt Diagnostics message in printf() format.
|
||||
*/
|
||||
|
||||
void diag(char const *fmt, ...)
|
||||
__attribute__((format(printf,1,2)));
|
||||
|
||||
|
||||
/**
|
||||
Print a bail out message.
|
||||
|
||||
A bail out message can be issued when no further testing can be
|
||||
done, e.g., when there are missing dependencies.
|
||||
|
||||
The test will exit with status 255. This function does not return.
|
||||
|
||||
@code
|
||||
BAIL_OUT("Lost connection to server %s", server_name);
|
||||
@endcode
|
||||
|
||||
@note A bail out message is printed if a signal that generates a
|
||||
core is raised.
|
||||
|
||||
@param fmt Bail out message in printf() format.
|
||||
*/
|
||||
|
||||
void BAIL_OUT(char const *fmt, ...)
|
||||
__attribute__((noreturn, format(printf,1,2)));
|
||||
|
||||
|
||||
/**
|
||||
Print summary report and return exit status.
|
||||
|
||||
@ -161,6 +195,7 @@ void diag(char const *fmt, ...)
|
||||
@returns EXIT_SUCCESS if all tests passed, EXIT_FAILURE if one or
|
||||
more tests failed.
|
||||
*/
|
||||
|
||||
int exit_status(void);
|
||||
|
||||
|
||||
@ -171,9 +206,11 @@ int exit_status(void);
|
||||
automatically call exit(), so there is no need to have checks
|
||||
around it.
|
||||
*/
|
||||
|
||||
void skip_all(char const *reason, ...)
|
||||
__attribute__((noreturn, format(printf, 1, 2)));
|
||||
|
||||
|
||||
/**
|
||||
Start section of tests that are not yet ready.
|
||||
|
||||
@ -194,14 +231,18 @@ void skip_all(char const *reason, ...)
|
||||
|
||||
@param message Message that will be printed before the todo tests.
|
||||
*/
|
||||
|
||||
void todo_start(char const *message, ...)
|
||||
__attribute__((format (printf, 1, 2)));
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
|
||||
|
||||
/**
|
||||
End a section of tests that are not yet ready.
|
||||
*/
|
||||
|
||||
void todo_end();
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user