Commit 2308b9af authored by Andrei Elkin's avatar Andrei Elkin

MDEV-17098 DATE -> DATETIME replication conversion not working, even in ALL_NON_LOSSY mode

Opened up MYSQL_TYPE _DATETIME{,2} <-> _NEWDATE conversions for replication.
parent 2d4075e1
......@@ -24,11 +24,19 @@ connection master;
disable_warnings;
DROP TABLE IF EXISTS t1;
enable_warnings;
if ($source_temp_format)
{
--eval SET @@global.mysql56_temporal_format= $source_temp_format
}
eval CREATE TABLE t1(
pk INT NOT NULL PRIMARY KEY,
a $source_type
) ENGINE=$engine_type;
sync_slave_with_master;
if ($target_temp_format)
{
--eval SET @@global.mysql56_temporal_format= $source_temp_format
}
eval ALTER TABLE t1 MODIFY a $target_type;
connection master;
......
......@@ -1007,5 +1007,96 @@ source extra/rpl_tests/check_type.inc;
--echo # End of MDEV-15833
--echo #
--echo # MDEV-17098 DATE <-> DATETIME
--echo #
# NON-LOSSY
let $source_temp_format= 1; # irrelevant with DATE though
let $source_type= DATE;
let $target_temp_format= 1; # to produce MYSQL_TYPE_DATETIME2
let $target_type= DATETIME(6);
let $source_value= '2018-10-11';
let $target_value= '2018-10-11 00:00:00.000000';
let $can_convert = $if_is_non_lossy;
source extra/rpl_tests/check_type.inc;
let $source_temp_format= 1;
let $source_type= DATE;
let $target_temp_format= 0; # to produce "old" MYSQL_TYPE_DATETIME
let $target_type= DATETIME(6);
let $source_value= '2018-10-11';
let $target_value= '2018-10-11 00:00:00.000000';
let $can_convert = $if_is_non_lossy;
source extra/rpl_tests/check_type.inc;
let $source_temp_format= 0;
let $source_type= DATE;
let $target_temp_format= 1;
let $target_type= DATETIME(6);
let $source_value= '2018-10-11';
let $target_value= '2018-10-11 00:00:00.000000';
let $can_convert = $if_is_non_lossy;
source extra/rpl_tests/check_type.inc;
# zero-precision test version
let $source_temp_format= 1;
let $source_type= DATE;
let $target_temp_format= 1;
let $target_type= DATETIME(0);
let $source_value= '2018-10-11';
let $target_value= '2018-10-11 00:00:00';
let $can_convert = $if_is_non_lossy;
source extra/rpl_tests/check_type.inc;
# LOSSY
let $source_temp_format= 1;
let $source_type= DATETIME(6);
let $target_temp_format= 1;
let $target_type= DATE;
let $source_value= '2018-10-11 00:00:00.000001';
let $target_value= '2018-10-11';
let $can_convert = $if_is_lossy;
source extra/rpl_tests/check_type.inc;
let $source_temp_format= 1;
let $source_type= DATETIME(6);
let $target_temp_format= 0;
let $target_type= DATE;
let $source_value= '2018-10-11 00:00:00.000001';
let $target_value= '2018-10-11';
let $can_convert = $if_is_lossy;
source extra/rpl_tests/check_type.inc;
# zero-precision test version
let $source_temp_format= 1;
let $source_type= DATETIME(0);
let $target_temp_format= 1;
let $target_type= DATE;
let $source_value= '2018-10-11 00:00:00';
let $target_value= '2018-10-11';
let $can_convert = $if_is_lossy;
source extra/rpl_tests/check_type.inc;
# TODO: fix MDEV-17394 Row-based replication DATETIME(m) to
# DATETIME(s) does not work or incorrect
#
#
# let $source_temp_format= 0;
# let $source_type= DATETIME(6);
# let $target_temp_format= 1;
# let $target_type= DATE;
# ...
# let $source_temp_format= 0;
# let $source_type= DATETIME(6);
# let $target_temp_format= 0;
# let $target_type= DATE;
# ...
let $source_temp_format=;
let $target_temp_format=;
--echo # End of MDEV-17098
--source include/rpl_reset.inc
enable_query_log;
......@@ -43,6 +43,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY';
......@@ -51,6 +55,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY';
......@@ -59,6 +67,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY,ALL_NON_LOSSY';
......@@ -67,6 +79,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY,ALL_NON_LOSSY';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
**** Result of conversions ****
......@@ -208,6 +224,13 @@ LONGBLOB TINYBLOB <Correct error>
LONGBLOB BLOB <Correct error>
LONGBLOB MEDIUMBLOB <Correct error>
LONGBLOB VARBINARY(65500 <Correct error>
DATE DATETIME(6) <Correct error>
DATE DATETIME(6) <Correct error>
DATE DATETIME(6) <Correct error>
DATE DATETIME(0) <Correct error>
DATETIME(6) DATE <Correct error>
DATETIME(6) DATE <Correct error>
DATETIME(0) DATE <Correct error>
TINYBLOB TINYBLOB ALL_NON_LOSSY <Correct value>
TINYBLOB BLOB ALL_NON_LOSSY <Correct value>
TINYBLOB MEDIUMBLOB ALL_NON_LOSSY <Correct value>
......@@ -345,6 +368,13 @@ LONGBLOB TINYBLOB ALL_NON_LOSSY <Correct error>
LONGBLOB BLOB ALL_NON_LOSSY <Correct error>
LONGBLOB MEDIUMBLOB ALL_NON_LOSSY <Correct error>
LONGBLOB VARBINARY(65500 ALL_NON_LOSSY <Correct error>
DATE DATETIME(6) ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_NON_LOSSY <Correct value>
DATE DATETIME(0) ALL_NON_LOSSY <Correct value>
DATETIME(6) DATE ALL_NON_LOSSY <Correct error>
DATETIME(6) DATE ALL_NON_LOSSY <Correct error>
DATETIME(0) DATE ALL_NON_LOSSY <Correct error>
TINYBLOB TINYBLOB ALL_LOSSY <Correct value>
TINYBLOB BLOB ALL_LOSSY <Correct error>
TINYBLOB MEDIUMBLOB ALL_LOSSY <Correct error>
......@@ -482,6 +512,13 @@ LONGBLOB TINYBLOB ALL_LOSSY <Correct value>
LONGBLOB BLOB ALL_LOSSY <Correct value>
LONGBLOB MEDIUMBLOB ALL_LOSSY <Correct value>
LONGBLOB VARBINARY(65500 ALL_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY <Correct error>
DATE DATETIME(6) ALL_LOSSY <Correct error>
DATE DATETIME(6) ALL_LOSSY <Correct error>
DATE DATETIME(0) ALL_LOSSY <Correct error>
DATETIME(6) DATE ALL_LOSSY <Correct value>
DATETIME(6) DATE ALL_LOSSY <Correct value>
DATETIME(0) DATE ALL_LOSSY <Correct value>
TINYBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
TINYBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
TINYBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
......@@ -619,6 +656,13 @@ LONGBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
LONGBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
LONGBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
LONGBLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(0) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATETIME(6) DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATETIME(6) DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATETIME(0) DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DROP TABLE type_conversions;
call mtr.add_suppression("Slave SQL.*Column 1 of table .test.t1. cannot be converted from type.* error.* 1677");
connection master;
......
......@@ -43,6 +43,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY';
......@@ -51,6 +55,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY';
......@@ -59,6 +67,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY,ALL_NON_LOSSY';
......@@ -67,6 +79,10 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY,ALL_NON_LOSSY';
# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values
#
# End of MDEV-15833
#
# MDEV-17098 DATE <-> DATETIME
#
# End of MDEV-17098
include/rpl_reset.inc
connection slave;
**** Result of conversions ****
......@@ -208,6 +224,13 @@ LONGBLOB TINYBLOB <Correct error>
LONGBLOB BLOB <Correct error>
LONGBLOB MEDIUMBLOB <Correct error>
LONGBLOB VARBINARY(65500 <Correct error>
DATE DATETIME(6) <Correct error>
DATE DATETIME(6) <Correct error>
DATE DATETIME(6) <Correct error>
DATE DATETIME(0) <Correct error>
DATETIME(6) DATE <Correct error>
DATETIME(6) DATE <Correct error>
DATETIME(0) DATE <Correct error>
TINYBLOB TINYBLOB ALL_NON_LOSSY <Correct value>
TINYBLOB BLOB ALL_NON_LOSSY <Correct value>
TINYBLOB MEDIUMBLOB ALL_NON_LOSSY <Correct value>
......@@ -345,6 +368,13 @@ LONGBLOB TINYBLOB ALL_NON_LOSSY <Correct error>
LONGBLOB BLOB ALL_NON_LOSSY <Correct error>
LONGBLOB MEDIUMBLOB ALL_NON_LOSSY <Correct error>
LONGBLOB VARBINARY(65500 ALL_NON_LOSSY <Correct error>
DATE DATETIME(6) ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_NON_LOSSY <Correct value>
DATE DATETIME(0) ALL_NON_LOSSY <Correct value>
DATETIME(6) DATE ALL_NON_LOSSY <Correct error>
DATETIME(6) DATE ALL_NON_LOSSY <Correct error>
DATETIME(0) DATE ALL_NON_LOSSY <Correct error>
TINYBLOB TINYBLOB ALL_LOSSY <Correct value>
TINYBLOB BLOB ALL_LOSSY <Correct error>
TINYBLOB MEDIUMBLOB ALL_LOSSY <Correct error>
......@@ -482,6 +512,13 @@ LONGBLOB TINYBLOB ALL_LOSSY <Correct value>
LONGBLOB BLOB ALL_LOSSY <Correct value>
LONGBLOB MEDIUMBLOB ALL_LOSSY <Correct value>
LONGBLOB VARBINARY(65500 ALL_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY <Correct error>
DATE DATETIME(6) ALL_LOSSY <Correct error>
DATE DATETIME(6) ALL_LOSSY <Correct error>
DATE DATETIME(0) ALL_LOSSY <Correct error>
DATETIME(6) DATE ALL_LOSSY <Correct value>
DATETIME(6) DATE ALL_LOSSY <Correct value>
DATETIME(0) DATE ALL_LOSSY <Correct value>
TINYBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
TINYBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
TINYBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
......@@ -619,6 +656,13 @@ LONGBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
LONGBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
LONGBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY <Correct value>
LONGBLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(6) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATE DATETIME(0) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATETIME(6) DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATETIME(6) DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DATETIME(0) DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
DROP TABLE type_conversions;
call mtr.add_suppression("Slave SQL.*Column 1 of table .test.t1. cannot be converted from type.* error.* 1677");
connection master;
......
......@@ -765,14 +765,44 @@ can_convert_field_to(Field *field,
case MYSQL_TYPE_TIME:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_YEAR:
case MYSQL_TYPE_NEWDATE:
case MYSQL_TYPE_NULL:
case MYSQL_TYPE_ENUM:
case MYSQL_TYPE_SET:
case MYSQL_TYPE_TIMESTAMP2:
case MYSQL_TYPE_DATETIME2:
case MYSQL_TYPE_TIME2:
DBUG_RETURN(false);
case MYSQL_TYPE_NEWDATE:
{
if (field->real_type() == MYSQL_TYPE_DATETIME2 ||
field->real_type() == MYSQL_TYPE_DATETIME)
{
*order_var= -1;
DBUG_RETURN(is_conversion_ok(*order_var, rli));
}
else
{
DBUG_RETURN(false);
}
}
break;
//case MYSQL_TYPE_DATETIME: TODO: fix MDEV-17394 and uncomment.
//
//The "old" type does not specify the fraction part size which is required
//for correct conversion.
case MYSQL_TYPE_DATETIME2:
{
if (field->real_type() == MYSQL_TYPE_NEWDATE)
{
*order_var= 1;
DBUG_RETURN(is_conversion_ok(*order_var, rli));
}
else
{
DBUG_RETURN(false);
}
}
break;
}
DBUG_RETURN(false); // To keep GCC happy
}
......
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