diff options
author | Eugene Kosov <claprix@yandex.ru> | 2018-12-11 22:03:44 +0300 |
---|---|---|
committer | Eugene Kosov <claprix@yandex.ru> | 2018-12-11 22:03:44 +0300 |
commit | d956709b4be67f96a869d0854c75d10cd502172b (patch) | |
tree | d80f698842b9d9c6e9a07a4441257fa9e22027cd | |
parent | 4886d14827c69877e8d089ae7c7f178a9a54ad7a (diff) | |
download | mariadb-git-d956709b4be67f96a869d0854c75d10cd502172b.tar.gz |
MDEV-17833 ALTER TABLE is not enforcing prefix index size limit
ha_innobase::prepare_inplace_alter_table(): check max column length for every
index in a table, not just added in this particular ALTER TABLE with ADD INDEX ones.
-rw-r--r-- | mysql-test/suite/innodb/r/innodb-index.result | 33 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/innodb-index.test | 30 | ||||
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 5 | ||||
-rw-r--r-- | storage/xtradb/handler/handler0alter.cc | 5 |
4 files changed, 67 insertions, 6 deletions
diff --git a/mysql-test/suite/innodb/r/innodb-index.result b/mysql-test/suite/innodb/r/innodb-index.result index 3d5a0f840c1..681b07249b6 100644 --- a/mysql-test/suite/innodb/r/innodb-index.result +++ b/mysql-test/suite/innodb/r/innodb-index.result @@ -1180,3 +1180,36 @@ t2c CREATE TABLE `t2c` ( KEY `t2a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 DROP TABLE t1,t2,t2c,t2i; +SET @save_format = @@GLOBAL.innodb_file_format; +SET @save_prefix = @@GLOBAL.innodb_large_prefix; +SET GLOBAL innodb_file_format=barracuda; +SET GLOBAL innodb_large_prefix=ON; +CREATE TABLE t1 (c VARCHAR(1024), +c1 CHAR(255) NOT NULL,c2 CHAR(255) NOT NULL,c3 CHAR(255) NOT NULL, +c4 CHAR(255) NOT NULL,c5 CHAR(255) NOT NULL,c6 CHAR(255) NOT NULL, +c7 CHAR(255) NOT NULL,c8 CHAR(255) NOT NULL,c9 CHAR(255) NOT NULL, +ca CHAR(255) NOT NULL,cb CHAR(255) NOT NULL,cc CHAR(255) NOT NULL, +cd CHAR(255) NOT NULL,ce CHAR(255) NOT NULL,cf CHAR(255) NOT NULL, +d0 CHAR(255) NOT NULL,d1 CHAR(255) NOT NULL,d2 CHAR(255) NOT NULL, +d3 CHAR(255) NOT NULL,d4 CHAR(255) NOT NULL,d5 CHAR(255) NOT NULL, +d6 CHAR(255) NOT NULL,d7 CHAR(255) NOT NULL,d8 CHAR(255) NOT NULL, +d9 CHAR(255) NOT NULL,da CHAR(255) NOT NULL,db CHAR(255) NOT NULL, +dc CHAR(255) NOT NULL,dd CHAR(255) NOT NULL,de CHAR(255) NOT NULL, +UNIQUE KEY(c)) +ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +INSERT INTO t1 VALUES +(repeat('a',999),'','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''), +(CONCAT(repeat('a',999),'b'),'','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, algorithm=inplace; +ERROR HY000: Index column size too large. The maximum column size is 767 bytes. +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, algorithm=copy; +ERROR HY000: Index column size too large. The maximum column size is 767 bytes. +SELECT COUNT(*) FROM t1; +COUNT(*) +2 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET GLOBAL innodb_file_format=@save_format; +SET GLOBAL innodb_large_prefix=@save_prefix; diff --git a/mysql-test/suite/innodb/t/innodb-index.test b/mysql-test/suite/innodb/t/innodb-index.test index 8598647de66..d28930de815 100644 --- a/mysql-test/suite/innodb/t/innodb-index.test +++ b/mysql-test/suite/innodb/t/innodb-index.test @@ -563,3 +563,33 @@ DROP TABLE t1,t2,t2c,t2i; eval SET GLOBAL innodb_file_format=$innodb_file_format_orig; eval SET GLOBAL innodb_file_format_max=$innodb_file_format_max_orig; --enable_query_log + +SET @save_format = @@GLOBAL.innodb_file_format; +SET @save_prefix = @@GLOBAL.innodb_large_prefix; +SET GLOBAL innodb_file_format=barracuda; +SET GLOBAL innodb_large_prefix=ON; +CREATE TABLE t1 (c VARCHAR(1024), +c1 CHAR(255) NOT NULL,c2 CHAR(255) NOT NULL,c3 CHAR(255) NOT NULL, +c4 CHAR(255) NOT NULL,c5 CHAR(255) NOT NULL,c6 CHAR(255) NOT NULL, +c7 CHAR(255) NOT NULL,c8 CHAR(255) NOT NULL,c9 CHAR(255) NOT NULL, +ca CHAR(255) NOT NULL,cb CHAR(255) NOT NULL,cc CHAR(255) NOT NULL, +cd CHAR(255) NOT NULL,ce CHAR(255) NOT NULL,cf CHAR(255) NOT NULL, +d0 CHAR(255) NOT NULL,d1 CHAR(255) NOT NULL,d2 CHAR(255) NOT NULL, +d3 CHAR(255) NOT NULL,d4 CHAR(255) NOT NULL,d5 CHAR(255) NOT NULL, +d6 CHAR(255) NOT NULL,d7 CHAR(255) NOT NULL,d8 CHAR(255) NOT NULL, +d9 CHAR(255) NOT NULL,da CHAR(255) NOT NULL,db CHAR(255) NOT NULL, +dc CHAR(255) NOT NULL,dd CHAR(255) NOT NULL,de CHAR(255) NOT NULL, +UNIQUE KEY(c)) +ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +INSERT INTO t1 VALUES +(repeat('a',999),'','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''), +(CONCAT(repeat('a',999),'b'),'','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); +--error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, algorithm=inplace; +--error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE t1 ROW_FORMAT=REDUNDANT, algorithm=copy; +SELECT COUNT(*) FROM t1; +CHECK TABLE t1; +DROP TABLE t1; +SET GLOBAL innodb_file_format=@save_format; +SET GLOBAL innodb_large_prefix=@save_prefix; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 367601e1b33..6d9255a628e 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -3582,9 +3582,8 @@ check_if_ok_to_rename: /* Check each index's column length to make sure they do not exceed limit */ - for (ulint i = 0; i < ha_alter_info->index_add_count; i++) { - const KEY* key = &ha_alter_info->key_info_buffer[ - ha_alter_info->index_add_buffer[i]]; + for (ulint i = 0; i < ha_alter_info->key_count; i++) { + const KEY* key = &ha_alter_info->key_info_buffer[i]; if (key->flags & HA_FULLTEXT) { /* The column length does not matter for diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc index 0b7588918bc..9508adbbd12 100644 --- a/storage/xtradb/handler/handler0alter.cc +++ b/storage/xtradb/handler/handler0alter.cc @@ -3596,9 +3596,8 @@ check_if_ok_to_rename: /* Check each index's column length to make sure they do not exceed limit */ - for (ulint i = 0; i < ha_alter_info->index_add_count; i++) { - const KEY* key = &ha_alter_info->key_info_buffer[ - ha_alter_info->index_add_buffer[i]]; + for (ulint i = 0; i < ha_alter_info->key_count; i++) { + const KEY* key = &ha_alter_info->key_info_buffer[i]; if (key->flags & HA_FULLTEXT) { /* The column length does not matter for |