Skip to content

Commit

Permalink
MDEV-16248 Row based replication to spider with float column fails on…
Browse files Browse the repository at this point in the history
… delete/update (#1354)
  • Loading branch information
Kentoku committed Jul 6, 2019
1 parent fb3998c commit 4a739d7
Show file tree
Hide file tree
Showing 17 changed files with 632 additions and 3 deletions.
@@ -0,0 +1,13 @@
--let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP
--connection master_1
set session binlog_format= @old_binlog_format;
--connection slave1_1
--disable_warnings
--disable_query_log
--disable_result_log
--source ../include/deinit_spider.inc
--source ../t/slave_test_deinit.inc
--source ../t/test_deinit.inc
--enable_result_log
--enable_query_log
--enable_warnings
@@ -0,0 +1,24 @@
--disable_warnings
--disable_query_log
--disable_result_log
--source ../t/test_init.inc
--source ../t/slave_test_init.inc
--enable_result_log
--enable_query_log
--enable_warnings
--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES
let $CHILD2_1_SELECT_TABLES=
SELECT pkey, f FROM tbl_a ORDER BY pkey;
let $CHILD2_1_SELECT_ARGUMENT1=
SELECT argument FROM mysql.general_log WHERE argument LIKE '%delete %';
--connection slave1_1
--disable_warnings
--disable_query_log
--disable_result_log
--source ../include/init_spider.inc
--enable_result_log
--enable_query_log
--enable_warnings
--connection master_1
set @old_binlog_format= @@binlog_format;
set session binlog_format= 'ROW';
@@ -0,0 +1,4 @@
--let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP
--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP
--let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP
--source delete_with_float_column_deinit.inc
@@ -0,0 +1,14 @@
--source delete_with_float_column_init.inc
--let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1
let $MASTER_1_COMMENT_2_1=
COMMENT='table "tbl_a", srv "s_2_1", wrapper "mariadb"';
--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES
let $CHILD2_1_DROP_TABLES=
DROP TABLE IF EXISTS tbl_a;
--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES
let $CHILD2_1_CREATE_TABLES=
CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
@@ -0,0 +1,4 @@
--let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP
--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP
--let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP
--source delete_with_float_column_deinit.inc
@@ -0,0 +1,16 @@
--source delete_with_float_column_init.inc
--let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1
let $MASTER_1_COMMENT_2_1=
COMMENT='table "tbl_a", srv "s_2_1", wrapper "mysql"';
--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES
let $CHILD2_1_DROP_TABLES=
DROP TABLE IF EXISTS tbl_a $STR_SEMICOLON
DROP FUNCTION to_float;
--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES
let $CHILD2_1_CREATE_TABLES=
CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON
CREATE FUNCTION to_float(a decimal(20,6)) RETURNS float RETURN cast(a as double);
@@ -0,0 +1,85 @@
for master_1
for child2
child2_1
child2_2
child2_3
for child3
for slave1_1
connection slave1_1;
connection master_1;
set @old_binlog_format= @@binlog_format;
set session binlog_format= 'ROW';

drop and create databases
connection master_1;
CREATE DATABASE auto_test_local;
USE auto_test_local;
connection slave1_1;
CREATE DATABASE auto_test_local;
USE auto_test_local;
connection child2_1;
SET @old_log_output = @@global.log_output;
SET GLOBAL log_output = 'TABLE,FILE';
CREATE DATABASE auto_test_remote;
USE auto_test_remote;

create table and insert
connection child2_1;
CHILD2_1_CREATE_TABLES
TRUNCATE TABLE mysql.general_log;
connection master_1;
connection slave1_1;
connection master_1;
SET SESSION sql_log_bin= 0;
CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1
SET SESSION sql_log_bin= 1;
connection slave1_1;
CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
connection master_1;
INSERT INTO tbl_a (pkey, f) VALUES (0,NULL);
INSERT INTO tbl_a (pkey, f) VALUES (1,0.671437);
DELETE FROM tbl_a WHERE pkey = 0;
DELETE FROM tbl_a WHERE pkey = 1;
connection slave1_1;
connection master_1;
SET SESSION sql_log_bin= 0;
connection child2_1;
SELECT argument FROM mysql.general_log WHERE argument LIKE '%delete %';
argument
delete from `auto_test_remote`.`tbl_a` where `pkey` = 0 and `f` is null limit 1
delete from `auto_test_remote`.`tbl_a` where `pkey` = 1 and `f` = cast(0.671437 as float) limit 1
SELECT argument FROM mysql.general_log WHERE argument LIKE '%delete %'
SELECT pkey, f FROM tbl_a ORDER BY pkey;
pkey f
connection slave1_1;
SELECT pkey, f FROM tbl_a ORDER BY pkey;
pkey f

deinit
connection master_1;
DROP DATABASE IF EXISTS auto_test_local;
connection slave1_1;
DROP DATABASE IF EXISTS auto_test_local;
connection child2_1;
DROP DATABASE IF EXISTS auto_test_remote;
SET GLOBAL log_output = @old_log_output;
connection master_1;
set session binlog_format= @old_binlog_format;
connection slave1_1;
for slave1_1
for master_1
for child2
child2_1
child2_2
child2_3
for child3

end of test
@@ -0,0 +1,85 @@
for master_1
for child2
child2_1
child2_2
child2_3
for child3
for slave1_1
connection slave1_1;
connection master_1;
set @old_binlog_format= @@binlog_format;
set session binlog_format= 'ROW';

drop and create databases
connection master_1;
CREATE DATABASE auto_test_local;
USE auto_test_local;
connection slave1_1;
CREATE DATABASE auto_test_local;
USE auto_test_local;
connection child2_1;
SET @old_log_output = @@global.log_output;
SET GLOBAL log_output = 'TABLE,FILE';
CREATE DATABASE auto_test_remote;
USE auto_test_remote;

create table and insert
connection child2_1;
CHILD2_1_CREATE_TABLES
TRUNCATE TABLE mysql.general_log;
connection master_1;
connection slave1_1;
connection master_1;
SET SESSION sql_log_bin= 0;
CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1
SET SESSION sql_log_bin= 1;
connection slave1_1;
CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1
connection master_1;
INSERT INTO tbl_a (pkey, f) VALUES (0,NULL);
INSERT INTO tbl_a (pkey, f) VALUES (1,0.671437);
DELETE FROM tbl_a WHERE pkey = 0;
DELETE FROM tbl_a WHERE pkey = 1;
connection slave1_1;
connection master_1;
SET SESSION sql_log_bin= 0;
connection child2_1;
SELECT argument FROM mysql.general_log WHERE argument LIKE '%delete %';
argument
delete from `auto_test_remote`.`tbl_a` where `pkey` = 0 and `f` is null limit 1
delete from `auto_test_remote`.`tbl_a` where `pkey` = 1 and `f` = /* create function to_float(a decimal(20,6)) returns float return cast(a as double) */ to_float(0.671437) limit 1
SELECT argument FROM mysql.general_log WHERE argument LIKE '%delete %'
SELECT pkey, f FROM tbl_a ORDER BY pkey;
pkey f
connection slave1_1;
SELECT pkey, f FROM tbl_a ORDER BY pkey;
pkey f

deinit
connection master_1;
DROP DATABASE IF EXISTS auto_test_local;
connection slave1_1;
DROP DATABASE IF EXISTS auto_test_local;
connection child2_1;
DROP DATABASE IF EXISTS auto_test_remote;
SET GLOBAL log_output = @old_log_output;
connection master_1;
set session binlog_format= @old_binlog_format;
connection slave1_1;
for slave1_1
for master_1
for child2
child2_1
child2_2
child2_3
for child3

end of test
@@ -0,0 +1,98 @@
--echo
--echo drop and create databases
--connection master_1
--disable_warnings
CREATE DATABASE auto_test_local;
USE auto_test_local;

--connection slave1_1
CREATE DATABASE auto_test_local;
USE auto_test_local;

--connection child2_1
SET @old_log_output = @@global.log_output;
SET GLOBAL log_output = 'TABLE,FILE';
CREATE DATABASE auto_test_remote;
USE auto_test_remote;
--enable_warnings

--echo
--echo create table and insert

--connection child2_1
--disable_query_log
echo CHILD2_1_CREATE_TABLES;
eval $CHILD2_1_CREATE_TABLES;
--enable_query_log
TRUNCATE TABLE mysql.general_log;

--connection master_1
save_master_pos;

--connection slave1_1
sync_with_master;

--connection master_1
SET SESSION sql_log_bin= 0;
--disable_query_log
echo CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) MASTER_1_ENGINE2 MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
eval CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) $MASTER_1_ENGINE2 $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
--enable_query_log
SET SESSION sql_log_bin= 1;

