Commit e41eb044 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.2 into 10.3

parents 947b0b57 7aac8358
...@@ -32,8 +32,8 @@ if (IS_WINDOWS){ ...@@ -32,8 +32,8 @@ if (IS_WINDOWS){
my $list= `handle.exe -? -accepteula 2>&1`; my $list= `handle.exe -? -accepteula 2>&1`;
foreach my $line (split('\n', $list)) foreach my $line (split('\n', $list))
{ {
$handle_exe= "$1.$2" $handle_exe= "$2.$3"
if ($line =~ /Handle v([0-9]*)\.([0-9]*)/); if ($line =~ /(Nth|H)andle v([0-9]*)\.([0-9]*)/);
} }
if ($handle_exe){ if ($handle_exe){
print "Found handle.exe version $handle_exe\n"; print "Found handle.exe version $handle_exe\n";
......
CREATE TABLE t1 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB;
INSERT INTO t1 VALUES(0, "0");
INSERT INTO t1 VALUES(1, "1");
INSERT INTO t1 VALUES(2, "2");
INSERT INTO t1 VALUES(3, "3");
CREATE TABLE t2 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB;
INSERT INTO t2 VALUES(0, "a");
INSERT INTO t2 VALUES(1, "b");
INSERT INTO t2 VALUES(2, "c");
INSERT INTO t2 VALUES(3, "d");
connect con1,localhost,root,,;
connect con2,localhost,root,,;
connection con1;
'T1'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t2;
c1 c2
0 a
1 b
2 c
3 d
connection default;
'T2'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t1;
c1 c2
0 0
1 1
2 2
3 3
connection con2;
'T3'
SET AUTOCOMMIT=0;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM t1;
c1 c2
0 0
1 1
2 2
3 3
SELECT * FROM t2;
c1 c2
0 a
1 b
2 c
3 d
connection con1;
'T1'
UPDATE t2 SET c1 = c1 + 100;
SELECT * FROM t2;
c1 c2
100 a
101 b
102 c
103 d
COMMIT;
connection default;
'T2'
UPDATE t1 SET c1 = c1 + 100;
SELECT * FROM t1;
c1 c2
100 0
101 1
102 2
103 3
COMMIT;
connection con2;
'T3'
SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1';
SELECT * FROM t1;;
connection default;
'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
'Signalled T3'
connection con2;
'T3'
c1 c2
0 0
1 1
2 2
3 3
connection con2;
'T3'
SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1';
SELECT * FROM t2;;
connection default;
'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
'Signalled T3'
connection con2;
'T3'
c1 c2
0 a
1 b
2 c
3 d
connection default;
disconnect con1;
disconnect con2;
connect con1,localhost,root,,;
connect con2,localhost,root,,;
connection con1;
'T1'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t1;
c1 c2
100 0
101 1
102 2
103 3
connection default;
'T2'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t2;
c1 c2
100 a
101 b
102 c
103 d
UPDATE t2 SET c1 = c1 + 100;
SELECT * FROM t2;
c1 c2
200 a
201 b
202 c
203 d
COMMIT;
connection con2;
'T3'
SET AUTOCOMMIT=0;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM t1;
c1 c2
100 0
101 1
102 2
103 3
SELECT * FROM t2;
c1 c2
200 a
201 b
202 c
203 d
connection con1;
'T1'
UPDATE t1 SET c1 = c1 + 100;
SELECT * FROM t1;
c1 c2
200 0
201 1
202 2
203 3
COMMIT;
connection con2;
'T3'
SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1';
SELECT * FROM t1;;
connection con1;
'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
'Signalled T3'
connection con2;
'T3'
c1 c2
100 0
101 1
102 2
103 3
connection con2;
'T3'
SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1';
SELECT * FROM t2;;
connection default;
'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
'Signalled T3'
connection con2;
'T3'
c1 c2
200 a
201 b
202 c
203 d
connection default;
disconnect con1;
disconnect con2;
DROP TABLE t1;
DROP TABLE t2;
#
# Bug 21433768: NON-REPEATABLE READ WITH REPEATABLE READ ISOLATION
#
connect con1,localhost,root,,;
# connection con1
CREATE TABLE t1(col1 INT PRIMARY KEY, col2 INT) ENGINE = InnoDB;
INSERT INTO t1 values (1, 0), (2, 0);
SELECT * FROM t1 ORDER BY col1;
col1 col2
1 0
2 0
START TRANSACTION;
UPDATE t1 SET col2 = 100;
SET DEBUG_SYNC = 'after_trx_committed_in_memory SIGNAL s1 WAIT_FOR s2';
COMMIT;;
connection default;
# connection default
SET DEBUG_SYNC = 'now WAIT_FOR s1';
UPDATE t1 SET col2 = col2 + 10 where col1 = 1;
COMMIT;
SELECT * FROM t1 ORDER BY col1;
col1 col2
1 110
2 100
SET DEBUG_SYNC = 'now SIGNAL s2';
connection con1;
# connection con1
# reap COMMIT for con1
connection default;
# connection default
disconnect con1;
DROP TABLE t1;
SET DEBUG_SYNC= 'RESET';
# DEBUG_SYNC must be compiled in.
--source include/have_debug_sync.inc
# We need to test the use case:
# a. Create a transaction T1 that will be promoted to RW.
# b. Create a transaction T2 that will be promoted to RW.
# a. Create a RO transaction T3
# d. T3 does a select - creates a read view that doesn't include T1 and T2
# e. T1 & T2 do some updates - this promotes T1 & T2 to RW transactions
# f. T1 & T2 Commit
# g. T3 Does a select - it should not see the changes of T1 & T2
--source include/have_innodb.inc
--source include/count_sessions.inc
CREATE TABLE t1 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB;
INSERT INTO t1 VALUES(0, "0");
INSERT INTO t1 VALUES(1, "1");
INSERT INTO t1 VALUES(2, "2");
INSERT INTO t1 VALUES(3, "3");
CREATE TABLE t2 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB;
INSERT INTO t2 VALUES(0, "a");
INSERT INTO t2 VALUES(1, "b");
INSERT INTO t2 VALUES(2, "c");
INSERT INTO t2 VALUES(3, "d");
--connect (con1,localhost,root,,)
--connect (con2,localhost,root,,)
connection con1;
--echo 'T1'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t2;
connection default;
--echo 'T2'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t1;
connection con2;
--echo 'T3'
SET AUTOCOMMIT=0;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM t1;
SELECT * FROM t2;
connection con1;
--echo 'T1'
UPDATE t2 SET c1 = c1 + 100;
SELECT * FROM t2;
COMMIT;
connection default;
--echo 'T2'
UPDATE t1 SET c1 = c1 + 100;
SELECT * FROM t1;
COMMIT;
connection con2;
--echo 'T3'
SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1';
--send SELECT * FROM t1;
connection default;
--echo 'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
--echo 'Signalled T3'
connection con2;
--echo 'T3'
reap;
connection con2;
--echo 'T3'
SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1';
--send SELECT * FROM t2;
connection default;
--echo 'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
--echo 'Signalled T3'
connection con2;
--echo 'T3'
reap;
connection default;
disconnect con1;
disconnect con2;
# We need to test the use case:
# a. Create a transaction T1 that will be promoted to RW.
# b. Create a transaction T2 that will be promoted to RW.
# c. T2 does some updates - this promotes T2 to RW transactions
# d. T2 Commits
# e. Create a RO transaction T3
# f. T3 does a select - creates a read view that doesn't include T1
# g. T1 does some updates - this promotes T1 to RW transactions
# h. T1 Commits
# i. T3 Does a select - it should not see the changes made by T1 but should
# see the changes by T2
--connect (con1,localhost,root,,)
--connect (con2,localhost,root,,)
connection con1;
--echo 'T1'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t1;
connection default;
--echo 'T2'
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM t2;
UPDATE t2 SET c1 = c1 + 100;
SELECT * FROM t2;
COMMIT;
connection con2;
--echo 'T3'
SET AUTOCOMMIT=0;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM t1;
SELECT * FROM t2;
connection con1;
--echo 'T1'
UPDATE t1 SET c1 = c1 + 100;
SELECT * FROM t1;
COMMIT;
connection con2;
--echo 'T3'
SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1';
--send SELECT * FROM t1;
connection con1;
--echo 'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
--echo 'Signalled T3'
connection con2;
--echo 'T3'
reap;
connection con2;
--echo 'T3'
SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1';
--send SELECT * FROM t2;
connection default;
--echo 'T2'
SET DEBUG_SYNC='now SIGNAL waiting1';
--echo 'Signalled T3'
connection con2;
--echo 'T3'
reap;
connection default;
disconnect con1;
disconnect con2;
DROP TABLE t1;
DROP TABLE t2;
--echo #
--echo # Bug 21433768: NON-REPEATABLE READ WITH REPEATABLE READ ISOLATION
--echo #
--connect (con1,localhost,root,,)
--echo # connection con1
CREATE TABLE t1(col1 INT PRIMARY KEY, col2 INT) ENGINE = InnoDB;
INSERT INTO t1 values (1, 0), (2, 0);
SELECT * FROM t1 ORDER BY col1;
START TRANSACTION;
UPDATE t1 SET col2 = 100;
SET DEBUG_SYNC = 'after_trx_committed_in_memory SIGNAL s1 WAIT_FOR s2';
--send COMMIT;
connection default;
--echo # connection default
SET DEBUG_SYNC = 'now WAIT_FOR s1';
UPDATE t1 SET col2 = col2 + 10 where col1 = 1;
COMMIT;
SELECT * FROM t1 ORDER BY col1;
SET DEBUG_SYNC = 'now SIGNAL s2';
connection con1;
--echo # connection con1
--echo # reap COMMIT for con1
reap;
connection default;
--echo # connection default
disconnect con1;
DROP TABLE t1;
# Clean up resources used in this test case.
--disable_warnings
SET DEBUG_SYNC= 'RESET';
--enable_warnings
--source include/wait_until_count_sessions.inc
##############################################################################
#
# List the test cases that are to be disabled temporarily.
#
# Separate the test case name and the comment with ':'.
#
# <testcasename> : BUG#<xxxx> <date disabled> <disabler> <comment>
#
# Do not use any TAB characters for whitespace.
#
##############################################################################
big_innodb_log : MDEV-20421 2019-08-26 wlad Always fails on Windows buildbot
\ No newline at end of file
...@@ -468,7 +468,7 @@ INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT), ...@@ -468,7 +468,7 @@ INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'double' to type 'char(5)'' Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'double' to type 'char(5 octets) character set latin1''
*** Drop t10 *** *** Drop t10 ***
connection master; connection master;
...@@ -510,7 +510,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT), ...@@ -510,7 +510,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'tinyblob' to type 'varchar(254)'' Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'blob' to type 'varchar(254 octets) character set latin1''
*** Drop t11 *** *** Drop t11 ***
connection master; connection master;
......
...@@ -468,7 +468,7 @@ INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT), ...@@ -468,7 +468,7 @@ INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'double' to type 'char(5)'' Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'double' to type 'char(5 octets) character set latin1''
*** Drop t10 *** *** Drop t10 ***
connection master; connection master;
...@@ -510,7 +510,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT), ...@@ -510,7 +510,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'tinyblob' to type 'varchar(254)'' Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'blob' to type 'varchar(254 octets) character set latin1''
*** Drop t11 *** *** Drop t11 ***
connection master; connection master;
......
...@@ -64,7 +64,7 @@ a b c ...@@ -64,7 +64,7 @@ a b c
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t2' cannot be converted from type 'char(10)' to type 'char(5)'' Last_SQL_Error = 'Column 2 of table 'test.t2' cannot be converted from type 'char(10 octets)' to type 'char(5 octets) character set latin1''
STOP SLAVE; STOP SLAVE;
RESET SLAVE; RESET SLAVE;
SELECT * FROM t2 ORDER BY a; SELECT * FROM t2 ORDER BY a;
...@@ -102,7 +102,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TEX'),(@b1,1,'JOE AUSTIN'),(@b1,4,'QA TEST ...@@ -102,7 +102,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TEX'),(@b1,1,'JOE AUSTIN'),(@b1,4,'QA TEST
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t3' cannot be converted from type 'tinyblob' to type 'int(11)'' Last_SQL_Error = 'Column 0 of table 'test.t3' cannot be converted from type 'blob' to type 'int(11)''
*** Drop t3 *** *** Drop t3 ***
connection master; connection master;
DROP TABLE t3; DROP TABLE t3;
...@@ -160,7 +160,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23,1,'b1b1',23.00098), ...@@ -160,7 +160,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23,1,'b1b1',23.00098),
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'varchar(6)' to type 'char(5)'' Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'varchar(6 octets)' to type 'char(5 octets) character set latin1''
*** Drop t5 *** *** Drop t5 ***
connection master; connection master;
DROP TABLE t5; DROP TABLE t5;
...@@ -188,7 +188,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23,1), ...@@ -188,7 +188,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23,1),
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'varchar(6)' to type 'char(5)'' Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'varchar(6 octets)' to type 'char(5 octets) character set latin1''
*** Drop t6 *** *** Drop t6 ***
include/rpl_reset.inc include/rpl_reset.inc
connection master; connection master;
...@@ -310,7 +310,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA'); ...@@ -310,7 +310,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA');
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'char(5)' to type 'double'' Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'char(5 octets)' to type 'double''
*** Drop t10 *** *** Drop t10 ***
connection master; connection master;
DROP TABLE t10; DROP TABLE t10;
...@@ -338,7 +338,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA'); ...@@ -338,7 +338,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA');
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'varchar(254)' to type 'int(11)'' Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'varchar(254 octets)' to type 'int(11)''
*** Drop t11 *** *** Drop t11 ***
connection master; connection master;
DROP TABLE t11; DROP TABLE t11;
......
...@@ -64,7 +64,7 @@ a b c ...@@ -64,7 +64,7 @@ a b c
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t2' cannot be converted from type 'char(10)' to type 'char(5)'' Last_SQL_Error = 'Column 2 of table 'test.t2' cannot be converted from type 'char(10 octets)' to type 'char(5 octets) character set latin1''
STOP SLAVE; STOP SLAVE;
RESET SLAVE; RESET SLAVE;
SELECT * FROM t2 ORDER BY a; SELECT * FROM t2 ORDER BY a;
...@@ -102,7 +102,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TEX'),(@b1,1,'JOE AUSTIN'),(@b1,4,'QA TEST ...@@ -102,7 +102,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TEX'),(@b1,1,'JOE AUSTIN'),(@b1,4,'QA TEST
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t3' cannot be converted from type 'tinyblob' to type 'int(11)'' Last_SQL_Error = 'Column 0 of table 'test.t3' cannot be converted from type 'blob' to type 'int(11)''
*** Drop t3 *** *** Drop t3 ***
connection master; connection master;
DROP TABLE t3; DROP TABLE t3;
...@@ -160,7 +160,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23,1,'b1b1',23.00098), ...@@ -160,7 +160,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23,1,'b1b1',23.00098),
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'varchar(6)' to type 'char(5)'' Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'varchar(6 octets)' to type 'char(5 octets) character set latin1''
*** Drop t5 *** *** Drop t5 ***
connection master; connection master;
DROP TABLE t5; DROP TABLE t5;
...@@ -188,7 +188,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23,1), ...@@ -188,7 +188,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23,1),
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'varchar(6)' to type 'char(5)'' Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'varchar(6 octets)' to type 'char(5 octets) character set latin1''
*** Drop t6 *** *** Drop t6 ***
include/rpl_reset.inc include/rpl_reset.inc
connection master; connection master;
...@@ -310,7 +310,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA'); ...@@ -310,7 +310,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA');
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'char(5)' to type 'double'' Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'char(5 octets)' to type 'double''
*** Drop t10 *** *** Drop t10 ***
connection master; connection master;
DROP TABLE t10; DROP TABLE t10;
...@@ -338,7 +338,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA'); ...@@ -338,7 +338,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA');
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'varchar(254)' to type 'int(11)'' Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'varchar(254 octets)' to type 'int(11)''
*** Drop t11 *** *** Drop t11 ***
connection master; connection master;
DROP TABLE t11; DROP TABLE t11;
......
...@@ -560,7 +560,7 @@ INSERT INTO t5 VALUES (1, "", 1); ...@@ -560,7 +560,7 @@ INSERT INTO t5 VALUES (1, "", 1);
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2); INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(255)' to type 'char(16)'' Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(765 octets)' to type 'char(48 octets) character set utf8''
include/rpl_reset.inc include/rpl_reset.inc
[expecting slave to stop] [expecting slave to stop]
connection master; connection master;
...@@ -568,7 +568,7 @@ INSERT INTO t6 VALUES (1, "", 1); ...@@ -568,7 +568,7 @@ INSERT INTO t6 VALUES (1, "", 1);
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2); INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(255)' to type 'char(128)'' Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(765 octets)' to type 'char(384 octets) character set utf8''
include/rpl_reset.inc include/rpl_reset.inc
[expecting slave to replicate correctly] [expecting slave to replicate correctly]
connection master; connection master;
......
...@@ -565,7 +565,7 @@ INSERT INTO t5 VALUES (1, "", 1); ...@@ -565,7 +565,7 @@ INSERT INTO t5 VALUES (1, "", 1);
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2); INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(255)' to type 'char(16)'' Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(765 octets)' to type 'char(48 octets) character set utf8''
include/rpl_reset.inc include/rpl_reset.inc
[expecting slave to stop] [expecting slave to stop]
connection master; connection master;
...@@ -573,7 +573,7 @@ INSERT INTO t6 VALUES (1, "", 1); ...@@ -573,7 +573,7 @@ INSERT INTO t6 VALUES (1, "", 1);
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2); INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(255)' to type 'char(128)'' Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(765 octets)' to type 'char(384 octets) character set utf8''
include/rpl_reset.inc include/rpl_reset.inc
[expecting slave to replicate correctly] [expecting slave to replicate correctly]
connection master; connection master;
......
...@@ -185,7 +185,7 @@ INSERT INTO t1 VALUES ('This is a test.'); ...@@ -185,7 +185,7 @@ INSERT INTO t1 VALUES ('This is a test.');
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'char(20)' to type 'char(10)'' Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'char(20 octets)' to type 'char(10 octets) character set latin1''
SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
COUNT(*) COUNT(*)
0 0
...@@ -264,7 +264,7 @@ INSERT INTO t1 VALUES ('This is a test.'); ...@@ -264,7 +264,7 @@ INSERT INTO t1 VALUES ('This is a test.');
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'varchar(2000)' to type 'varchar(100)'' Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'varchar(2000 octets)' to type 'varchar(100 octets) character set latin1''
SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
COUNT(*) COUNT(*)
0 0
...@@ -287,7 +287,7 @@ INSERT INTO t1 VALUES ('This is a test.'); ...@@ -287,7 +287,7 @@ INSERT INTO t1 VALUES ('This is a test.');
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'varchar(200)' to type 'varchar(10)'' Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'varchar(200 octets)' to type 'varchar(10 octets) character set latin1''
SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
COUNT(*) COUNT(*)
0 0
...@@ -310,7 +310,7 @@ INSERT INTO t1 VALUES ('This is a test.'); ...@@ -310,7 +310,7 @@ INSERT INTO t1 VALUES ('This is a test.');
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'varchar(2000)' to type 'varchar(1000)'' Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'varchar(2000 octets)' to type 'varchar(1000 octets) character set latin1''
SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
COUNT(*) COUNT(*)
0 0
...@@ -334,7 +334,7 @@ INSERT INTO t1 VALUES ('This is a test.'); ...@@ -334,7 +334,7 @@ INSERT INTO t1 VALUES ('This is a test.');
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'tinyblob' to type 'tinyblob'' Last_SQL_Error = 'Column 0 of table 'test.t1' cannot be converted from type 'longblob' to type 'tinyblob''
SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
COUNT(*) COUNT(*)
0 0
......
include/master-slave.inc
[connection master]
####################################################################
# Test Case1: Improved error message with charset information
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 VARCHAR(1) CHARACTER SET 'utf8mb3');
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 VARCHAR(1) CHARACTER SET 'utf8mb4');
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'varchar\(3 octets\)\' to type \'varchar\(4 octets\) character set utf8mb4\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case2: Improved error message with charset information for CHAR
# type
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET 'utf8mb3');
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET 'utf8mb4');
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'char\(3 octets\)\' to type \'char\(4 octets\) character set utf8mb4\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case3: For BLOB type fileds, when type conversion failed on
# slave, the errormessage had incorrect type names.
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 LONGBLOB);
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 TINYBLOB);
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'longblob\' to type \'tinyblob\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case4: Verifies varbinary to binary type conversion failure
# specific error message.
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 VARBINARY(10));
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 BINARY(10));
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'varbinary\(10\)\' to type \'binary\(10\)\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case5: Verifies binary to varbinary type conversion failure
# specific error message.
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 BINARY(10));
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 VARBINARY(10));
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'binary\(10\)\' to type \'varbinary\(10\)\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case6: Verifies binary to binary type conversion failure
# specific error message.
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 BINARY(1));
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 BINARY(10));
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'binary\(1\)\' to type \'binary\(10\)\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case7: Verifies char to blob type conversion failure
# specific error message. BLOB field on slave has no
# associated character set hence the master side field
# is also considered as binary.
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 CHAR(1));
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 BLOB);
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'binary\(1\)\' to type \'blob\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
####################################################################
# Test Case8: Verifies char to text type conversion failure
# specific error message.
####################################################################
connection master;
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 CHAR(1));
SET SQL_LOG_BIN=1;
connection slave;
CREATE TABLE t1 (c1 TEXT);
connection master;
INSERT INTO t1 VALUES ('a');
connection slave;
include/wait_for_slave_sql_error.inc [errno=1677]
FOUND 1 /\'char\(1 octets\)\' to type \'text\'/ in mysqld.2.err
connection master;
DROP TABLE t1;
connection slave;
DROP TABLE t1;
include/rpl_reset.inc
include/rpl_end.inc
# ==== Purpose ====
#
# Test verifies that when slave side type conversion fails in row based
# replication, more informative error message is displayed. It also verifies
# that in the case of blob fields appropriate type name is displayed in error
# message.
#
# ==== Implementation ====
#
# Steps:
# Test case1:
# 1. Create a table on master with VARCHAR filed and charset
# 'utf8mb3'.
# 2. Create a table on slave with VARCHAR field and charset
# 'utf8mb4'.
# 3. Insert a tuple on master.
# 4. Verify that slave provides more informative error message with
# respect to difference in charsets.
# Test case2: Repeat same steps as above for CHAR field
# Test case3:
# 1. Create a table on master with LONGBLOB field.
# 2. Create a table on slave with TINYBLOB field.
# 3. Insert a tuple on master.
# 4. Verify that error message displayed on slave clearly states type
# conversion failure from 'longblob' to 'tinyblob'.
# 5. Also verify that error message doesn't show additional details
# of charset when not required.
# Test Case4: Verifies varbinary to binary type conversion failure specific
# error message.
# Test Case5: Verifies binary to varbinary type conversion failure specific
# error message.
# Test Case6: Verifies binary to binary type conversion failure specific
# error message.
# Test Case7: Verifies char to blob type conversion failure specific
# error message.
# Test Case8: Verifies char to text type conversion failure specific
# error message.
# ==== References ====
#
# MDEV-19925: Column ... cannot be converted from type 'varchar(20)' to type
# 'varchar(20)'
#
--source include/have_binlog_format_row.inc
# Inorder to grep a specific error pattern in error log a fresh error log
# needs to be generated.
--source include/force_restart.inc
--source include/master-slave.inc
--echo ####################################################################
--echo # Test Case1: Improved error message with charset information
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 VARCHAR(1) CHARACTER SET 'utf8mb3');
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 VARCHAR(1) CHARACTER SET 'utf8mb4');
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Check error log for correct messages.
let $log_error_= `SELECT @@GLOBAL.log_error`;
if(!$log_error_)
{
# MySQL Server on windows is started with --console and thus
# does not know the location of its .err log, use default location
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
}
# Error msg before: Column 0 of table 'test.t1' cannot be converted from type 'varchar(3)' to type 'varchar(1)'
# Error msg after : Column 0 of table 'test.t1' cannot be converted from type 'varchar(3 octets)' to type 'varchar(4 octets) character set utf8mb4'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'varchar\(3 octets\)\' to type \'varchar\(4 octets\) character set utf8mb4\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case2: Improved error message with charset information for CHAR
--echo # type
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET 'utf8mb3');
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET 'utf8mb4');
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Error msg before: Column 0 of table 'test.t1' cannot be converted from type 'char(0)' to type 'char(1)'
# Error msg after : Column 0 of table 'test.t1' cannot be converted from type 'char(3 octets)' to type 'char(4 octets) character set utf8mb4)'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'char\(3 octets\)\' to type \'char\(4 octets\) character set utf8mb4\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case3: For BLOB type fileds, when type conversion failed on
--echo # slave, the errormessage had incorrect type names.
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 LONGBLOB);
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 TINYBLOB);
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Error msg before: Column 0 of table 'test.t1' cannot be converted from type 'tinyblob' to type 'tinyblob'
# Error msg after : Column 0 of table 'test.t1' cannot be converted from type 'longblob' to type 'tinyblob'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'longblob\' to type \'tinyblob\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case4: Verifies varbinary to binary type conversion failure
--echo # specific error message.
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 VARBINARY(10));
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 BINARY(10));
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Check error log for correct messages.
let $log_error_= `SELECT @@GLOBAL.log_error`;
if(!$log_error_)
{
# MySQL Server on windows is started with --console and thus
# does not know the location of its .err log, use default location
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
}
# Expected Error : Column 0 of table 'test.t1' cannot be converted from type 'varbinary(10)' to type 'binary(10)'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'varbinary\(10\)\' to type \'binary\(10\)\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case5: Verifies binary to varbinary type conversion failure
--echo # specific error message.
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 BINARY(10));
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 VARBINARY(10));
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Check error log for correct messages.
let $log_error_= `SELECT @@GLOBAL.log_error`;
if(!$log_error_)
{
# MySQL Server on windows is started with --console and thus
# does not know the location of its .err log, use default location
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
}
# Expected Error : Column 0 of table 'test.t1' cannot be converted from type 'binary(10)' to type 'varbinary(10)'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'binary\(10\)\' to type \'varbinary\(10\)\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case6: Verifies binary to binary type conversion failure
--echo # specific error message.
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 BINARY(1));
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 BINARY(10));
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Check error log for correct messages.
let $log_error_= `SELECT @@GLOBAL.log_error`;
if(!$log_error_)
{
# MySQL Server on windows is started with --console and thus
# does not know the location of its .err log, use default location
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
}
# Expected Error : Column 0 of table 'test.t1' cannot be converted from type 'binary(1)' to type 'binary(10)'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'binary\(1\)\' to type \'binary\(10\)\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case7: Verifies char to blob type conversion failure
--echo # specific error message. BLOB field on slave has no
--echo # associated character set hence the master side field
--echo # is also considered as binary.
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 CHAR(1));
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 BLOB);
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Check error log for correct messages.
let $log_error_= `SELECT @@GLOBAL.log_error`;
if(!$log_error_)
{
# MySQL Server on windows is started with --console and thus
# does not know the location of its .err log, use default location
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
}
# Expected Error : Column 0 of table 'test.t1' cannot be converted from type 'binary(1)' to type 'binary(10)'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'binary\(1\)\' to type \'blob\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--echo ####################################################################
--echo # Test Case8: Verifies char to text type conversion failure
--echo # specific error message.
--echo ####################################################################
--connection master
SET SQL_LOG_BIN=0;
CREATE TABLE t1 (c1 CHAR(1));
SET SQL_LOG_BIN=1;
--connection slave
CREATE TABLE t1 (c1 TEXT);
--connection master
INSERT INTO t1 VALUES ('a');
--connection slave
--let $slave_sql_errno= 1677
--source include/wait_for_slave_sql_error.inc
# Check error log for correct messages.
let $log_error_= `SELECT @@GLOBAL.log_error`;
if(!$log_error_)
{
# MySQL Server on windows is started with --console and thus
# does not know the location of its .err log, use default location
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err;
}
# Expected Error : Column 0 of table 'test.t1' cannot be converted from type 'binary(1)' to type 'binary(10)'
--let SEARCH_FILE=$log_error_
--let SEARCH_PATTERN=\'char\(1 octets\)\' to type \'text\'
--source include/search_pattern_in_file.inc
--connection master
DROP TABLE t1;
--connection slave
DROP TABLE t1;
--let $rpl_only_running_threads= 1
--source include/rpl_reset.inc
--source include/rpl_end.inc
...@@ -7310,6 +7310,28 @@ void Field_string::sql_type(String &res) const ...@@ -7310,6 +7310,28 @@ void Field_string::sql_type(String &res) const
res.append(STRING_WITH_LEN(" binary")); res.append(STRING_WITH_LEN(" binary"));
} }
/**
For fields which are associated with character sets their length is provided
in octets and their character set information is also provided as part of
type information.
@param res String which contains filed type and length.
*/
void Field_string::sql_rpl_type(String *res) const
{
CHARSET_INFO *cs=charset();
if (Field_string::has_charset())
{
size_t length= cs->cset->snprintf(cs, (char*) res->ptr(),
res->alloced_length(),
"char(%u octets) character set %s",
field_length,
charset()->csname);
res->length(length);
}
else
Field_string::sql_type(*res);
}
uchar *Field_string::pack(uchar *to, const uchar *from, uint max_length) uchar *Field_string::pack(uchar *to, const uchar *from, uint max_length)
{ {
...@@ -7730,6 +7752,29 @@ void Field_varstring::sql_type(String &res) const ...@@ -7730,6 +7752,29 @@ void Field_varstring::sql_type(String &res) const
res.append(STRING_WITH_LEN(" binary")); res.append(STRING_WITH_LEN(" binary"));
} }
/**
For fields which are associated with character sets their length is provided
in octets and their character set information is also provided as part of
type information.
@param res String which contains filed type and length.
*/
void Field_varstring::sql_rpl_type(String *res) const
{
CHARSET_INFO *cs=charset();
if (Field_varstring::has_charset())
{
size_t length= cs->cset->snprintf(cs, (char*) res->ptr(),
res->alloced_length(),
"varchar(%u octets) character set %s",
field_length,
charset()->csname);
res->length(length);
}
else
Field_varstring::sql_type(*res);
}
uint32 Field_varstring::data_length() uint32 Field_varstring::data_length()
{ {
......
...@@ -1140,6 +1140,7 @@ class Field: public Value_source ...@@ -1140,6 +1140,7 @@ class Field: public Value_source
in str and restore it with set() if needed in str and restore it with set() if needed
*/ */
virtual void sql_type(String &str) const =0; virtual void sql_type(String &str) const =0;
virtual void sql_rpl_type(String *str) const { sql_type(*str); }
virtual uint size_of() const =0; // For new field virtual uint size_of() const =0; // For new field
inline bool is_null(my_ptrdiff_t row_offset= 0) const inline bool is_null(my_ptrdiff_t row_offset= 0) const
{ {
...@@ -3362,6 +3363,7 @@ class Field_string :public Field_longstr { ...@@ -3362,6 +3363,7 @@ class Field_string :public Field_longstr {
int cmp(const uchar *,const uchar *); int cmp(const uchar *,const uchar *);
void sort_string(uchar *buff,uint length); void sort_string(uchar *buff,uint length);
void sql_type(String &str) const; void sql_type(String &str) const;
void sql_rpl_type(String*) const;
virtual uchar *pack(uchar *to, const uchar *from, virtual uchar *pack(uchar *to, const uchar *from,
uint max_length); uint max_length);
virtual const uchar *unpack(uchar* to, const uchar *from, virtual const uchar *unpack(uchar* to, const uchar *from,
...@@ -3472,6 +3474,7 @@ class Field_varstring :public Field_longstr { ...@@ -3472,6 +3474,7 @@ class Field_varstring :public Field_longstr {
uint get_key_image(uchar *buff,uint length, imagetype type); uint get_key_image(uchar *buff,uint length, imagetype type);
void set_key_image(const uchar *buff,uint length); void set_key_image(const uchar *buff,uint length);
void sql_type(String &str) const; void sql_type(String &str) const;
void sql_rpl_type(String*) const;
virtual uchar *pack(uchar *to, const uchar *from, uint max_length); virtual uchar *pack(uchar *to, const uchar *from, uint max_length);
virtual const uchar *unpack(uchar* to, const uchar *from, virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end, uint param_data); const uchar *from_end, uint param_data);
......
...@@ -352,7 +352,8 @@ uint32 table_def::calc_field_size(uint col, uchar *master_data) const ...@@ -352,7 +352,8 @@ uint32 table_def::calc_field_size(uint col, uchar *master_data) const
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
/** /**
*/ */
void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_INFO *field_cs) void show_sql_type(enum_field_types type, uint16 metadata, String *str,
bool char_with_octets)
{ {
DBUG_ENTER("show_sql_type"); DBUG_ENTER("show_sql_type");
DBUG_PRINT("enter", ("type: %d, metadata: 0x%x", type, metadata)); DBUG_PRINT("enter", ("type: %d, metadata: 0x%x", type, metadata));
...@@ -420,11 +421,13 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_ ...@@ -420,11 +421,13 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_
case MYSQL_TYPE_VARCHAR_COMPRESSED: case MYSQL_TYPE_VARCHAR_COMPRESSED:
{ {
CHARSET_INFO *cs= str->charset(); CHARSET_INFO *cs= str->charset();
size_t length= size_t length=0;
cs->cset->snprintf(cs, (char*) str->ptr(), str->alloced_length(), if (char_with_octets)
"varchar(%u)%s", metadata, length= cs->cset->snprintf(cs, (char*) str->ptr(), str->alloced_length(),
type == MYSQL_TYPE_VARCHAR_COMPRESSED ? " compressed" "varchar(%u octets)", metadata);
: ""); else
length= cs->cset->snprintf(cs, (char*) str->ptr(), str->alloced_length(),
"varbinary(%u)", metadata);
str->length(length); str->length(length);
} }
break; break;
...@@ -475,22 +478,22 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_ ...@@ -475,22 +478,22 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_
it is necessary to check the pack length to figure out what kind it is necessary to check the pack length to figure out what kind
of blob it really is. of blob it really is.
*/ */
switch (get_blob_type_from_length(metadata)) switch (metadata)
{ {
case MYSQL_TYPE_TINY_BLOB: case 1:
str->set_ascii(STRING_WITH_LEN("tinyblob")); str->set_ascii(STRING_WITH_LEN("tinyblob"));
break; break;
case MYSQL_TYPE_MEDIUM_BLOB: case 2:
str->set_ascii(STRING_WITH_LEN("mediumblob")); str->set_ascii(STRING_WITH_LEN("blob"));
break; break;
case MYSQL_TYPE_LONG_BLOB: case 3:
str->set_ascii(STRING_WITH_LEN("longblob")); str->set_ascii(STRING_WITH_LEN("mediumblob"));
break; break;
case MYSQL_TYPE_BLOB: case 4:
str->set_ascii(STRING_WITH_LEN("blob")); str->set_ascii(STRING_WITH_LEN("longblob"));
break; break;
default: default:
...@@ -509,9 +512,13 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_ ...@@ -509,9 +512,13 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_
*/ */
CHARSET_INFO *cs= str->charset(); CHARSET_INFO *cs= str->charset();
uint bytes= (((metadata >> 4) & 0x300) ^ 0x300) + (metadata & 0x00ff); uint bytes= (((metadata >> 4) & 0x300) ^ 0x300) + (metadata & 0x00ff);
size_t length= size_t length=0;
cs->cset->snprintf(cs, (char*) str->ptr(), str->alloced_length(), if (char_with_octets)
"char(%d)", bytes / field_cs->mbmaxlen); length= cs->cset->snprintf(cs, (char*) str->ptr(), str->alloced_length(),
"char(%u octets)", bytes);
else
length= cs->cset->snprintf(cs, (char*) str->ptr(), str->alloced_length(),
"binary(%u)", bytes);
str->length(length); str->length(length);
} }
break; break;
...@@ -948,9 +955,13 @@ table_def::compatible_with(THD *thd, rpl_group_info *rgi, ...@@ -948,9 +955,13 @@ table_def::compatible_with(THD *thd, rpl_group_info *rgi,
String source_type(source_buf, sizeof(source_buf), &my_charset_latin1); String source_type(source_buf, sizeof(source_buf), &my_charset_latin1);
String target_type(target_buf, sizeof(target_buf), &my_charset_latin1); String target_type(target_buf, sizeof(target_buf), &my_charset_latin1);
THD *thd= table->in_use; THD *thd= table->in_use;
bool char_with_octets= field->cmp_type() == STRING_RESULT ?
field->has_charset() : true;
show_sql_type(type(col), field_metadata(col), &source_type,
char_with_octets);
field->sql_rpl_type(&target_type);
show_sql_type(type(col), field_metadata(col), &source_type, field->charset());
field->sql_type(target_type);
rli->report(ERROR_LEVEL, ER_SLAVE_CONVERSION_FAILED, rgi->gtid_info(), rli->report(ERROR_LEVEL, ER_SLAVE_CONVERSION_FAILED, rgi->gtid_info(),
ER_THD(thd, ER_SLAVE_CONVERSION_FAILED), ER_THD(thd, ER_SLAVE_CONVERSION_FAILED),
col, db_name, tbl_name, col, db_name, tbl_name,
......
...@@ -6461,7 +6461,7 @@ ER_MESSAGE_AND_STATEMENT ...@@ -6461,7 +6461,7 @@ ER_MESSAGE_AND_STATEMENT
eng "%s Statement: %s" eng "%s Statement: %s"
ER_SLAVE_CONVERSION_FAILED ER_SLAVE_CONVERSION_FAILED
eng "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'" eng "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.50s' to type '%-.50s'"
ER_SLAVE_CANT_CREATE_CONVERSION ER_SLAVE_CANT_CREATE_CONVERSION
eng "Can't create conversion table for table '%-.192s.%-.192s'" eng "Can't create conversion table for table '%-.192s.%-.192s'"
ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
......
...@@ -6291,9 +6291,6 @@ lock_trx_release_locks( ...@@ -6291,9 +6291,6 @@ lock_trx_release_locks(
/*--------------------------------------*/ /*--------------------------------------*/
trx_mutex_enter(trx); trx_mutex_enter(trx);
trx->state = TRX_STATE_COMMITTED_IN_MEMORY; trx->state = TRX_STATE_COMMITTED_IN_MEMORY;
/* Ensure that rw_trx_hash_t::find() will no longer find
this transaction. */
trx->id = 0;
trx_mutex_exit(trx); trx_mutex_exit(trx);
/*--------------------------------------*/ /*--------------------------------------*/
......
...@@ -492,6 +492,7 @@ trx_free_at_shutdown(trx_t *trx) ...@@ -492,6 +492,7 @@ trx_free_at_shutdown(trx_t *trx)
transaction was never committed and therefore lock_trx_release() transaction was never committed and therefore lock_trx_release()
was not called. */ was not called. */
trx->lock.table_locks.clear(); trx->lock.table_locks.clear();
trx->id = 0;
trx_free(trx); trx_free(trx);
} }
...@@ -1333,10 +1334,8 @@ trx_commit_in_memory( ...@@ -1333,10 +1334,8 @@ trx_commit_in_memory(
trx_sys.deregister_rw(trx); trx_sys.deregister_rw(trx);
} }
/* trx->id will be cleared in lock_trx_release_locks(trx). */
ut_ad(trx->read_only || !trx->rsegs.m_redo.rseg || trx->id);
lock_trx_release_locks(trx); lock_trx_release_locks(trx);
ut_ad(trx->id == 0); ut_ad(trx->read_only || !trx->rsegs.m_redo.rseg || trx->id);
/* Remove the transaction from the list of active /* Remove the transaction from the list of active
transactions now that it no longer holds any user locks. */ transactions now that it no longer holds any user locks. */
...@@ -1350,6 +1349,8 @@ trx_commit_in_memory( ...@@ -1350,6 +1349,8 @@ trx_commit_in_memory(
trx_update_mod_tables_timestamp(trx); trx_update_mod_tables_timestamp(trx);
MONITOR_INC(MONITOR_TRX_RW_COMMIT); MONITOR_INC(MONITOR_TRX_RW_COMMIT);
} }
trx->id = 0;
} }
ut_ad(!trx->rsegs.m_redo.undo); ut_ad(!trx->rsegs.m_redo.undo);
......
...@@ -468,7 +468,7 @@ INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT), ...@@ -468,7 +468,7 @@ INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'double' to type 'char(5)'' Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'double' to type 'char(5 octets) character set latin1''
*** Drop t10 *** *** Drop t10 ***
connection master; connection master;
...@@ -510,7 +510,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT), ...@@ -510,7 +510,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'tinyblob' to type 'varchar(254)'' Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'blob' to type 'varchar(254 octets) character set latin1''
*** Drop t11 *** *** Drop t11 ***
connection master; connection master;
......
...@@ -64,7 +64,7 @@ a b c ...@@ -64,7 +64,7 @@ a b c
connection slave; connection slave;
START SLAVE; START SLAVE;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t2' cannot be converted from type 'char(10)' to type 'char(5)'' Last_SQL_Error = 'Column 2 of table 'test.t2' cannot be converted from type 'char(10 octets)' to type 'char(5 octets) character set latin1''
STOP SLAVE; STOP SLAVE;
RESET SLAVE; RESET SLAVE;
SELECT * FROM t2 ORDER BY a; SELECT * FROM t2 ORDER BY a;
...@@ -102,7 +102,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TEX'),(@b1,1,'JOE AUSTIN'),(@b1,4,'QA TEST ...@@ -102,7 +102,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TEX'),(@b1,1,'JOE AUSTIN'),(@b1,4,'QA TEST
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 0 of table 'test.t3' cannot be converted from type 'tinyblob' to type 'int(11)'' Last_SQL_Error = 'Column 0 of table 'test.t3' cannot be converted from type 'blob' to type 'int(11)''
*** Drop t3 *** *** Drop t3 ***
connection master; connection master;
DROP TABLE t3; DROP TABLE t3;
...@@ -160,7 +160,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23,1,'b1b1',23.00098), ...@@ -160,7 +160,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23,1,'b1b1',23.00098),
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'varchar(6)' to type 'char(5)'' Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'varchar(6 octets)' to type 'char(5 octets) character set latin1''
*** Drop t5 *** *** Drop t5 ***
connection master; connection master;
DROP TABLE t5; DROP TABLE t5;
...@@ -188,7 +188,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23,1), ...@@ -188,7 +188,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23,1),
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'varchar(6)' to type 'char(5)'' Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'varchar(6 octets)' to type 'char(5 octets) character set latin1''
*** Drop t6 *** *** Drop t6 ***
include/rpl_reset.inc include/rpl_reset.inc
connection master; connection master;
...@@ -310,7 +310,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA'); ...@@ -310,7 +310,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA');
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'char(5)' to type 'double'' Last_SQL_Error = 'Column 2 of table 'test.t10' cannot be converted from type 'char(5 octets)' to type 'double''
*** Drop t10 *** *** Drop t10 ***
connection master; connection master;
DROP TABLE t10; DROP TABLE t10;
...@@ -338,7 +338,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA'); ...@@ -338,7 +338,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),(2,@b1,'JOE'),(3,@b1,'QA');
******************************************** ********************************************
connection slave; connection slave;
include/wait_for_slave_sql_error_and_skip.inc [errno=1677] include/wait_for_slave_sql_error_and_skip.inc [errno=1677]
Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'varchar(254)' to type 'int(11)'' Last_SQL_Error = 'Column 2 of table 'test.t11' cannot be converted from type 'varchar(254 octets)' to type 'int(11)''
*** Drop t11 *** *** Drop t11 ***
connection master; connection master;
DROP TABLE t11; DROP TABLE t11;
......
...@@ -565,7 +565,7 @@ INSERT INTO t5 VALUES (1, "", 1); ...@@ -565,7 +565,7 @@ INSERT INTO t5 VALUES (1, "", 1);
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2); INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(255)' to type 'char(16)'' Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(765 octets)' to type 'char(48 octets) character set utf8''
include/rpl_reset.inc include/rpl_reset.inc
[expecting slave to stop] [expecting slave to stop]
connection master; connection master;
...@@ -573,7 +573,7 @@ INSERT INTO t6 VALUES (1, "", 1); ...@@ -573,7 +573,7 @@ INSERT INTO t6 VALUES (1, "", 1);
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2); INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
connection slave; connection slave;
include/wait_for_slave_sql_error.inc [errno=1677] include/wait_for_slave_sql_error.inc [errno=1677]
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(255)' to type 'char(128)'' Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(765 octets)' to type 'char(384 octets) character set utf8''
include/rpl_reset.inc include/rpl_reset.inc
[expecting slave to replicate correctly] [expecting slave to replicate correctly]
connection master; connection master;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment