Commit 29da7a1a authored by Alexander Barkov's avatar Alexander Barkov

MDEV-16542 Fix ALTER TABLE FORCE to upgrade temporal types

parent aa01f51b
#
# Start of 10.4 tests
#
#
# MDEV-16542 Fix ALTER TABLE FORCE to upgrade temporal types
#
CREATE PROCEDURE mdev16542_create_select()
BEGIN
SELECT '# CREATE..SELECT and SHOW' AS ``;
CREATE TABLE t2 AS SELECT
a0, a1, a2, a3, a4, a5, a6,
COALESCE(a0),
COALESCE(a1),
COALESCE(a2),
COALESCE(a3),
COALESCE(a4),
COALESCE(a5),
COALESCE(a6)
FROM t1;
SHOW CREATE TABLE t2;
DROP TABLE t2;
END;
$$
CREATE PROCEDURE mdev16542_alter_force_and_show()
BEGIN
SELECT '# ALTER..FORCE and SHOW' AS ``;
ALTER TABLE t1 FORCE;
SHOW CREATE TABLE t1;
END;
$$
CREATE PROCEDURE mdev16542()
BEGIN
SET SESSION debug_dbug="+d,sql_type";
SELECT '# Original table' AS ``;
SHOW CREATE TABLE t1;
CALL mdev16542_create_select();
CALL mdev16542_alter_force_and_show();
SELECT '# Setting @@global.mysql56_temporal_format=false' AS ``;
SET @@global.mysql56_temporal_format=false;
CALL mdev16542_create_select();
CALL mdev16542_alter_force_and_show();
SELECT '# Setting @@global.mysql56_temporal_format=true' AS ``;
SET @@global.mysql56_temporal_format=true;
CALL mdev16542_create_select();
CALL mdev16542_alter_force_and_show();
SET SESSION debug_dbug="-d,sql_type";
END;
$$
SET @@global.mysql56_temporal_format=true;
CREATE TABLE t1 (
a0 TIME,
a1 TIME(1),
a2 TIME(2),
a3 TIME(3),
a4 TIME(4),
a5 TIME(5),
a6 TIME(6)
);
CALL mdev16542;
# Original table
Table Create Table
t1 CREATE TABLE `t1` (
`a0` time /* mysql-5.6 */ DEFAULT NULL,
`a1` time(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` time(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` time(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` time(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` time(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` time(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` time /* mysql-5.6 */ DEFAULT NULL,
`a1` time(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` time(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` time(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` time(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` time(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` time(6) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a0)` time /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a1)` time(1) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a2)` time(2) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a3)` time(3) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a4)` time(4) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a5)` time(5) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a6)` time(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` time /* mysql-5.6 */ DEFAULT NULL,
`a1` time(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` time(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` time(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` time(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` time(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` time(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# Setting @@global.mysql56_temporal_format=false
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` time /* mariadb-5.3 */ DEFAULT NULL,
`a1` time(1) /* mariadb-5.3 */ DEFAULT NULL,
`a2` time(2) /* mariadb-5.3 */ DEFAULT NULL,
`a3` time(3) /* mariadb-5.3 */ DEFAULT NULL,
`a4` time(4) /* mariadb-5.3 */ DEFAULT NULL,
`a5` time(5) /* mariadb-5.3 */ DEFAULT NULL,
`a6` time(6) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a0)` time /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a1)` time(1) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a2)` time(2) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a3)` time(3) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a4)` time(4) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a5)` time(5) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a6)` time(6) /* mariadb-5.3 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` time /* mariadb-5.3 */ DEFAULT NULL,
`a1` time(1) /* mariadb-5.3 */ DEFAULT NULL,
`a2` time(2) /* mariadb-5.3 */ DEFAULT NULL,
`a3` time(3) /* mariadb-5.3 */ DEFAULT NULL,
`a4` time(4) /* mariadb-5.3 */ DEFAULT NULL,
`a5` time(5) /* mariadb-5.3 */ DEFAULT NULL,
`a6` time(6) /* mariadb-5.3 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# Setting @@global.mysql56_temporal_format=true
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` time /* mysql-5.6 */ DEFAULT NULL,
`a1` time(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` time(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` time(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` time(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` time(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` time(6) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a0)` time /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a1)` time(1) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a2)` time(2) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a3)` time(3) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a4)` time(4) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a5)` time(5) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a6)` time(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` time /* mysql-5.6 */ DEFAULT NULL,
`a1` time(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` time(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` time(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` time(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` time(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` time(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
CREATE TABLE t1 (
a0 DATETIME,
a1 DATETIME(1),
a2 DATETIME(2),
a3 DATETIME(3),
a4 DATETIME(4),
a5 DATETIME(5),
a6 DATETIME(6)
);
CALL mdev16542;
# Original table
Table Create Table
t1 CREATE TABLE `t1` (
`a0` datetime /* mysql-5.6 */ DEFAULT NULL,
`a1` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` datetime(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` datetime /* mysql-5.6 */ DEFAULT NULL,
`a1` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` datetime(6) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a0)` datetime /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a1)` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a2)` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a3)` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a4)` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a5)` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a6)` datetime(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` datetime /* mysql-5.6 */ DEFAULT NULL,
`a1` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` datetime(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# Setting @@global.mysql56_temporal_format=false
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` datetime /* mariadb-5.3 */ DEFAULT NULL,
`a1` datetime(1) /* mariadb-5.3 */ DEFAULT NULL,
`a2` datetime(2) /* mariadb-5.3 */ DEFAULT NULL,
`a3` datetime(3) /* mariadb-5.3 */ DEFAULT NULL,
`a4` datetime(4) /* mariadb-5.3 */ DEFAULT NULL,
`a5` datetime(5) /* mariadb-5.3 */ DEFAULT NULL,
`a6` datetime(6) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a0)` datetime /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a1)` datetime(1) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a2)` datetime(2) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a3)` datetime(3) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a4)` datetime(4) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a5)` datetime(5) /* mariadb-5.3 */ DEFAULT NULL,
`COALESCE(a6)` datetime(6) /* mariadb-5.3 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` datetime /* mariadb-5.3 */ DEFAULT NULL,
`a1` datetime(1) /* mariadb-5.3 */ DEFAULT NULL,
`a2` datetime(2) /* mariadb-5.3 */ DEFAULT NULL,
`a3` datetime(3) /* mariadb-5.3 */ DEFAULT NULL,
`a4` datetime(4) /* mariadb-5.3 */ DEFAULT NULL,
`a5` datetime(5) /* mariadb-5.3 */ DEFAULT NULL,
`a6` datetime(6) /* mariadb-5.3 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# Setting @@global.mysql56_temporal_format=true
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` datetime /* mysql-5.6 */ DEFAULT NULL,
`a1` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` datetime(6) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a0)` datetime /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a1)` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a2)` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a3)` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a4)` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a5)` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`COALESCE(a6)` datetime(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` datetime /* mysql-5.6 */ DEFAULT NULL,
`a1` datetime(1) /* mysql-5.6 */ DEFAULT NULL,
`a2` datetime(2) /* mysql-5.6 */ DEFAULT NULL,
`a3` datetime(3) /* mysql-5.6 */ DEFAULT NULL,
`a4` datetime(4) /* mysql-5.6 */ DEFAULT NULL,
`a5` datetime(5) /* mysql-5.6 */ DEFAULT NULL,
`a6` datetime(6) /* mysql-5.6 */ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
CREATE TABLE t1 (
a0 TIMESTAMP,
a1 TIMESTAMP(1),
a2 TIMESTAMP(2),
a3 TIMESTAMP(3),
a4 TIMESTAMP(4),
a5 TIMESTAMP(5),
a6 TIMESTAMP(6)
);
CALL mdev16542;
# Original table
Table Create Table
t1 CREATE TABLE `t1` (
`a0` timestamp /* mysql-5.6 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` timestamp /* mysql-5.6 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000',
`COALESCE(a0)` timestamp /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a1)` timestamp(1) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a2)` timestamp(2) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a3)` timestamp(3) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a4)` timestamp(4) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a5)` timestamp(5) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a6)` timestamp(6) /* mysql-5.6 */ NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` timestamp /* mysql-5.6 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# Setting @@global.mysql56_temporal_format=false
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` timestamp /* mariadb-5.3 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000',
`COALESCE(a0)` timestamp /* mariadb-5.3 */ NULL DEFAULT NULL,
`COALESCE(a1)` timestamp(1) /* mariadb-5.3 */ NULL DEFAULT NULL,
`COALESCE(a2)` timestamp(2) /* mariadb-5.3 */ NULL DEFAULT NULL,
`COALESCE(a3)` timestamp(3) /* mariadb-5.3 */ NULL DEFAULT NULL,
`COALESCE(a4)` timestamp(4) /* mariadb-5.3 */ NULL DEFAULT NULL,
`COALESCE(a5)` timestamp(5) /* mariadb-5.3 */ NULL DEFAULT NULL,
`COALESCE(a6)` timestamp(6) /* mariadb-5.3 */ NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` timestamp /* mariadb-5.3 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# Setting @@global.mysql56_temporal_format=true
# CREATE..SELECT and SHOW
Table Create Table
t2 CREATE TABLE `t2` (
`a0` timestamp /* mysql-5.6 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000',
`COALESCE(a0)` timestamp /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a1)` timestamp(1) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a2)` timestamp(2) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a3)` timestamp(3) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a4)` timestamp(4) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a5)` timestamp(5) /* mysql-5.6 */ NULL DEFAULT NULL,
`COALESCE(a6)` timestamp(6) /* mysql-5.6 */ NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
# ALTER..FORCE and SHOW
Table Create Table
t1 CREATE TABLE `t1` (
`a0` timestamp /* mysql-5.6 */ NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`a1` timestamp(1) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0',
`a2` timestamp(2) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`a3` timestamp(3) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000',
`a4` timestamp(4) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.0000',
`a5` timestamp(5) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.00000',
`a6` timestamp(6) /* mysql-5.6 */ NOT NULL DEFAULT '0000-00-00 00:00:00.000000'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
SET @@global.mysql56_temporal_format=DEFAULT;
DROP PROCEDURE mdev16542;
DROP PROCEDURE mdev16542_create_select;
DROP PROCEDURE mdev16542_alter_force_and_show;
#
# End of 10.4 tests
#
--echo #
--echo # Start of 10.4 tests
--echo #
--echo #
--echo # MDEV-16542 Fix ALTER TABLE FORCE to upgrade temporal types
--echo #
DELIMITER $$;
CREATE PROCEDURE mdev16542_create_select()
BEGIN
SELECT '# CREATE..SELECT and SHOW' AS ``;
CREATE TABLE t2 AS SELECT
a0, a1, a2, a3, a4, a5, a6,
COALESCE(a0),
COALESCE(a1),
COALESCE(a2),
COALESCE(a3),
COALESCE(a4),
COALESCE(a5),
COALESCE(a6)
FROM t1;
SHOW CREATE TABLE t2;
DROP TABLE t2;
END;
$$
CREATE PROCEDURE mdev16542_alter_force_and_show()
BEGIN
SELECT '# ALTER..FORCE and SHOW' AS ``;
ALTER TABLE t1 FORCE;
SHOW CREATE TABLE t1;
END;
$$
CREATE PROCEDURE mdev16542()
BEGIN
SET SESSION debug_dbug="+d,sql_type";
SELECT '# Original table' AS ``;
SHOW CREATE TABLE t1;
CALL mdev16542_create_select();
CALL mdev16542_alter_force_and_show();
SELECT '# Setting @@global.mysql56_temporal_format=false' AS ``;
SET @@global.mysql56_temporal_format=false;
CALL mdev16542_create_select();
CALL mdev16542_alter_force_and_show();
SELECT '# Setting @@global.mysql56_temporal_format=true' AS ``;
SET @@global.mysql56_temporal_format=true;
CALL mdev16542_create_select();
CALL mdev16542_alter_force_and_show();
SET SESSION debug_dbug="-d,sql_type";
END;
$$
DELIMITER ;$$
SET @@global.mysql56_temporal_format=true;
CREATE TABLE t1 (
a0 TIME,
a1 TIME(1),
a2 TIME(2),
a3 TIME(3),
a4 TIME(4),
a5 TIME(5),
a6 TIME(6)
);
CALL mdev16542;
DROP TABLE t1;
CREATE TABLE t1 (
a0 DATETIME,
a1 DATETIME(1),
a2 DATETIME(2),
a3 DATETIME(3),
a4 DATETIME(4),
a5 DATETIME(5),
a6 DATETIME(6)
);
CALL mdev16542;
DROP TABLE t1;
CREATE TABLE t1 (
a0 TIMESTAMP,
a1 TIMESTAMP(1),
a2 TIMESTAMP(2),
a3 TIMESTAMP(3),
a4 TIMESTAMP(4),
a5 TIMESTAMP(5),
a6 TIMESTAMP(6)
);
CALL mdev16542;
DROP TABLE t1;
SET @@global.mysql56_temporal_format=DEFAULT;
DROP PROCEDURE mdev16542;
DROP PROCEDURE mdev16542_create_select;
DROP PROCEDURE mdev16542_alter_force_and_show;
--echo #
--echo # End of 10.4 tests
--echo #
......@@ -10709,11 +10709,6 @@ Column_definition::Column_definition(THD *thd, Field *old_field,
key_length/= charset->mbmaxlen;
break;
case MYSQL_TYPE_STRING:
/* Change CHAR -> VARCHAR if dynamic record length */
if (old_field->type() == MYSQL_TYPE_VAR_STRING)
set_handler(&type_handler_varchar);
/* fall through */
case MYSQL_TYPE_ENUM:
case MYSQL_TYPE_SET:
case MYSQL_TYPE_VARCHAR:
......@@ -10761,6 +10756,8 @@ Column_definition::Column_definition(THD *thd, Field *old_field,
char_length= (uint)length;
type_handler()->Column_definition_implicit_upgrade(this);
/*
Copy the default (constant/function) from the column object orig_field, if
supplied. We do this if all these conditions are met:
......
......@@ -2184,6 +2184,12 @@ int show_create_table(THD *thd, TABLE_LIST *table_list, String *packet,
field->sql_type(type);
packet->append(type.ptr(), type.length(), system_charset_info);
DBUG_EXECUTE_IF("sql_type",
packet->append(" /* ");
packet->append(field->type_handler()->version().ptr());
packet->append(" */ ");
);
if (field->has_charset() && !(sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)))
{
if (field->charset() != share->table_charset)
......
......@@ -472,6 +472,11 @@ const Name
Type_handler_datetime_common::m_name_datetime(STRING_WITH_LEN("datetime")),
Type_handler_timestamp_common::m_name_timestamp(STRING_WITH_LEN("timestamp"));
const Name
Type_handler::m_version_default(STRING_WITH_LEN("")),
Type_handler::m_version_mariadb53(STRING_WITH_LEN("mariadb-5.3")),
Type_handler::m_version_mysql56(STRING_WITH_LEN("mysql-5.6"));
const Type_limits_int
Type_handler_tiny::m_limits_sint8= Type_limits_sint8(),
......@@ -6532,3 +6537,40 @@ bool Type_handler_decimal_result::Item_eq_value(THD *thd,
}
/***************************************************************************/
void Type_handler_var_string::
Column_definition_implicit_upgrade(Column_definition *c) const
{
// Change old VARCHAR to new VARCHAR
c->set_handler(&type_handler_varchar);
}
void Type_handler_time_common::
Column_definition_implicit_upgrade(Column_definition *c) const
{
if (opt_mysql56_temporal_format)
c->set_handler(&type_handler_time2);
else
c->set_handler(&type_handler_time);
}
void Type_handler_datetime_common::
Column_definition_implicit_upgrade(Column_definition *c) const
{
if (opt_mysql56_temporal_format)
c->set_handler(&type_handler_datetime2);
else
c->set_handler(&type_handler_datetime);
}
void Type_handler_timestamp_common::
Column_definition_implicit_upgrade(Column_definition *c) const
{
if (opt_mysql56_temporal_format)
c->set_handler(&type_handler_timestamp2);
else
c->set_handler(&type_handler_timestamp);
}
......@@ -1031,6 +1031,9 @@ class Information_schema_character_attributes
class Type_handler
{
protected:
static const Name m_version_default;
static const Name m_version_mysql56;
static const Name m_version_mariadb53;
String *print_item_value_csstr(THD *thd, Item *item, String *str) const;
String *print_item_value_temporal(THD *thd, Item *item, String *str,
const Name &type_name, String *buf) const;
......@@ -1096,6 +1099,7 @@ class Type_handler
const Type_handler *h2);
virtual const Name name() const= 0;
virtual const Name version() const { return m_version_default; }
virtual enum_field_types field_type() const= 0;
virtual enum_field_types real_field_type() const { return field_type(); }
/**
......@@ -1253,6 +1257,9 @@ class Type_handler
virtual Field *make_conversion_table_field(TABLE *TABLE,
uint metadata,
const Field *target) const= 0;
// Automatic upgrade, e.g. for ALTER TABLE t1 FORCE
virtual void Column_definition_implicit_upgrade(Column_definition *c) const
{ }
virtual bool Column_definition_fix_attributes(Column_definition *c) const= 0;
virtual bool Column_definition_prepare_stage1(THD *thd,
MEM_ROOT *mem_root,
......@@ -2878,6 +2885,7 @@ class Type_handler_time_common: public Type_handler_temporal_result
return Item_divisor_precision_increment_with_seconds(item);
}
const Type_handler *type_handler_for_comparison() const;
void Column_definition_implicit_upgrade(Column_definition *c) const;
bool Column_definition_fix_attributes(Column_definition *c) const;
bool Item_save_in_value(Item *item, st_value *value) const;
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
......@@ -2923,6 +2931,7 @@ class Type_handler_time: public Type_handler_time_common
public:
static uint hires_bytes(uint dec) { return m_hires_bytes[dec]; }
virtual ~Type_handler_time() {}
const Name version() const { return m_version_mariadb53; }
uint32 calc_pack_length(uint32 length) const;
Field *make_conversion_table_field(TABLE *, uint metadata,
const Field *target) const;
......@@ -2948,6 +2957,7 @@ class Type_handler_time2: public Type_handler_time_common
{
public:
virtual ~Type_handler_time2() {}
const Name version() const { return m_version_mysql56; }
enum_field_types real_field_type() const { return MYSQL_TYPE_TIME2; }
uint32 calc_pack_length(uint32 length) const;
Field *make_conversion_table_field(TABLE *, uint metadata,
......@@ -3082,6 +3092,7 @@ class Type_handler_datetime_common: public Type_handler_temporal_with_date
}
Item *create_typecast_item(THD *thd, Item *item,
const Type_cast_attributes &attr) const;
void Column_definition_implicit_upgrade(Column_definition *c) const;
bool Column_definition_fix_attributes(Column_definition *c) const;
uint Item_decimal_scale(const Item *item) const
{
......@@ -3115,6 +3126,7 @@ class Type_handler_datetime: public Type_handler_datetime_common
public:
static uint hires_bytes(uint dec) { return m_hires_bytes[dec]; }
virtual ~Type_handler_datetime() {}
const Name version() const { return m_version_mariadb53; }
uint32 calc_pack_length(uint32 length) const;
Field *make_conversion_table_field(TABLE *, uint metadata,
const Field *target) const;
......@@ -3140,6 +3152,7 @@ class Type_handler_datetime2: public Type_handler_datetime_common
{
public:
virtual ~Type_handler_datetime2() {}
const Name version() const { return m_version_mysql56; }
enum_field_types real_field_type() const { return MYSQL_TYPE_DATETIME2; }
uint32 calc_pack_length(uint32 length) const;
Field *make_conversion_table_field(TABLE *, uint metadata,
......@@ -3178,6 +3191,7 @@ class Type_handler_timestamp_common: public Type_handler_temporal_with_date
{
return true;
}
void Column_definition_implicit_upgrade(Column_definition *c) const;
bool Column_definition_fix_attributes(Column_definition *c) const;
uint Item_decimal_scale(const Item *item) const
{
......@@ -3211,6 +3225,7 @@ class Type_handler_timestamp: public Type_handler_timestamp_common
public:
static uint sec_part_bytes(uint dec) { return m_sec_part_bytes[dec]; }
virtual ~Type_handler_timestamp() {}
const Name version() const { return m_version_mariadb53; }
uint32 calc_pack_length(uint32 length) const;
Field *make_conversion_table_field(TABLE *, uint metadata,
const Field *target) const;
......@@ -3236,6 +3251,7 @@ class Type_handler_timestamp2: public Type_handler_timestamp_common
{
public:
virtual ~Type_handler_timestamp2() {}
const Name version() const { return m_version_mysql56; }
enum_field_types real_field_type() const { return MYSQL_TYPE_TIMESTAMP2; }
uint32 calc_pack_length(uint32 length) const;
Field *make_conversion_table_field(TABLE *, uint metadata,
......@@ -3436,6 +3452,7 @@ class Type_handler_var_string: public Type_handler_string
{
return varstring_type_handler(item);
}
void Column_definition_implicit_upgrade(Column_definition *c) const;
bool Column_definition_fix_attributes(Column_definition *c) const;
bool Column_definition_prepare_stage2(Column_definition *c,
handler *file,
......
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