polardbxengine/mysql-test/suite/rpl/t/rpl_row_img_sanity.test

836 lines
28 KiB
Plaintext

#
# Description
# ===========
#
# This test case checks whether binlog files contain Before and After
# image values as expected. Configuration is done using the
# --binlog-row-image variable.
#
# How it works
# ============
#
# The test case is implemented such that master and slave basically
# hold the same table but sometimes differ in indexes, number of
# columns and data types constraints (autoinc or NOT NULL). Then some
# statements are executed and the output of mysqlbinlog is parsed for
# the given event to check if the columns in the before and after
# image match expectations according to the binlog-row-image value on
# master and on slave.
#
# See also WL#5096.
#
--source include/not_group_replication_plugin.inc
-- source include/have_binlog_format_row.inc
-- source include/no_valgrind_without_big.inc
-- source include/master-slave.inc
-- connection slave
call mtr.add_suppression("Slave: Can\'t find record in \'t\' Error_code: MY-001032");
call mtr.add_suppression("Slave SQL for channel '': .*Could not execute Update_rows event on table test.t; Can.t find record in .t.* Error_code: MY-001032");
call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state");
-- connection master
## assertion: check that default value for binlog-row-image == 'FULL'
SHOW VARIABLES LIKE 'binlog_row_image';
## save original
-- connection master
SET @old_binlog_row_image= @@binlog_row_image;
-- connection slave
SET @old_binlog_row_image= @@binlog_row_image;
-- connection master
-- echo #####################################################
-- echo # basic assertion that binlog_row_image='FULL' is the
-- echo # default
-- echo #####################################################
-- connection master
-- let $row_img_set=master:FULL:N,slave:FULL:Y
-- source include/rpl_row_img_set.inc
CREATE TABLE t (c1 int, c2 int, c3 blob, primary key(c1));
-- let $row_img_query= INSERT INTO t(c1,c3) VALUES (1, 'a')
-- let $row_img_expected_master= | 1:1 2:NULL 3:'a'
-- let $row_img_expected_slave = | 1:1 2:NULL 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c1=2 WHERE c1=1;
-- let $row_img_expected_master= 1:1 2:NULL 3:'a' | 1:2 2:NULL 3:'a'
-- let $row_img_expected_slave = 1:1 2:NULL 3:'a' | 1:2 2:NULL 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t;
-- let $row_img_expected_master= 1:2 2:NULL 3:'a' |
-- let $row_img_expected_slave = 1:2 2:NULL 3:'a' |
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
#
# Assertions: combines img_types with different index types.
# The checks that rows are logged with expected
# image contents, depending on the img_type.
#
-- connection master
SET @img_types= 'MINIMAL NOBLOB FULL';
while (`SELECT HEX(@img_types) != HEX('')`)
{
-- disable_query_log
let $img_type= `SELECT SUBSTRING_INDEX(@img_types, ' ', 1)`;
-- let $row_img_set=master:$img_type:N,slave:$img_type:Y
-- source include/rpl_row_img_set.inc
SET @index_types= 'UK-NOT-NULL PK UK K NONE';
while (`SELECT HEX(@index_types) != HEX('')`)
{
-- disable_query_log
let $index_type= `SELECT SUBSTRING_INDEX(@index_types, ' ', 1)`;
-- enable_query_log
-- echo ITERATIONS: row_img: $img_type, indexes: $index_type
-- source include/rpl_reset.inc
-- connection master
# create the table
-- echo CREATING TABLE IN $CURRENT_CONNECTION WITH INDEX '$index_type'
if (`SELECT HEX('$index_type') = HEX('NONE')`)
{
CREATE TABLE t (c1 int, c2 int, c3 blob);
}
if (`SELECT HEX('$index_type') = HEX('K')`)
{
CREATE TABLE t (c1 int, c2 int, c3 blob, key(c1));
}
if (`SELECT HEX('$index_type') = HEX('UK')`)
{
CREATE TABLE t (c1 int, c2 int, c3 blob, unique key(c1));
}
if (`SELECT HEX('$index_type') = HEX('PK')`)
{
CREATE TABLE t (c1 int, c2 int, c3 blob, primary key(c1));
}
if (`SELECT HEX('$index_type') = HEX('UK-NOT-NULL')`)
{
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 blob, unique key(c1));
}
--source include/sync_slave_sql_with_master.inc
-- connection master
# Issue some statements
-- let $row_img_query= INSERT INTO t VALUES (1,2,"a")
-- let $row_img_expected_master= | 1:1 2:2 3:'a'
-- let $row_img_expected_slave = | 1:1 2:2 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1,c3) VALUES (10,"a")
if (`SELECT @@binlog_row_image = "FULL" or @@binlog_row_image = "NOBLOB"`)
{
-- let $row_img_expected_master= | 1:10 2:NULL 3:'a'
}
if (`SELECT @@binlog_row_image = "MINIMAL"`)
{
-- let $row_img_expected_master= | 1:10 3:'a'
}
-- let $row_img_expected_slave= $row_img_expected_master
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1) VALUES (1000)
if (`SELECT @@binlog_row_image = "FULL"`)
{
-- let $row_img_expected_master= | 1:1000 2:NULL 3:NULL
}
if (`SELECT @@binlog_row_image = "NOBLOB"`)
{
-- let $row_img_expected_master= | 1:1000 2:NULL
}
if (`SELECT @@binlog_row_image = "MINIMAL"`)
{
-- let $row_img_expected_master= | 1:1000
}
-- let $row_img_expected_slave= $row_img_expected_master
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c1=2 WHERE c1=1
if (`SELECT @@binlog_row_image = "FULL" OR (SELECT '$index_type' IN ('NONE', 'K', 'UK'))`)
{
-- let $bi= 1:1 2:2 3:'a'
}
# noblob with pk + uk not nullable
if (`SELECT @@binlog_row_image = "NOBLOB" AND (SELECT '$index_type' IN ('PK', 'UK-NOT-NULL'))`)
{
-- let $bi= 1:1 2:2
}
if (`SELECT @@binlog_row_image = "MINIMAL" AND (SELECT '$index_type' IN ('PK', 'UK-NOT-NULL'))`)
{
-- let $bi= 1:1
}
if (`SELECT @@binlog_row_image = "FULL"`)
{
-- let $ai= 1:2 2:2 3:'a'
}
if (`SELECT @@binlog_row_image = "NOBLOB"`)
{
-- let $ai= 1:2 2:2
}
if (`SELECT @@binlog_row_image = "MINIMAL"`)
{
-- let $ai= 1:2
}
-- let $row_img_expected_master= $bi | $ai
-- let $row_img_expected_slave = $bi | $ai
-- let $ai=
-- let $bi=
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t WHERE c2=2
# no key, simple key or unique key nullable
if (`SELECT @@binlog_row_image = "FULL" OR (SELECT '$index_type' IN ('NONE', 'K', 'UK'))`)
{
-- let $row_img_expected_master= 1:2 2:2 3:'a' |
}
# noblob with pk + uk not nullable
if (`SELECT @@binlog_row_image = "NOBLOB" AND (SELECT '$index_type' IN ('PK', 'UK-NOT-NULL'))`)
{
-- let $row_img_expected_master= 1:2 2:2 |
}
if (`SELECT @@binlog_row_image = "MINIMAL" AND (SELECT '$index_type' IN ('PK', 'UK-NOT-NULL'))`)
{
-- let $row_img_expected_master= 1:2 |
}
-- let $row_img_expected_slave= $row_img_expected_master
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- disable_query_log
-- connection master
-- eval SET @index_types= LTRIM(SUBSTRING(@index_types, LENGTH('$index_type') + 1))
-- enable_query_log
}
-- disable_query_log
-- connection master
-- eval SET @img_types= LTRIM(SUBSTRING(@img_types, LENGTH('$img_type') + 1))
-- enable_query_log
}
### Some more scenarios
### These relate to different constraints on PKE and its impact
### on logged images. Further description is inline.
-- connection master
SET @img_types= 'MINIMAL NOBLOB FULL';
while (`SELECT HEX(@img_types) != HEX('')`)
{
-- disable_query_log
let $img_type= `SELECT SUBSTRING_INDEX(@img_types, ' ', 1)`;
-- let $row_img_set=master:$img_type:N,slave:$img_type:Y
-- source include/rpl_row_img_set.inc
-- echo ITERATIONS: row_img: $img_type
-- source include/rpl_reset.inc
-- connection master
# ASSERTIONS:
# UPDATE (MINIMAL,NOBLOB,FULL)
# - on slave, columns that are not in master's BI but are in slave's
# PKE are in slave's BI
-- connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t (a INT);
SET SQL_LOG_BIN=1;
-- connection slave
SET SQL_LOG_BIN=0;
CREATE TABLE t (a INT, b INT DEFAULT 1000);
SET SQL_LOG_BIN=1;
-- connection master
INSERT INTO t VALUES (1);
--source include/sync_slave_sql_with_master.inc
-- connection master
-- let $row_img_query= UPDATE t SET a=2 WHERE a=1;
# 1. columns that are set to default value are in AI
-- let $row_img_expected_master= 1:1 | 1:2
if (`SELECT @@binlog_row_image = "NOBLOB" OR (SELECT @@binlog_row_image = "FULL")`)
{
-- let $row_img_expected_slave = 1:1 2:1000 | 1:2 2:1000
}
if (`SELECT @@binlog_row_image = "MINIMAL"`)
{
-- let $row_img_expected_slave = 1:1 2:1000 | 1:2
}
-- source include/rpl_row_img_parts_master_slave.inc
-- connection master
DROP TABLE IF EXISTS t;
--source include/sync_slave_sql_with_master.inc
-- source include/rpl_reset.inc
-- connection master
if (`SELECT @@binlog_row_image = "MINIMAL"`)
{
-- echo ####### MINIMAL PARTICULAR SCENARIO ######
# ASSERTIONS:
# INSERT/MINIMAL
# 1. columns that are set to default value are in AI
#
# UPDATE/MINIMAL:
# 2. columns that are set to the same value are in AI
# 3. columns that are not in WHERE clause but in PKE are in BI
# 4. on slave, columns that are not in master's BI but are in slave's
# PKE are in slave's BI
#
# DELETE/MINIMAL:
# 5. on slave, columns that are in master's BI but not in slave's PKE are
# not in slave's BI
# 6. columns that are NOT NULL UK but not in PK are not in BI
#
-- connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 INT PRIMARY KEY, c2 INT DEFAULT 100, c3 INT);
SET SQL_LOG_BIN=1;
-- connection slave
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 INT NOT NULL UNIQUE KEY, c2 INT DEFAULT 100, c3 INT, c4 INT, PRIMARY KEY(c2,c3));
-- let $row_img_query= INSERT INTO t VALUES (1, 100, 1);
# 1. columns that are set to default value are in AI
-- let $row_img_expected_master= | 1:1 2:100 3:1
-- let $row_img_expected_slave = | 1:1 2:100 3:1
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c2=100, c3=1000 WHERE c2=100;
# 2. columns that are set to the same value are in AI
# 3. columns that are not in WHERE clause but in PKE are in BI
# 4. on slave, columns that are not in master's BI but are in slave's PKE are in slave's BI
-- let $row_img_expected_master= 1:1 | 2:100 3:1000
-- let $row_img_expected_slave = 2:100 3:1 | 2:100 3:1000
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t WHERE c1=1
# asserts:
# 5. on slave, columns that are not in master's BI but are in slave's PKE are in slave's BI
# 6. columns that are NOT NULL UK but not in PK are not in BI
-- let $row_img_expected_master= 1:1 |
-- let $row_img_expected_slave= 2:100 3:1000 |
-- source include/rpl_row_img_parts_master_slave.inc
-- connection master
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ####### MINIMAL OTHER PARTICULAR SCENARIO ######
# ASSERTIONS:
# UPDATE/MINIMAL:
# 1. all columns needed to identify a row are in BI; as the
# index is not unique, this means all columns of the table
# 2. columns that are in SET changed are in AI
# 3. columns that are not in SET are not in AI
# 4. table on slave has the same definition as table on
# master, so points 1-2-3 apply to images in the slave's
# binlog too.
#
-- connection master
CREATE TABLE t (c1 INT NOT NULL, c2 INT NOT NULL, KEY (c1));
INSERT INTO t VALUES (30,40);
-- connection slave
-- let $row_img_query= UPDATE t SET c2=100 ORDER BY c1;
# 1. all columns needed to identify a row are in BI
# 2. columns that are in SET changed are in AI
# 3. columns that are not in SET are not in AI
# 4. slave is as master as tables' definitions are identical
-- let $row_img_expected_master= 1:30 2:40 | 2:100
-- let $row_img_expected_slave = 1:30 2:40 | 2:100
-- source include/rpl_row_img_parts_master_slave.inc
-- connection master
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
}
if (`SELECT @@binlog_row_image = "NOBLOB"`)
{
-- echo ####### NOBLOB PARTICULAR SCENARIO ######
# ASSERTIONS:
# INSERT/NOBLOB:
# 1 non-blob columns that are set to default value are in AI
#
# UPDATE/NOBLOB:
# 2 non-blob columns that are set to default value are in AI
# 3 blob columns that are set to default value are in AI
# 4 blob columns that are in WHERE clause but not in PKE are not in BI
# 5 blob columns that are in NON-NULL UK but not in PK are not in BI
# 6 on slave, blob columns that are in master's BI clause but not in
# slave's PKE are not in BI
#
# DELETE
# 7 non-blob columns that are not in WHERE clause but in PKE are in BI
# 8 blob columns that are used in WHERE clause but not in PKE are not
# in BI
# 9 blob columns that are NOT NULL UK but not in PK are not in BI
# 10 on slave, blob columns that are in master's BI but not in slave's PKE
# are not in slave's BI
-- connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 INT, c2 BLOB, c3 INT DEFAULT 1000, c4 BLOB NOT NULL, c5 INT, UNIQUE KEY(c4(512)), PRIMARY KEy(c1, c2(512)));
SET SQL_LOG_BIN=1;
-- connection slave
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 INT PRIMARY KEY, c2 BLOB, c3 INT DEFAULT 1000, c4 BLOB, c5 INT);
SET SQL_LOG_BIN=1;
-- connection master
-- let $row_img_query= INSERT INTO t VALUES (1,'aaa', 1000, 'bbb', 1)
# 1. non-blob columns that are set to default value are in AI
-- let $row_img_expected_master= | 1:1 2:'aaa' 3:1000 4:'bbb' 5:1
-- let $row_img_expected_slave = | 1:1 2:'aaa' 3:1000 4:'bbb' 5:1
-- source include/rpl_row_img_parts_master_slave.inc
-- connection master
-- let $row_img_query= UPDATE t SET c2='aaa', c3=1000, c5=10000 WHERE c1=1 AND c4='bbb'
# asserts that:
# 2. non-blob columns that are set to default value are in AI
# 3. blob columns that are set to default value are in AI
# 4. blob columns that are in WHERE clause but not in PKE are not in BI
# 5. blob columns that are in NON-NULL UK but not in PK are not in BI
# 6. on slave, blob columns that are in master's BI clause but not in
# slave's PKE are not in BI
-- let $row_img_expected_master= 1:1 2:'aaa' 3:1000 5:1 | 1:1 2:'aaa' 3:1000 5:10000
-- let $row_img_expected_slave = 1:1 3:1000 5:1 | 1:1 2:'aaa' 3:1000 5:10000
-- source include/rpl_row_img_parts_master_slave.inc
-- connection master
-- let $row_img_query= DELETE FROM t WHERE c1=1 AND c4='bbb'
# asserts that:
# 7. non-blob columns that are not in WHERE clause but in PKE are in BI
# 8. blob columns that are used in WHERE clause but not in PKE are not n BI
# 9. blob columns that are NOT NULL UK but not in PK are not in BI
# 10. on slave, blob columns that are in master's BI but not in slave's PKE are not in slave's BI
-- let $row_img_expected_master= 1:1 2:'aaa' 3:1000 5:10000 |
-- let $row_img_expected_slave = 1:1 3:1000 5:10000 |
-- source include/rpl_row_img_parts_master_slave.inc
-- connection master
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
}
-- disable_query_log
-- connection master
-- eval SET @img_types= LTRIM(SUBSTRING(@img_types, LENGTH('$img_type') + 1))
-- enable_query_log
}
-- echo ################## SPECIAL CASES #########################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:NOBLOB:N,slave:NOBLOB:Y
-- source include/rpl_row_img_set.inc
-- echo ###################################
-- echo # PK (contains blob)
-- echo ###################################
-- connection master
CREATE TABLE t (c1 int, c2 int, c3 blob, primary key(c1,c3(512)));
-- let $row_img_query= INSERT INTO t VALUES (1,2,"a")
-- let $row_img_expected_master= | 1:1 2:2 3:'a'
-- let $row_img_expected_slave = | 1:1 2:2 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1,c3) VALUES (10,"a")
-- let $row_img_expected_master= | 1:10 2:NULL 3:'a'
-- let $row_img_expected_slave = | 1:10 2:NULL 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1) VALUES (1000)
-- let $row_img_expected_master= | 1:1000 2:NULL
-- let $row_img_expected_slave = | 1:1000 2:NULL
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c1=2 WHERE c1=1
-- let $row_img_expected_master= 1:1 2:2 3:'a' | 1:2 2:2
-- let $row_img_expected_slave = 1:1 2:2 3:'a' | 1:2 2:2
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t WHERE c2=2
-- let $row_img_expected_master= 1:2 2:2 3:'a' |
-- let $row_img_expected_slave = 1:2 2:2 3:'a' |
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ###################################
-- echo # PK (does not contain blob, but blob is updated)
-- echo ###################################
-- source include/rpl_reset.inc
-- connection master
CREATE TABLE t (c1 int, c2 int, c3 blob, primary key(c1,c2));
-- let $row_img_query= INSERT INTO t VALUES (1,2,"a")
-- let $row_img_expected_master= | 1:1 2:2 3:'a'
-- let $row_img_expected_slave = | 1:1 2:2 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1,c3) VALUES (10,"a")
-- let $row_img_expected_master= | 1:10 2:0 3:'a'
-- let $row_img_expected_slave = | 1:10 2:0 3:'a'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1) VALUES (1000)
-- let $row_img_expected_master= | 1:1000 2:0
-- let $row_img_expected_slave = | 1:1000 2:0
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c3='b' WHERE c1=1
-- let $row_img_expected_master= 1:1 2:2 | 1:1 2:2 3:'b'
-- let $row_img_expected_slave = 1:1 2:2 | 1:1 2:2 3:'b'
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t WHERE c2=2
-- let $row_img_expected_master= 1:1 2:2 |
-- let $row_img_expected_slave = 1:1 2:2 |
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ###################################
-- echo # AUTOINC columns
-- echo ###################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:MINIMAL:N,slave:MINIMAL:Y
-- source include/rpl_row_img_set.inc
CREATE TABLE t (c1 int NOT NULL AUTO_INCREMENT, c2 int, c3 blob, primary key(c1,c2));
-- let $row_img_query= INSERT INTO t(c2) VALUES (2)
-- let $row_img_expected_master= | 1:1 2:2
-- let $row_img_expected_slave = | 1:1 2:2
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ##################################################################
-- echo # Test that slave does not write more columns than the ones it has
-- echo ##################################################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:MINIMAL:N,slave:MINIMAL:Y
-- source include/rpl_row_img_set.inc
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 int NOT NULL AUTO_INCREMENT, c2 int, c3 blob, primary key(c1,c2));
SET SQL_LOG_BIN=1;
-- connection slave
CREATE TABLE t (c1 int, c2 int, primary key(c1));
-- connection master
-- let $row_img_query= INSERT INTO t(c2,c3) VALUES (2,'aaaaa')
-- let $row_img_expected_master= | 1:1 2:2 3:'aaaaa'
-- let $row_img_expected_slave = | 1:1 2:2
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c2=3, c3='bbbbb' WHERE c2=2
-- let $row_img_expected_master= 1:1 2:2 | 2:3 3:'bbbbb'
-- let $row_img_expected_slave = 1:1 | 2:3
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ##################################################################
-- echo # Test that slave fills default columns in its own columns
-- echo ##################################################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:FULL:N,slave:FULL:Y
-- source include/rpl_row_img_set.inc
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 int, c2 int);
SET SQL_LOG_BIN=1;
-- connection slave
CREATE TABLE t (c1 int, c2 int, c3 int DEFAULT 2005);
-- connection master
-- let $row_img_query= INSERT INTO t(c1) VALUES (1)
-- let $row_img_expected_master= | 1:1 2:NULL
-- let $row_img_expected_slave = | 1:1 2:NULL 3:2005
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= INSERT INTO t(c1) VALUES (2)
-- let $row_img_expected_master= | 1:2 2:NULL
-- let $row_img_expected_slave = | 1:2 2:NULL 3:2005
-- source include/rpl_row_img_parts_master_slave.inc
-- connection slave
SELECT * FROM t;
-- connection master
SELECT * FROM t;
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ##################################################################
-- echo # Test that slave uses partial BI when master contains more columns
-- echo ##################################################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:MINIMAL:N,slave:MINIMAL:Y
-- source include/rpl_row_img_set.inc
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 int, primary key(c1, c3), unique key(c1));
SET SQL_LOG_BIN=1;
-- connection slave
CREATE TABLE t (c1 int NOT NULL, c2 int, unique key(c1));
-- connection master
-- let $row_img_query= INSERT INTO t VALUES (1, 2, 3)
-- let $row_img_expected_master= | 1:1 2:2 3:3
-- let $row_img_expected_slave = | 1:1 2:2
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c2= 4 WHERE c1=1
-- let $row_img_expected_master= 1:1 3:3 | 2:4
-- let $row_img_expected_slave = 1:1 | 2:4
-- source include/rpl_row_img_parts_master_slave.inc
-- connection slave
SELECT * FROM t;
-- connection master
SELECT * FROM t;
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ##################################################################
-- echo # Test that if master has binlog_row_image=MINIMAL and slave has
-- echo # NOBLOB or FULL, it will log the expected columns
-- echo ##################################################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:MINIMAL:N,slave:FULL:Y
-- source include/rpl_row_img_set.inc
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 int, primary key(c1));
SET SQL_LOG_BIN=1;
-- connection slave
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 int, c4 blob, unique key(c1));
-- connection master
-- let $row_img_query= INSERT INTO t VALUES (1, 2, 3)
-- let $row_img_expected_master= | 1:1 2:2 3:3
-- let $row_img_expected_slave = | 1:1 2:2 3:3 4:NULL
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c2= 4 WHERE c1=1
-- let $row_img_expected_master= 1:1 | 2:4
-- let $row_img_expected_slave = 1:1 2:2 3:3 4:NULL | 1:1 2:4 3:3 4:NULL
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t WHERE c2=4
-- let $row_img_expected_master= 1:1 |
-- let $row_img_expected_slave = 1:1 2:4 3:3 4:NULL |
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:MINIMAL:N,slave:NOBLOB:Y
-- source include/rpl_row_img_set.inc
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 int, primary key(c1));
SET SQL_LOG_BIN=1;
-- connection slave
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 int, c4 blob, unique key(c1));
-- connection master
-- let $row_img_query= INSERT INTO t VALUES (1, 2, 3)
-- let $row_img_expected_master= | 1:1 2:2 3:3
-- let $row_img_expected_slave = | 1:1 2:2 3:3
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= UPDATE t SET c2= 4 WHERE c1=1
-- let $row_img_expected_master= 1:1 | 2:4
-- let $row_img_expected_slave = 1:1 2:2 3:3 | 1:1 2:4 3:3
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_query= DELETE FROM t WHERE c2=4
-- let $row_img_expected_master= 1:1 |
-- let $row_img_expected_slave = 1:1 2:4 3:3 |
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t;
--source include/sync_slave_sql_with_master.inc
-- echo ################################################################
-- echo # Test that the slave stop with error if no usable data is on BI
-- echo ################################################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:MINIMAL:N,slave:NOBLOB:Y
-- source include/rpl_row_img_set.inc
SET SQL_LOG_BIN=0;
CREATE TABLE t (c1 int NOT NULL, c2 int, c3 int, primary key(c3));
SET SQL_LOG_BIN=1;
-- connection slave
CREATE TABLE t (c1 int NOT NULL, c2 int, primary key(c1));
-- connection master
INSERT INTO t VALUES (1,2,3);
UPDATE t SET c2=4 WHERE c2=2;
DROP TABLE t;
-- connection slave
# 1032==ER_KEY_NOT_FOUND (handler returns HA_ERR_END_OF_FILE)
let $slave_sql_errno= 1032;
source include/wait_for_slave_sql_error.inc;
DROP TABLE t;
--let $rpl_only_running_threads= 1
# ==== Purpose ====
#
# Check that when binlog_row_image= FULL 'UPDATE' query should not using
# temporary if the PRIMARY KEY not being modified as part of the query.
#
# ==== Implementation ====
#
# Set binlog_row_image= FULL. Create a table which has both a primary key and
# a regular int field which is not a key. Execute an UPDATE statement in such
# a way that it doesn't update the primary key field. See the 'EXPLAIN' output
# it should not use a temporary table. Repeat the same test in case of
# binlog_row_image= NOBLOB as well. No temporary table should be used in this
# case as well.
#
# ==== References ====
#
# Bug#22510353: UNNECESSARY USING TEMPORARY FOR UPDATE
#
###############################################################################
-- source include/rpl_reset.inc
-- connection master
-- let $row_img_set=master:FULL:N,slave:FULL:Y
-- source include/rpl_row_img_set.inc
CREATE TABLE t1(id INT PRIMARY KEY, a INT) ENGINE = INNODB;
--source include/sync_slave_sql_with_master.inc
-- connection master
-- let $row_img_query= INSERT INTO t1 (id, a) VALUES (1, 1)
-- let $row_img_expected_master= | 1:1 2:1
-- let $row_img_expected_slave = | 1:1 2:1
-- source include/rpl_row_img_parts_master_slave.inc
-- echo "Case: FULL - EXPLAIN output should not display Using temporary"
EXPLAIN UPDATE t1 SET a=a+1 WHERE id < 2;
-- let $row_img_query= UPDATE t1 SET a=a+1 WHERE id < 2
-- let $row_img_expected_master= 1:1 2:1 | 1:1 2:2
-- let $row_img_expected_slave = 1:1 2:1 | 1:1 2:2
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_set=master:NOBLOB:N,slave:NOBLOB:Y
-- source include/rpl_row_img_set.inc
-- echo "Case: NOBLOB - EXPLAIN output should not display Using temporary"
EXPLAIN UPDATE t1 SET a=a+1 WHERE id < 2;
-- let $row_img_query= UPDATE t1 SET a=a+1 WHERE id < 2
-- let $row_img_expected_master= 1:1 2:2 | 1:1 2:3
-- let $row_img_expected_slave = 1:1 2:2 | 1:1 2:3
-- source include/rpl_row_img_parts_master_slave.inc
-- let $row_img_set=master:MINIMAL:N,slave:MINIMAL:Y
-- source include/rpl_row_img_set.inc
EXPLAIN UPDATE t1 SET a=a+1 WHERE id < 2;
-- let $row_img_query= UPDATE t1 SET a=a+1 WHERE id < 2
-- let $row_img_expected_master= 1:1 | 2:4
-- let $row_img_expected_slave = 1:1 | 2:4
-- source include/rpl_row_img_parts_master_slave.inc
DROP TABLE t1;
--source include/sync_slave_sql_with_master.inc
## CLEAN UP
-- connection master
SET GLOBAL binlog_row_image= @old_binlog_row_image;
SET SESSION binlog_row_image= @old_binlog_row_image;
-- connection slave
SET GLOBAL binlog_row_image= @old_binlog_row_image;
SET SESSION binlog_row_image= @old_binlog_row_image;
--source include/rpl_end.inc