mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-7318 RENAME INDEX
This patch adds support of RENAME INDEX operation to the ALTER TABLE statement. Code which determines if ALTER TABLE can be done in-place for "simple" storage engines like MyISAM, Heap and etc. was updated to handle ALTER TABLE ... RENAME INDEX as an in-place operation. Support for in-place ALTER TABLE ... RENAME INDEX for InnoDB was covered by MDEV-13301. Syntax changes ============== A new type of <alter_specification> is added: <rename index clause> ::= RENAME ( INDEX | KEY ) <oldname> TO <newname> Where <oldname> and <newname> are identifiers for old name and new name of the index. Semantic changes ================ The result of "ALTER TABLE t1 RENAME INDEX a TO b" is a table which contents and structure are identical to the old version of 't1' with the only exception index 'a' being called 'b'. Neither <oldname> nor <newname> can be "primary". The index being renamed should exist and its new name should not be occupied by another index on the same table. Related to: WL#6555, MDEV-13301
This commit is contained in:
538
mysql-test/suite/innodb/t/innodb_rename_index.test
Normal file
538
mysql-test/suite/innodb/t/innodb_rename_index.test
Normal file
@ -0,0 +1,538 @@
|
||||
--source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# Test "ALTER TABLE ... RENAME INDEX" in InnoDB
|
||||
#
|
||||
|
||||
let create =
|
||||
CREATE TABLE t (
|
||||
a INT,
|
||||
b INT,
|
||||
c INT,
|
||||
d INT,
|
||||
e INT,
|
||||
f INT,
|
||||
PRIMARY KEY (a),
|
||||
INDEX i1 (b),
|
||||
INDEX i2 (c),
|
||||
INDEX i3 (d),
|
||||
INDEX i4 (e)
|
||||
) ENGINE=INNODB;
|
||||
|
||||
let insert = INSERT INTO t SET a = 1;
|
||||
|
||||
let show_table =
|
||||
SHOW CREATE TABLE t;
|
||||
|
||||
let show_sys =
|
||||
SELECT
|
||||
t.name AS table_name,
|
||||
i.name AS index_name,
|
||||
f.name AS column_name
|
||||
FROM
|
||||
information_schema.innodb_sys_tables t,
|
||||
information_schema.innodb_sys_indexes i,
|
||||
information_schema.innodb_sys_fields f
|
||||
WHERE
|
||||
t.name LIKE '%/t' AND
|
||||
t.table_id = i.table_id AND
|
||||
i.index_id = f.index_id
|
||||
ORDER BY 1, 2, 3;
|
||||
|
||||
-- eval $create
|
||||
|
||||
# Add a row, so that affected rows would be nonzero for ALGORITHM=COPY.
|
||||
# ALGORITHM=INPLACE will report 0 affected row in the result file.
|
||||
# We will have enable_info/disable_info around every successful ALTER
|
||||
# to enable the affected rows: output in the result file.
|
||||
-- eval $insert
|
||||
|
||||
-- error ER_WRONG_NAME_FOR_INDEX
|
||||
ALTER TABLE t RENAME INDEX i1 TO GEN_CLUST_INDEX;
|
||||
|
||||
# Test all combinations of ADD w, DROP x, RENAME y TO z.
|
||||
#
|
||||
# Use the following names for wxyz (with 1 to 4 of wxyz being the same):
|
||||
# aaaa abcd aabb abab abba abcc acbc accb cacb cabc ccab aaab aaba abaa baaa
|
||||
#
|
||||
# Some cases should trivially succeed or fail. Test them in isolation:
|
||||
# no-op: y=z (RENAME y TO y)
|
||||
# rules out the combinations ..\(.\)\1
|
||||
# a.k.a. aaaa aabb abcc abaa baaa
|
||||
|
||||
# We use the index names i1 to i4 for existing indexes abcd.
|
||||
# Non-existing index names will be aa,bb,cc,dd.
|
||||
# Index creation on non-existing columns will not be tested.
|
||||
|
||||
ALTER TABLE t RENAME INDEX i1 TO i1;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t RENAME INDEX aa TO aa;
|
||||
|
||||
-- echo # combination: aaaa
|
||||
# drop/add existing, null rename and drop the same
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i4(f), DROP INDEX i4, RENAME INDEX i4 TO i4;
|
||||
|
||||
-- echo # combination: aabb
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX aa, RENAME INDEX i2 TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX aa, RENAME INDEX bb TO bb;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i1, RENAME INDEX bb TO bb;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i1, RENAME INDEX i2 TO i2;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: abcc
|
||||
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX bb, RENAME INDEX cc TO cc;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX bb, RENAME INDEX i3 TO i3;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX cc TO cc;
|
||||
|
||||
# rename existing (succeeds)
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX i3 TO i3;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: abaa
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i1, RENAME INDEX aa TO aa;
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX i1 TO i1;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX bb, RENAME INDEX i1 TO i1;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX bb, RENAME INDEX aa TO aa;
|
||||
|
||||
-- echo # combination: baaa
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i2(f), DROP INDEX i1, RENAME INDEX i1 TO i1;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX bb(f), DROP INDEX i1, RENAME INDEX i1 TO i1;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i2(f), DROP INDEX aa, RENAME INDEX aa TO aa;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX bb(f), DROP INDEX aa, RENAME INDEX aa TO aa;
|
||||
|
||||
# refuse: w=z (ADD w, RENAME y TO w)
|
||||
# rules out the combinations \(.\)..\1
|
||||
# a.k.a. aaaa abba cabc aaba abaa
|
||||
# the case w=y (ADD w, RENAME w to z) may succeed, as seen below
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), RENAME INDEX aa TO bb;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), RENAME INDEX bb TO aa;
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX aa(f), RENAME INDEX i2 TO aa;
|
||||
|
||||
# rename existing, add one with the same name
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i1(f), RENAME INDEX i1 TO bb;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: abba
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX i2 TO i1;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX i2 TO aa;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX bb, RENAME INDEX bb TO i1;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX bb, RENAME INDEX bb TO aa;
|
||||
|
||||
-- echo # combination: cabc
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX i1, RENAME INDEX i2 TO i3;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX aa, RENAME INDEX i2 TO i3;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX i1, RENAME INDEX bb TO i3;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX aa, RENAME INDEX bb TO i3;
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX i1, RENAME INDEX i2 TO cc;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX aa, RENAME INDEX i2 TO cc;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX i1, RENAME INDEX bb TO cc;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX aa, RENAME INDEX bb TO cc;
|
||||
|
||||
# refuse: x=y (DROP x, RENAME x TO z)
|
||||
# rules out the combinations .\(.\)\1.
|
||||
# a.k.a. aaaa abba accb aaab baaa
|
||||
|
||||
# rename and drop the same
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t DROP INDEX i1, RENAME INDEX i1 TO bb;
|
||||
# drop non-existing
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t DROP INDEX aa, RENAME INDEX i2 TO aa;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t DROP INDEX aa, RENAME INDEX aa TO i2;
|
||||
|
||||
# this one will succeed (drop, replace with an existing one)
|
||||
-- enable_info
|
||||
ALTER TABLE t DROP INDEX i1, RENAME INDEX i4 TO i1;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: accb
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i3, RENAME INDEX i3 TO i2;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i3, RENAME INDEX i3 TO bb;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX cc, RENAME INDEX cc TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX cc, RENAME INDEX cc TO bb;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX cc, RENAME INDEX cc TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX cc, RENAME INDEX cc TO bb;
|
||||
|
||||
-- echo # combination: aaab
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i1, RENAME INDEX i1 TO i2;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i1, RENAME INDEX i1 TO bb;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i1, RENAME INDEX i1 TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX aa, RENAME INDEX aa TO bb;
|
||||
|
||||
# Remaining combinations: abcd abab acbc cacb ccab
|
||||
|
||||
-- echo # combination: abcd
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX cc TO i4;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX cc TO dd;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX cc TO i4;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX cc TO dd;
|
||||
|
||||
# add existing, rename to existing
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX i3 TO i4;
|
||||
# add existing
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX i3 TO dd;
|
||||
# rename to existing
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX i3 TO i4;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX i3 TO dd;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: abab
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i2, RENAME INDEX i1 TO i2;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX bb, RENAME INDEX i1 TO bb;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i2, RENAME INDEX aa TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX bb, RENAME INDEX aa TO bb;
|
||||
|
||||
-- echo # combination: acbc
|
||||
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX cc, RENAME INDEX i2 TO cc;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX cc, RENAME INDEX i2 TO cc;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX cc, RENAME INDEX bb TO cc;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX cc, RENAME INDEX bb TO cc;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i3, RENAME INDEX bb TO i3;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i3, RENAME INDEX bb TO i3;
|
||||
|
||||
# add existing
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i1(f), DROP INDEX i3, RENAME INDEX i2 TO i3;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX aa(f), DROP INDEX i3, RENAME INDEX i2 TO i3;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: cacb
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX i1, RENAME INDEX cc TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX aa, RENAME INDEX cc TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX aa, RENAME INDEX cc TO bb;
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX i1, RENAME INDEX cc TO bb;
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX i1, RENAME INDEX i3 TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX aa, RENAME INDEX i3 TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX aa, RENAME INDEX i3 TO bb;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX i1, RENAME INDEX i3 TO bb;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- echo # combination: ccab
|
||||
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX cc, RENAME INDEX i1 TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX cc, RENAME INDEX i1 TO bb;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX cc, RENAME INDEX aa TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX cc(f), DROP INDEX cc, RENAME INDEX aa TO bb;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX cc, RENAME INDEX aa TO i2;
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX cc, RENAME INDEX aa TO bb;
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX i3, RENAME INDEX i1 TO i2;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i3(f), DROP INDEX i3, RENAME INDEX i1 TO bb;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
# A simple successful ALTER
|
||||
-- enable_info
|
||||
ALTER TABLE t RENAME INDEX i1 TO x;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t RENAME INDEX i1 TO i2;
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t RENAME INDEX foo TO i1;
|
||||
|
||||
# Test ADD INDEX, RENAME INDEX
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i9 (f), RENAME INDEX i1 TO i8;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD INDEX i1 (f), RENAME INDEX i1 TO i9;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
DROP TABLE t;
|
||||
-- eval $create
|
||||
-- eval $insert
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t ADD INDEX foo (f), RENAME INDEX i1 TO foo;
|
||||
|
||||
# Test ADD INDEX, RENAME INDEX, DROP INDEX
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t ADD INDEX i1 (f), RENAME INDEX i1 TO foo, DROP INDEX i1;
|
||||
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t ADD INDEX i1 (f), RENAME INDEX i1 TO foo, DROP INDEX foo;
|
||||
|
||||
-- error ER_CANT_DROP_FIELD_OR_KEY
|
||||
# "ALTER TABLE t ADD INDEX foo (d), DROP INDEX foo;" alone fails with the
|
||||
# same error code, but we have that test here anyway
|
||||
ALTER TABLE t ADD INDEX foo (f), RENAME INDEX foo TO bar, DROP INDEX foo;
|
||||
|
||||
# Test RENAME INDEX, RENAME INDEX
|
||||
|
||||
-- error ER_DUP_KEYNAME
|
||||
ALTER TABLE t RENAME INDEX i1 TO x, RENAME INDEX i2 TO x;
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t RENAME INDEX i1 TO x, RENAME INDEX i1 TO y;
|
||||
|
||||
-- error ER_KEY_DOES_NOT_EXITS
|
||||
ALTER TABLE t RENAME INDEX i1 TO x, RENAME INDEX i1 TO x;
|
||||
|
||||
# show that the table did not change after all the erroneous ALTERs
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
|
||||
DROP TABLE t;
|
||||
|
||||
# now test the rebuild case (new clustered index)
|
||||
|
||||
CREATE TABLE t (
|
||||
c1 INT NOT NULL,
|
||||
c2 INT NOT NULL,
|
||||
c3 INT,
|
||||
c4 INT,
|
||||
PRIMARY KEY (c1),
|
||||
INDEX i1 (c3),
|
||||
INDEX i2 (c4)
|
||||
) ENGINE=INNODB;
|
||||
|
||||
INSERT INTO t SET c1=1, c2=2;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t DROP PRIMARY KEY, ADD PRIMARY KEY (c2), RENAME INDEX i1 TO x;
|
||||
-- disable_info
|
||||
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t RENAME INDEX i2 TO y, ROW_FORMAT=REDUNDANT;
|
||||
-- disable_info
|
||||
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
|
||||
DROP TABLE t;
|
||||
|
||||
# a case where the PK does not exist prior to the ALTER TABLE command
|
||||
|
||||
CREATE TABLE t (
|
||||
c1 INT NOT NULL,
|
||||
c2 INT,
|
||||
c3 INT,
|
||||
INDEX i1 (c2),
|
||||
INDEX i2 (c3)
|
||||
) ENGINE=INNODB;
|
||||
|
||||
INSERT INTO t SET c1=1;
|
||||
|
||||
-- enable_info
|
||||
ALTER TABLE t ADD PRIMARY KEY (c1), RENAME INDEX i1 TO x;
|
||||
-- disable_info
|
||||
-- eval $show_table
|
||||
-- eval $show_sys
|
||||
|
||||
DROP TABLE t;
|
||||
|
||||
# Test repeated RENAMEs with alternating names
|
||||
|
||||
CREATE TABLE t (a INT, INDEX iiiii (a)) ENGINE=INNODB;
|
||||
INSERT INTO t SET a=NULL;
|
||||
-- enable_info
|
||||
ALTER TABLE t RENAME INDEX iiiii TO i;
|
||||
ALTER TABLE t RENAME INDEX i TO iiiii;
|
||||
ALTER TABLE t RENAME INDEX iiiii TO i;
|
||||
ALTER TABLE t RENAME INDEX i TO iiiii;
|
||||
-- disable_info
|
||||
DROP TABLE t;
|
||||
|
||||
# Below is a shell script to generate the full set of ALTER TABLE
|
||||
# DROP/ADD/RENAME combinations. The generated .sql file is 3.3MB and
|
||||
# executes in about 7 minutes.
|
||||
#
|
||||
##!/bin/sh
|
||||
#
|
||||
#create="
|
||||
#CREATE TABLE t (
|
||||
# a INT,
|
||||
# b INT,
|
||||
# c INT,
|
||||
# d INT,
|
||||
# PRIMARY KEY (a),
|
||||
# INDEX i1 (b),
|
||||
# INDEX i2 (c)
|
||||
#) ENGINE=INNODB;
|
||||
#"
|
||||
#
|
||||
#echo "DROP TABLE IF EXISTS t;"
|
||||
#for r in "" ", DROP PRIMARY KEY, ADD PRIMARY KEY (a)" ", ROW_FORMAT=REDUNDANT" ; do
|
||||
# for i1 in i1 i1noexist; do
|
||||
# for i2 in i2 i2noexist; do
|
||||
# for i3 in i3 i3noexist; do
|
||||
# for i4 in i4 i4noexist; do
|
||||
# for a in $i1 $i2 $i3 $i4; do
|
||||
# for b in $i1 $i2 $i3 $i4; do
|
||||
# for c in $i1 $i2 $i3 $i4; do
|
||||
# for d in $i1 $i2 $i3 $i4; do
|
||||
# echo "$create"
|
||||
# echo "ALTER TABLE t ADD INDEX $a (d), RENAME INDEX $b TO $c, DROP INDEX $d $r;"
|
||||
# echo "DROP TABLE t;"
|
||||
# done
|
||||
# done
|
||||
# done
|
||||
# done
|
||||
# done
|
||||
# done
|
||||
# done
|
||||
# done
|
||||
#done
|
Reference in New Issue
Block a user