diff --git a/mysql-test/suite/tianmu/r/alter_table_null.result b/mysql-test/suite/tianmu/r/alter_table_null.result new file mode 100644 index 0000000000..eda7a2890c --- /dev/null +++ b/mysql-test/suite/tianmu/r/alter_table_null.result @@ -0,0 +1,155 @@ +create database alter_table_null; +use alter_table_null; +CREATE TABLE `alter_table_null_test` ( +`c_tinyint` tinyint DEFAULT NULL COMMENT 'tinyint', +`c_smallint` smallint NOT NULL COMMENT 'smallint', +`c_mediumint` mediumint DEFAULT NULL COMMENT 'mediumint', +`c_int` int DEFAULT NULL COMMENT 'int', +`c_bigint` bigint DEFAULT NULL COMMENT 'bigint', +`c_float` float DEFAULT NULL COMMENT 'float', +`c_double` double DEFAULT NULL COMMENT 'double', +`c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', +`c_date` date DEFAULT NULL COMMENT 'date', +`c_datetime` datetime DEFAULT NULL COMMENT 'datetime', +`c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', +`c_time` time DEFAULT NULL COMMENT 'time', +`c_char` char(10) DEFAULT NULL COMMENT 'char', +`c_varchar` varchar(10) DEFAULT NULL COMMENT 'varchar', +`c_blob` blob COMMENT 'blob', +`c_text` text COMMENT 'text', +`c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +show create table alter_table_null_test; +Table Create Table +alter_table_null_test CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint(4) DEFAULT NULL COMMENT 'tinyint', + `c_smallint` smallint(6) NOT NULL COMMENT 'smallint', + `c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint', + `c_int` int(11) DEFAULT NULL COMMENT 'int', + `c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COLLATE utf8mb4_unicode_ci COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +alter table alter_table_null_test modify c_smallint smallint NOT NULL; +show create table alter_table_null_test; +Table Create Table +alter_table_null_test CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint(4) DEFAULT NULL COMMENT 'tinyint', + `c_smallint` smallint(6) NOT NULL, + `c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint', + `c_int` int(11) DEFAULT NULL COMMENT 'int', + `c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COLLATE utf8mb4_unicode_ci COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +insert into alter_table_null_test(c_tinyint,c_smallint,c_mediumint,c_int,c_bigint,c_float,c_double,c_decimal,c_date,c_datetime,c_timestamp,c_time,c_char,c_varchar,c_text) +values(105,105,105,105,105,5.2,10.88,105.083,'2016-02-25','2016-02-25 10:20:01','2016-02-25 05:20:01','10:20:01','stoneatom1','hello1','bcdefghijklmn'); +show create table alter_table_null_test; +Table Create Table +alter_table_null_test CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint(4) DEFAULT NULL COMMENT 'tinyint', + `c_smallint` smallint(6) NOT NULL, + `c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint', + `c_int` int(11) DEFAULT NULL COMMENT 'int', + `c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COLLATE utf8mb4_unicode_ci COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +show create table alter_table_null_test; +Table Create Table +alter_table_null_test CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint(4) DEFAULT NULL COMMENT 'tinyint', + `c_smallint` smallint(6) NOT NULL, + `c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint', + `c_int` int(11) DEFAULT NULL COMMENT 'int', + `c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COLLATE utf8mb4_unicode_ci COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +alter table alter_table_null_test modify c_tinyint tinyint NOT NULL; +show create table alter_table_null_test; +Table Create Table +alter_table_null_test CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint(4) NOT NULL, + `c_smallint` smallint(6) NOT NULL, + `c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint', + `c_int` int(11) DEFAULT NULL COMMENT 'int', + `c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COLLATE utf8mb4_unicode_ci COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +insert into alter_table_null_test(c_tinyint,c_smallint,c_mediumint,c_int,c_bigint,c_float,c_double,c_decimal,c_date,c_datetime,c_timestamp,c_time,c_char,c_varchar,c_text) +values(105,105,105,105,105,5.2,10.88,105.083,'2016-02-25','2016-02-25 10:20:01','2016-02-25 05:20:01','10:20:01','stoneatom1','hello1','bcdefghijklmn'); +show create table alter_table_null_test; +Table Create Table +alter_table_null_test CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint(4) NOT NULL, + `c_smallint` smallint(6) NOT NULL, + `c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint', + `c_int` int(11) DEFAULT NULL COMMENT 'int', + `c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COLLATE utf8mb4_unicode_ci COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +drop table alter_table_null_test; +drop database alter_table_null; diff --git a/mysql-test/suite/tianmu/t/alter_table_null.test b/mysql-test/suite/tianmu/t/alter_table_null.test new file mode 100644 index 0000000000..52135ad695 --- /dev/null +++ b/mysql-test/suite/tianmu/t/alter_table_null.test @@ -0,0 +1,60 @@ +--source include/have_tianmu.inc + +# +#ALTER TABLE table_name NOT NULL to NULL or NULL to NOT NULL ... +# +create database alter_table_null; +use alter_table_null; + +CREATE TABLE `alter_table_null_test` ( + `c_tinyint` tinyint DEFAULT NULL COMMENT 'tinyint', + `c_smallint` smallint NOT NULL COMMENT 'smallint', + `c_mediumint` mediumint DEFAULT NULL COMMENT 'mediumint', + `c_int` int DEFAULT NULL COMMENT 'int', + `c_bigint` bigint DEFAULT NULL COMMENT 'bigint', + `c_float` float DEFAULT NULL COMMENT 'float', + `c_double` double DEFAULT NULL COMMENT 'double', + `c_decimal` decimal(10,5) DEFAULT NULL COMMENT 'decimal', + `c_date` date DEFAULT NULL COMMENT 'date', + `c_datetime` datetime DEFAULT NULL COMMENT 'datetime', + `c_timestamp` timestamp NULL DEFAULT NULL COMMENT 'timestamp', + `c_time` time DEFAULT NULL COMMENT 'time', + `c_char` char(10) DEFAULT NULL COMMENT 'char', + `c_varchar` varchar(10) DEFAULT NULL COMMENT 'varchar', + `c_blob` blob COMMENT 'blob', + `c_text` text COMMENT 'text', + `c_longblob` longblob COMMENT 'longblob' +) ENGINE=TIANMU DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +# +#ALTER TABLE: NOT NULL to NULL +# + +show create table alter_table_null_test; + +alter table alter_table_null_test modify c_smallint smallint NOT NULL; + +show create table alter_table_null_test; + +insert into alter_table_null_test(c_tinyint,c_smallint,c_mediumint,c_int,c_bigint,c_float,c_double,c_decimal,c_date,c_datetime,c_timestamp,c_time,c_char,c_varchar,c_text) +values(105,105,105,105,105,5.2,10.88,105.083,'2016-02-25','2016-02-25 10:20:01','2016-02-25 05:20:01','10:20:01','stoneatom1','hello1','bcdefghijklmn'); + +show create table alter_table_null_test; + +# +#ALTER TABLE: NULL to NOT NULL +# + +show create table alter_table_null_test; + +alter table alter_table_null_test modify c_tinyint tinyint NOT NULL; + +show create table alter_table_null_test; + +insert into alter_table_null_test(c_tinyint,c_smallint,c_mediumint,c_int,c_bigint,c_float,c_double,c_decimal,c_date,c_datetime,c_timestamp,c_time,c_char,c_varchar,c_text) +values(105,105,105,105,105,5.2,10.88,105.083,'2016-02-25','2016-02-25 10:20:01','2016-02-25 05:20:01','10:20:01','stoneatom1','hello1','bcdefghijklmn'); + +show create table alter_table_null_test; + +drop table alter_table_null_test; +drop database alter_table_null; diff --git a/storage/tianmu/handler/tianmu_handler.cpp b/storage/tianmu/handler/tianmu_handler.cpp index d848a27959..93f0153cc6 100644 --- a/storage/tianmu/handler/tianmu_handler.cpp +++ b/storage/tianmu/handler/tianmu_handler.cpp @@ -1535,6 +1535,10 @@ enum_alter_inplace_result ha_tianmu::check_if_supported_inplace_alter([[maybe_un // support alter table column default if (ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_DEFAULT) DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); + // support alter table NULL to NOT NULL or NOT NULL to NULL + if (ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_NULLABLE || + ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE) + DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_ERROR); }