diff --git a/mysql-test/suite/innodb/r/innodb_bug56632.result b/mysql-test/suite/innodb/r/innodb_bug56632.result new file mode 100644 index 00000000000..8236b37676b --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_bug56632.result @@ -0,0 +1,294 @@ +SET storage_engine=InnoDB; +SET GLOBAL innodb_file_format=`Barracuda`; +SET GLOBAL innodb_file_per_table=ON; +SET SESSION innodb_strict_mode = ON; +# Test 1) CREATE with ROW_FORMAT & KEY_BLOCK_SIZE, ALTER with neither +DROP TABLE IF EXISTS bug56632; +Warnings: +Note 1051 Unknown table 'bug56632' +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +ERROR HY000: Can't create table 'test.bug56632' (errno: 1478) +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: cannot specify ROW_FORMAT = COMPACT with KEY_BLOCK_SIZE. +Error 1005 Can't create table 'test.bug56632' (errno: 1478) +# Test 2) CREATE with ROW_FORMAT, ALTER with KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +Warnings: +Note 1051 Unknown table 'bug56632' +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT +ALTER TABLE bug56632 KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compressed row_format=COMPACT KEY_BLOCK_SIZE=1 +# Test 3) CREATE with KEY_BLOCK_SIZE, ALTER with ROW_FORMAT +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compressed KEY_BLOCK_SIZE=1 +ALTER TABLE bug56632 ROW_FORMAT=COMPACT; +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compressed KEY_BLOCK_SIZE=1 +# Test 4) CREATE with neither, ALTER with ROW_FORMAT & KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ); +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact +ALTER TABLE bug56632 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact +# Test 5) CREATE with KEY_BLOCK_SIZE=3 (invalid). +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +ERROR HY000: Can't create table 'test.bug56632' (errno: 1478) +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: invalid KEY_BLOCK_SIZE = 3. Valid values are [1, 2, 4, 8, 16] +Error 1005 Can't create table 'test.bug56632' (errno: 1478) +SET SESSION innodb_strict_mode = OFF; +# Test 6) CREATE with ROW_FORMAT & KEY_BLOCK_SIZE, ALTER with neither +DROP TABLE IF EXISTS bug56632; +Warnings: +Note 1051 Unknown table 'bug56632' +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT KEY_BLOCK_SIZE=1 +ALTER TABLE bug56632 ADD COLUMN f1 INT; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL, + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT KEY_BLOCK_SIZE=1 +# Test 7) CREATE with ROW_FORMAT, ALTER with KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT +ALTER TABLE bug56632 KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compressed row_format=COMPACT KEY_BLOCK_SIZE=1 +# Test 8) CREATE with KEY_BLOCK_SIZE, ALTER with ROW_FORMAT +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compressed KEY_BLOCK_SIZE=1 +ALTER TABLE bug56632 ROW_FORMAT=COMPACT; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT KEY_BLOCK_SIZE=1 +# Test 9) CREATE with neither, ALTER with ROW_FORMAT & KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ); +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact +ALTER TABLE bug56632 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1 unless ROW_FORMAT=COMPRESSED. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT KEY_BLOCK_SIZE=1 +# Test 10) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither. +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=3 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact KEY_BLOCK_SIZE=3 +ALTER TABLE bug56632 ADD COLUMN f1 INT; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL, + `f1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=3 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact KEY_BLOCK_SIZE=3 +# Test 11) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with ROW_FORMAT=COMPACT. +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=3 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact KEY_BLOCK_SIZE=3 +ALTER TABLE bug56632 ROW_FORMAT=COMPACT; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=3 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact row_format=COMPACT KEY_BLOCK_SIZE=3 +# Test 12) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with KEY_BLOCK_SIZE=1. +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +Warnings: +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=3. +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=3 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compact KEY_BLOCK_SIZE=3 +ALTER TABLE bug56632 KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +Level Code Message +SHOW CREATE TABLE bug56632; +Table Create Table +bug56632 CREATE TABLE `bug56632` ( + `i` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=1 +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +bug56632 Compressed KEY_BLOCK_SIZE=1 +# Cleanup +DROP TABLE IF EXISTS bug56632; diff --git a/mysql-test/suite/innodb/t/innodb_bug56632.test b/mysql-test/suite/innodb/t/innodb_bug56632.test new file mode 100644 index 00000000000..60703814da2 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_bug56632.test @@ -0,0 +1,216 @@ +# +# Bug#56632: ALTER TABLE implicitly changes ROW_FORMAT to COMPRESSED +# http://bugs.mysql.com/56632 +# +# Innodb automatically uses compressed mode when the KEY_BLOCK_SIZE +# parameter is used, except if the ROW_FORMAT is also specified, in +# which case the KEY_BLOCK_SIZE is ignored and a warning is shown. +# But Innodb was getting confused when neither of those parameters +# was used on the ALTER statement after they were both used on the +# CREATE. +# +# This will test the results of all 4 combinations of these two +# parameters of the CREATE and ALTER. +# +# Tests 1-5 use INNODB_STRICT_MODE=1 which returns an error +# if there is anything wrong with the statement. +# +# 1) CREATE with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1, ALTER with neither. +# Result; CREATE; fails with error ER_CANT_CREATE_TABLE +# 2) CREATE with ROW_FORMAT=COMPACT, ALTER with KEY_BLOCK_SIZE=1 +# Result; CREATE succeeds, +# ALTER quietly converts ROW_FORMAT to compressed. +# 3) CREATE with KEY_BLOCK_SIZE=1, ALTER with ROW_FORMAT=COMPACT +# Result; CREATE quietly converts ROW_FORMAT to compressed, +# ALTER fails with error ER_CANT_CREATE_TABLE. +# 4) CREATE with neither, ALTER with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1 +# Result; CREATE succeeds, +# ALTER; fails with error ER_CANT_CREATE_TABLE +# 5) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither. +# Result; CREATE; fails with error ER_CANT_CREATE_TABLE +# +# Tests 6-11 use INNODB_STRICT_MODE=0 which automatically makes +# adjustments if the prameters are incompatible. +# +# 6) CREATE with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1, ALTER with neither. +# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE is ignored. +# ALTER succeeds, no warnings. +# 7) CREATE with ROW_FORMAT=COMPACT, ALTER with KEY_BLOCK_SIZE=1 +# Result; CREATE succeeds, +# ALTER quietly converts ROW_FORMAT to compressed. +# 8) CREATE with KEY_BLOCK_SIZE=1, ALTER with ROW_FORMAT=COMPACT +# Result; CREATE quietly converts ROW_FORMAT to compressed, +# ALTER succeeds, warns that KEY_BLOCK_SIZE is ignored. +# 9) CREATE with neither, ALTER with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1 +# Result; CREATE succeeds, +# ALTER succeeds, warns that KEY_BLOCK_SIZE is ignored. +# 10) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither. +# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE=3 is ignored. +# ALTER succeeds, warns that KEY_BLOCK_SIZE=3 is ignored. +# 11) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with ROW_FORMAT=COMPACT. +# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE=3 is ignored. +# ALTER succeeds, warns that KEY_BLOCK_SIZE=3 is ignored. +# 12) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with KEY_BLOCK_SIZE=1. +# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE=3 is ignored. +# ALTER succeeds, quietly converts ROW_FORMAT to compressed. + +-- source include/have_innodb.inc + +SET storage_engine=InnoDB; + +--disable_query_log +# These values can change during the test +LET $innodb_file_format_orig=`select @@innodb_file_format`; +LET $innodb_file_format_max_orig=`select @@innodb_file_format_max`; +LET $innodb_file_per_table_orig=`select @@innodb_file_per_table`; +LET $innodb_strict_mode_orig=`select @@session.innodb_strict_mode`; +--enable_query_log + +SET GLOBAL innodb_file_format=`Barracuda`; +SET GLOBAL innodb_file_per_table=ON; + +# Innodb strict mode will cause an error on the CREATE or ALTER when; +# 1. both ROW_FORMAT=COMPACT and KEY_BLOCK_SIZE=1, +# 2. KEY_BLOCK_SIZE is not a valid number (0,1,2,4,8,16). +# With innodb_strict_mode = OFF, These errors are corrected +# and just a warning is returned. +SET SESSION innodb_strict_mode = ON; + +--echo # Test 1) CREATE with ROW_FORMAT & KEY_BLOCK_SIZE, ALTER with neither +DROP TABLE IF EXISTS bug56632; +--error ER_CANT_CREATE_TABLE +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +SHOW WARNINGS; + +--echo # Test 2) CREATE with ROW_FORMAT, ALTER with KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 3) CREATE with KEY_BLOCK_SIZE, ALTER with ROW_FORMAT +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +--disable_result_log +--error ER_CANT_CREATE_TABLE +ALTER TABLE bug56632 ROW_FORMAT=COMPACT; +--enable_result_log +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 4) CREATE with neither, ALTER with ROW_FORMAT & KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ); +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +--disable_result_log +--error ER_CANT_CREATE_TABLE +ALTER TABLE bug56632 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +--enable_result_log +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 5) CREATE with KEY_BLOCK_SIZE=3 (invalid). +DROP TABLE IF EXISTS bug56632; +--error ER_CANT_CREATE_TABLE +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +SHOW WARNINGS; + +SET SESSION innodb_strict_mode = OFF; + +--echo # Test 6) CREATE with ROW_FORMAT & KEY_BLOCK_SIZE, ALTER with neither +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 ADD COLUMN f1 INT; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 7) CREATE with ROW_FORMAT, ALTER with KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) ROW_FORMAT=COMPACT; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 8) CREATE with KEY_BLOCK_SIZE, ALTER with ROW_FORMAT +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 ROW_FORMAT=COMPACT; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 9) CREATE with neither, ALTER with ROW_FORMAT & KEY_BLOCK_SIZE +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ); +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 10) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither. +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 ADD COLUMN f1 INT; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 11) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with ROW_FORMAT=COMPACT. +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 ROW_FORMAT=COMPACT; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Test 12) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with KEY_BLOCK_SIZE=1. +DROP TABLE IF EXISTS bug56632; +CREATE TABLE bug56632 ( i INT ) KEY_BLOCK_SIZE=3; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; +ALTER TABLE bug56632 KEY_BLOCK_SIZE=1; +SHOW WARNINGS; +SHOW CREATE TABLE bug56632; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 'bug56632'; + +--echo # Cleanup +DROP TABLE IF EXISTS bug56632; + +--disable_query_log +EVAL SET GLOBAL innodb_file_per_table=$innodb_file_per_table_orig; +EVAL SET GLOBAL innodb_file_format_max=$innodb_file_format_max_orig; +EVAL SET GLOBAL innodb_file_format=$innodb_file_format_orig; +EVAL SET SESSION innodb_strict_mode=$innodb_strict_mode_orig; +--enable_query_log + diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 567cbca868e..21afe2d0bee 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -6556,8 +6556,8 @@ create_options_are_valid( ? "COMPRESSED" : "DYNAMIC"; - /* These two ROW_FORMATs require - srv_file_per_table and srv_file_format */ + /* These two ROW_FORMATs require srv_file_per_table + and srv_file_format > Antelope */ if (!srv_file_per_table) { push_warning_printf( thd, @@ -6567,7 +6567,6 @@ create_options_are_valid( " requires innodb_file_per_table.", row_format_name); ret = FALSE; - } if (srv_file_format < DICT_TF_FORMAT_ZIP) { @@ -6766,6 +6765,8 @@ ha_innobase::create( ulint ssize, ksize; ulint key_block_size = create_info->key_block_size; + /* Set 'flags' to the correct key_block_size. + It will be zero if key_block_size is an invalid number.*/ for (ssize = ksize = 1; ssize <= DICT_TF_ZSSIZE_MAX; ssize++, ksize <<= 1) { if (key_block_size == ksize) { @@ -6806,10 +6807,10 @@ ha_innobase::create( row_type = form->s->row_type; if (flags) { - /* KEY_BLOCK_SIZE was specified. */ - if (!(create_info->used_fields & HA_CREATE_USED_ROW_FORMAT)) { - /* ROW_FORMAT was not specified; - default to ROW_FORMAT=COMPRESSED */ + /* if KEY_BLOCK_SIZE was specified on this statement and + ROW_FORMAT was not, automatically change ROW_FORMAT to COMPRESSED.*/ + if ( (create_info->used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE) + && !(create_info->used_fields & HA_CREATE_USED_ROW_FORMAT)) { row_type = ROW_TYPE_COMPRESSED; } else if (row_type != ROW_TYPE_COMPRESSED) { /* ROW_FORMAT other than COMPRESSED @@ -6828,7 +6829,7 @@ ha_innobase::create( flags = 0; } } else { - /* No KEY_BLOCK_SIZE */ + /* flags == 0 means no KEY_BLOCK_SIZE.*/ if (row_type == ROW_TYPE_COMPRESSED) { /* ROW_FORMAT=COMPRESSED without KEY_BLOCK_SIZE implies half the