diff options
Diffstat (limited to 'mysql-test/main/alter_table.result')
-rw-r--r-- | mysql-test/main/alter_table.result | 393 |
1 files changed, 393 insertions, 0 deletions
diff --git a/mysql-test/main/alter_table.result b/mysql-test/main/alter_table.result index 8a2a9d21f35..c2c5813a100 100644 --- a/mysql-test/main/alter_table.result +++ b/mysql-test/main/alter_table.result @@ -2849,5 +2849,398 @@ DROP VIEW v1; DROP TABLE t3,t1,t2; SET DEFAULT_STORAGE_ENGINE= @save_default_engine; # +# MDEV-7318 RENAME INDEX +# +# +# 1) Tests for syntax and semantics of ALTER TABLE RENAME +# KEY/INDEX result. +# +# 1.a) Both RENAME KEY and RENAME INDEX variants should be +# allowed and produce expected results. +create table t1 (pk int primary key, i int, j int, key a(i)); +alter table t1 rename key a to b; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `b` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename index b to c; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# 1.b) It should be impossible to rename index that doesn't +# exists, dropped or added within the same ALTER TABLE. +alter table t1 rename key d to e; +ERROR 42000: Key 'd' doesn't exist in table 't1' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 drop key c, rename key c to d; +ERROR 42000: Key 'c' doesn't exist in table 't1' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 add key d(j), rename key d to e; +ERROR 42000: Key 'd' doesn't exist in table 't1' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# 1.c) It should be impossible to rename index to a name +# which is already used by another index, or is used +# by index which is added within the same ALTER TABLE. +alter table t1 add key d(j); +alter table t1 rename key c to d; +ERROR 42000: Duplicate key name 'd' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`i`), + KEY `d` (`j`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 drop key d; +alter table t1 add key d(j), rename key c to d; +ERROR 42000: Duplicate key name 'd' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# 1.d) It should be possible to rename index to a name +# which belongs to index which is dropped within the +# same ALTER TABLE. +alter table t1 add key d(j); +alter table t1 drop key c, rename key d to c; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`j`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# 1.e) We disallow renaming from/to PRIMARY as it might +# lead to some other key becoming "primary" internally, +# which will be interpreted as dropping/addition of +# primary key. +alter table t1 rename key primary to d; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'primary to d' at line 1 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`j`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# Even using 'funny' syntax. +alter table t1 rename key `primary` to d; +ERROR 42000: Incorrect index name 'primary' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`j`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename key c to primary; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'primary' at line 1 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`j`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename key c to `primary`; +ERROR 42000: Incorrect index name 'primary' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `pk` int(11) NOT NULL, + `i` int(11) DEFAULT NULL, + `j` int(11) DEFAULT NULL, + PRIMARY KEY (`pk`), + KEY `c` (`j`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; +# +# 2) More complex tests for semantics of ALTER TABLE. +# +# 2.a) Check that standalone RENAME KEY works as expected +# for unique and non-unique indexes. +create table t1 (a int, unique u(a), b int, key k(b)); +alter table t1 rename key u to uu; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + UNIQUE KEY `uu` (`a`), + KEY `k` (`b`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename key k to kk; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + UNIQUE KEY `uu` (`a`), + KEY `kk` (`b`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# 2.b) Check how that this clause can be mixed with other +# clauses which don't affect key or its columns. +alter table t1 rename key kk to kkk, add column c int; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + UNIQUE KEY `uu` (`a`), + KEY `kkk` (`b`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename key uu to uuu, add key c(c); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + UNIQUE KEY `uuu` (`a`), + KEY `kkk` (`b`), + KEY `c` (`c`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename key kkk to k, drop key uuu; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + KEY `k` (`b`), + KEY `c` (`c`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t1 rename key k to kk, rename to t2; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + KEY `kk` (`b`), + KEY `c` (`c`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t2; +# +# 3) Test coverage for handling of RENAME INDEX clause in +# various storage engines and using different ALTER +# algorithm. +# +# 3.a) Test coverage for simple storage engines (MyISAM/Heap). +create table t1 (i int, key k(i)) engine=myisam; +insert into t1 values (1); +create table t2 (i int, key k(i)) engine=memory; +insert into t2 values (1); +# MyISAM and Heap should be able to handle key renaming in-place. +alter table t1 algorithm=inplace, rename key k to kk; +alter table t2 algorithm=inplace, rename key k to kk; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + KEY `kk` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `i` int(11) DEFAULT NULL, + KEY `kk` (`i`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +# So by default in-place algorithm should be chosen. +# (ALTER TABLE should report 0 rows affected). +alter table t1 rename key kk to kkk; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +alter table t2 rename key kk to kkk; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + KEY `kkk` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `i` int(11) DEFAULT NULL, + KEY `kkk` (`i`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +# Copy algorithm should work as well. +alter table t1 algorithm=copy, rename key kkk to kkkk; +alter table t2 algorithm=copy, rename key kkk to kkkk; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + KEY `kkkk` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `i` int(11) DEFAULT NULL, + KEY `kkkk` (`i`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +# When renaming is combined with other in-place operation +# it still works as expected (i.e. works in-place). +alter table t1 algorithm=inplace, rename key kkkk to k, alter column i set default 100; +alter table t2 algorithm=inplace, rename key kkkk to k, alter column i set default 100; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT 100, + KEY `k` (`i`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `i` int(11) DEFAULT 100, + KEY `k` (`i`) +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +# Combining with non-inplace operation results in the whole ALTER +# becoming non-inplace. +alter table t1 algorithm=inplace, rename key k to kk, add column j int; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +alter table t2 algorithm=inplace, rename key k to kk, add column j int; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +drop table t1, t2; +# 3.b) Basic tests for InnoDB. More tests can be found in +# innodb.innodb_rename_index* +create table t1 (i int, key k(i)) engine=innodb; +insert into t1 values (1); +# Basic rename, inplace algorithm should be chosen +alter table t1 algorithm=inplace, rename key k to kk; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + KEY `kk` (`i`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +# copy algorithm should work as well. +alter table t1 algorithm=copy, rename key kk to kkk; +affected rows: 1 +info: Records: 1 Duplicates: 0 Warnings: 0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL, + KEY `kkk` (`i`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +drop table t1; +# +# 4) Additional coverage for complex cases in which code +# in ALTER TABLE comparing old and new table version +# got confused. +# +# Once InnoDB starts to support in-place index renaming the result +# of below statements should stay the same. Information about +# indexes returned by SHOW CREATE TABLE (from .FRM) and by +# InnoDB (from InnoDB data-dictionary) should be consistent. +# +create table t1 ( a int, b int, c int, d int, +primary key (a), index i1 (b), index i2 (c) ) engine=innodb; +alter table t1 add index i1 (d), rename index i1 to x; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + `d` int(11) DEFAULT NULL, + PRIMARY KEY (`a`), + KEY `x` (`b`), + KEY `i2` (`c`), + KEY `i1` (`d`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +select i.name as k, f.name as c from information_schema.innodb_sys_tables as t, +information_schema.innodb_sys_indexes as i, +information_schema.innodb_sys_fields as f +where t.name='test/t1' and t.table_id = i.table_id and i.index_id = f.index_id +order by k, c; +k c +i1 d +i2 c +PRIMARY a +x b +drop table t1; +create table t1 (a int, b int, c int, d int, +primary key (a), index i1 (b), index i2 (c)) engine=innodb; +alter table t1 add index i1 (d), rename index i1 to i2, drop index i2; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + `d` int(11) DEFAULT NULL, + PRIMARY KEY (`a`), + KEY `i2` (`b`), + KEY `i1` (`d`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +select i.name as k, f.name as c from information_schema.innodb_sys_tables as t, +information_schema.innodb_sys_indexes as i, +information_schema.innodb_sys_fields as f +where t.name='test/t1' and t.table_id = i.table_id and i.index_id = f.index_id +order by k, c; +k c +i1 d +i2 b +PRIMARY a +drop table t1; +# # End of 10.5 tests # |