--connection slave1_1
--disable_query_log
echo CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1;
eval CREATE TABLE tbl_a (
pkey int NOT NULL,
f float DEFAULT NULL,
PRIMARY KEY (pkey)
) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
--enable_query_log

--connection master_1
INSERT INTO tbl_a (pkey, f) VALUES (0,NULL);
INSERT INTO tbl_a (pkey, f) VALUES (1,0.671437);
DELETE FROM tbl_a WHERE pkey = 0;
DELETE FROM tbl_a WHERE pkey = 1;
save_master_pos;

--connection slave1_1
sync_with_master;

--connection master_1
SET SESSION sql_log_bin= 0;

--connection child2_1
eval $CHILD2_1_SELECT_ARGUMENT1;
eval $CHILD2_1_SELECT_TABLES;

--connection slave1_1
SELECT pkey, f FROM tbl_a ORDER BY pkey;

--echo
--echo deinit
--disable_warnings
--connection master_1
DROP DATABASE IF EXISTS auto_test_local;

--connection slave1_1
DROP DATABASE IF EXISTS auto_test_local;

--connection child2_1
DROP DATABASE IF EXISTS auto_test_remote;
SET GLOBAL log_output = @old_log_output;

--enable_warnings
@@ -0,0 +1,4 @@
!include include/default_mysqld.cnf
!include ../my_1_1.cnf
!include ../my_2_1.cnf
!include ../my_4_1.cnf
@@ -0,0 +1,5 @@
--source ../include/delete_with_float_column_mariadb_init.inc
--source delete_with_float_column.inc
--source ../include/delete_with_float_column_mariadb_deinit.inc
--echo
--echo end of test
@@ -0,0 +1,4 @@
!include include/default_mysqld.cnf
!include ../my_1_1.cnf
!include ../my_2_1.cnf
!include ../my_4_1.cnf
@@ -0,0 +1,5 @@
--source ../include/delete_with_float_column_mysql_init.inc
--source delete_with_float_column.inc
--source ../include/delete_with_float_column_mysql_deinit.inc
--echo
--echo end of test
4 changes: 4 additions & 0 deletions storage/spider/spd_db_include.h
Expand Up @@ -157,6 +157,8 @@ typedef st_spider_result SPIDER_RESULT;
#define SPIDER_SQL_MBR_DISJOINT_LEN (sizeof(SPIDER_SQL_MBR_DISJOINT_STR) - 1)
#define SPIDER_SQL_NOT_BETWEEN_STR "not between"
#define SPIDER_SQL_NOT_BETWEEN_LEN (sizeof(SPIDER_SQL_NOT_BETWEEN_STR) - 1)
#define SPIDER_SQL_TO_FLOAT_STR "/* create function to_float(a decimal(20,6)) returns float return a */ to_float("
#define SPIDER_SQL_TO_FLOAT_LEN (sizeof(SPIDER_SQL_TO_FLOAT_STR) - 1)
#define SPIDER_SQL_IN_STR "in("
#define SPIDER_SQL_IN_LEN (sizeof(SPIDER_SQL_IN_STR) - 1)
#define SPIDER_SQL_NOT_IN_STR "not in("
Expand All @@ -181,6 +183,8 @@ typedef st_spider_result SPIDER_RESULT;
#define SPIDER_SQL_AS_TIME_LEN (sizeof(SPIDER_SQL_AS_TIME_STR) - 1)
#define SPIDER_SQL_AS_BINARY_STR " as binary"
#define SPIDER_SQL_AS_BINARY_LEN (sizeof(SPIDER_SQL_AS_BINARY_STR) - 1)
#define SPIDER_SQL_AS_FLOAT_STR " as float"
#define SPIDER_SQL_AS_FLOAT_LEN (sizeof(SPIDER_SQL_AS_FLOAT_STR) - 1)
#define SPIDER_SQL_IS_TRUE_STR " is true"
#define SPIDER_SQL_IS_TRUE_LEN (sizeof(SPIDER_SQL_IS_TRUE_STR) - 1)
#define SPIDER_SQL_IS_NOT_TRUE_STR " is not true"
Expand Down

0 comments on commit 4a739d7

Please sign in to comment.