--echo # --echo # WL#8697: Invisible Indexes --echo # SET SESSION information_schema_stats_expiry=0; --echo # Test of ALTER INDEX syntax. CREATE TABLE t1 ( a INT, KEY (a) ); SHOW KEYS FROM t1; ALTER TABLE t1 ALTER INDEX a INVISIBLE; SHOW KEYS FROM t1; ALTER TABLE t1 ALTER INDEX a VISIBLE; SHOW KEYS FROM t1; DROP TABLE t1; --echo # Test of CREATE INDEX syntax with invisible indexes. CREATE TABLE t1 ( a INT, b INT ); CREATE INDEX a_invisible ON t1(a) INVISIBLE; CREATE INDEX b_visible ON t1(a) VISIBLE; CREATE INDEX a_b_invisible ON t1(a, b) INVISIBLE; --replace_column 7 X SHOW INDEXES FROM t1; DROP TABLE t1; --echo # Test that invisible indexes are not used. CREATE TABLE t1 ( a INT, KEY (a) ); CREATE TABLE t2 ( a INT, KEY (a) INVISIBLE ); INSERT INTO t1 VALUES (1), (2), (3), (4), (5); INSERT INTO t2 SELECT * FROM t1; ANALYZE TABLE t1, t2; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t1; ALTER TABLE t1 ALTER INDEX a INVISIBLE; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t1; ALTER TABLE t1 ALTER INDEX a VISIBLE; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t1; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t2; ALTER TABLE t2 ALTER INDEX a VISIBLE; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t2; DROP TABLE t1, t2; --echo # Test that renaming an index does not change visibility and vice versa. CREATE TABLE t1 ( a INT, INDEX (a), b INT, INDEX (b) INVISIBLE ); --replace_column 7 X SHOW INDEXES FROM t1; ALTER TABLE t1 RENAME INDEX a TO a1; --replace_column 10 X 11 X ALTER TABLE t1 RENAME INDEX b TO b1; --replace_column 7 X SHOW INDEXES FROM t1; ALTER TABLE t1 ALTER INDEX a1 INVISIBLE; ALTER TABLE t1 ALTER INDEX b1 VISIBLE; --replace_column 7 X SHOW INDEXES FROM t1; DROP TABLE t1; --echo # Test of SHOW CREATE TABLE. CREATE TABLE t1 ( a INT, b INT, c INT, INDEX (a) VISIBLE, INDEX (b) INVISIBLE, INDEX (c) ); SHOW CREATE TABLE t1; DROP TABLE t1; --echo # Test that primary key indexes can't be made invisible. --error ER_PK_INDEX_CANT_BE_INVISIBLE CREATE TABLE t1 ( a INT, PRIMARY KEY (a) INVISIBLE ); --error ER_PARSE_ERROR CREATE TABLE t1 ( a INT PRIMARY KEY INVISIBLE ); --error ER_PARSE_ERROR CREATE TABLE t1 ( a INT KEY INVISIBLE ); --error ER_PARSE_ERROR ALTER TABLE t1 ALTER INDEX PRIMARY INVISIBLE; --error ER_PK_INDEX_CANT_BE_INVISIBLE ALTER TABLE t1 ADD PRIMARY KEY (a) INVISIBLE; --echo # --echo # Currently we allow to name the primary key index, but the name is --echo # silently changed to PRIMARY. If this behavior changes in the future, --echo # we need to take some additional measures to rule out invisible primary --echo # key indexes. The below two tests serve as triggers for such a change. --echo # CREATE TABLE t1( a INT ); ALTER TABLE t1 ADD CONSTRAINT pk PRIMARY KEY (a); --replace_column 7 X SHOW INDEXES FROM t1; DROP TABLE t1; CREATE TABLE t1( a INT, PRIMARY KEY pk (a) ); --replace_column 7 X SHOW INDEXES FROM t1; DROP TABLE t1; CREATE TABLE t1 ( a INT, KEY (a), b INT, KEY (b) INVISIBLE ); --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 RENAME INDEX no_such_index TO x; --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 ALTER INDEX no_such_index INVISIBLE; --echo # --echo # Repeated alter actions. Should work. --echo # ALTER TABLE t1 ALTER INDEX a INVISIBLE, ALTER INDEX a VISIBLE; ALTER TABLE t1 ALTER INDEX a INVISIBLE, ALTER INDEX b VISIBLE; --replace_column 7 X SHOW INDEXES FROM t1; --echo # --echo # Various combinations of RENAME INDEX and ALTER INDEX ... INVISIBLE. --echo # --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 RENAME INDEX a TO x, RENAME INDEX x TO a; --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 RENAME INDEX a TO x, ALTER INDEX x INVISIBLE; --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 RENAME INDEX a TO x, ALTER INDEX a VISIBLE; --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 ALTER INDEX a VISIBLE, RENAME INDEX a TO x; --echo # --echo # Various algorithms and their effects. --echo # INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3); ANALYZE TABLE t1; --enable_info ALTER TABLE t1 ALTER INDEX a INVISIBLE, ALGORITHM = COPY; --disable_info ANALYZE TABLE t1; --replace_column 7 X SHOW INDEXES FROM t1; --enable_info ALTER TABLE t1 ALTER INDEX a VISIBLE, ALGORITHM = INPLACE; --disable_info ANALYZE TABLE t1; --replace_column 7 X SHOW INDEXES FROM t1; --enable_info ALTER TABLE t1 ALTER INDEX a INVISIBLE, ALGORITHM = DEFAULT; --disable_info ANALYZE TABLE t1; --replace_column 7 X SHOW INDEXES FROM t1; --enable_info ALTER TABLE t1 ALTER INDEX a VISIBLE; --disable_info ANALYZE TABLE t1; --replace_column 7 X SHOW INDEXES FROM t1; --error ER_KEY_DOES_NOT_EXITS ALTER TABLE t1 ADD INDEX ab(a, b), ALTER INDEX ab INVISIBLE; DROP TABLE t1; --echo # --echo # Test that constraints implemented by the indexes are still enforced --echo # while the index is invisible. --echo # CREATE TABLE t1 ( a INT, UNIQUE KEY (a) INVISIBLE ); CREATE TABLE t2 ( a INT UNIQUE ); CREATE TABLE t3 ( a INT NOT NULL, KEY (a) INVISIBLE, b INT PRIMARY KEY ); CREATE TABLE t4 ( a INT NOT NULL, UNIQUE KEY (a) INVISIBLE, b INT PRIMARY KEY AUTO_INCREMENT ); CREATE TABLE t5 ( a INT, b INT, c INT, UNIQUE KEY (a, b, c) INVISIBLE ); INSERT INTO t1 VALUES (1); --error ER_DUP_ENTRY INSERT INTO t1 VALUES (1); ALTER TABLE t2 ALTER INDEX a INVISIBLE; INSERT INTO t2 VALUES (1); --error ER_DUP_ENTRY INSERT INTO t2 VALUES (1); --error ER_BAD_NULL_ERROR INSERT INTO t3(a) VALUES (NULL); --error ER_BAD_NULL_ERROR INSERT INTO t4(a) VALUES (NULL); INSERT INTO t4(a) VALUES (1); --error ER_DUP_ENTRY INSERT INTO t4(a) VALUES (1); INSERT INTO t5 VALUES (1, 2, 3); --error ER_DUP_ENTRY INSERT INTO t5 VALUES (1, 2, 3); DROP TABLE t1, t2, t3, t4, t5; --echo # --echo # Bug#23256900: WL#8697: ASSERTION --echo # `TABLE_SHARE->IS_MISSING_PRIMARY_KEY() ...` FAILED. --echo # --echo # Test for when an index is implicitly promoted to primary key index. --echo # The first NOT NULL UNIQUE index is candidate for promotion. --echo # These indexes can't be invisible, either. CREATE TABLE t1 ( a INT NOT NULL, UNIQUE KEY (a) ); --error ER_PK_INDEX_CANT_BE_INVISIBLE ALTER TABLE t1 ALTER INDEX a INVISIBLE; --replace_column 7 X 10 X 11 X EXPLAIN SELECT * FROM t1; SELECT * FROM t1; DROP TABLE t1; --echo # The first NOT NULL UNIQUE index may of course be invisible if it is --echo # not promoted. CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL PRIMARY KEY, UNIQUE KEY (a) INVISIBLE ); --replace_column 7 X SHOW INDEXES FROM t1; DROP TABLE t1; --echo # The check above applies only to the first NOT NULL UNIQUE index. CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL, UNIQUE KEY (a), UNIQUE KEY (b) INVISIBLE ); --replace_column 7 X SHOW INDEXES FROM t1; DROP TABLE t1; --error ER_PK_INDEX_CANT_BE_INVISIBLE CREATE TABLE t1 ( a INT NOT NULL, UNIQUE KEY (a) INVISIBLE ); --echo # --echo # Bug#23264435: WL#8697: FULLTEXT INDEXES CANNOT BE MADE INVISIBLE --echo # CREATE TABLE t1 ( a INT NOT NULL, KEY (a) INVISIBLE, b INT NOT NULL UNIQUE ); CREATE TABLE t2 ( a INT PRIMARY KEY, b INT, INDEX(b) INVISIBLE); ALTER TABLE t2 ALTER INDEX b VISIBLE; DROP TABLE t1, t2; CREATE TEMPORARY TABLE t1 ( a INT, KEY (a) INVISIBLE ); --replace_column 7 X SHOW INDEXES FROM t1; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t1; DROP TABLE t1; #--echo # #--echo # Invisible spatial indexes. #--echo # #CREATE TABLE t1 ( # fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, # g GEOMETRY NOT NULL SRID 0, # SPATIAL KEY(g) #); # #ANALYZE TABLE t1; # #--disable_query_log #let $1=150; #let $2=150; #while ($1) #{ # eval INSERT INTO t1 (g) VALUES (ST_GeomFromText('LineString($1 $1, $2 $2)')); # dec $1; # inc $2; #} #--enable_query_log # #let $query= #EXPLAIN SELECT * #FROM t1 #WHERE ST_Within(g, # ST_GeomFromText('Polygon((140 140,160 140,160 160,140 140))')); # #--echo # There appears to be a bug causing the cardinality number to fluctuate #--echo # for spatial indexes. #--eval $query #ALTER TABLE t1 ALTER INDEX g INVISIBLE; #SHOW INDEXES FROM t1; #--eval $query # #DROP TABLE t1; #--echo # #--echo # Test of invisible fulltext indexes. #--echo # #CREATE TABLE t1 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)); #INSERT INTO t1 VALUES('Some data', 'for full-text search'); #ANALYZE TABLE t1; # #let $query1= SELECT * FROM t1 WHERE MATCH(a, b) AGAINST ("collections"); #let $query2= #SELECT * FROM t1 WHERE MATCH(a, b) AGAINST ("collections" IN BOOLEAN MODE); # #--eval EXPLAIN $query1 #--eval EXPLAIN $query2 #ALTER TABLE t1 ALTER INDEX a INVISIBLE; #SHOW INDEXES FROM t1; #--disable_abort_on_error #--eval EXPLAIN $query1 #--eval EXPLAIN $query2 #--eval $query1 #--eval $query2 #--enable_abort_on_error # #DROP TABLE t1; --echo # --echo # Invisible indexes on AUTO_INCREMENT columns. --echo # CREATE TABLE t1 ( a INT AUTO_INCREMENT, KEY ( a ) ); INSERT INTO t1 VALUES (), (), (); ANALYZE TABLE t1; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t1; ALTER TABLE t1 ALTER INDEX a INVISIBLE; --replace_column 7 X SHOW INDEXES FROM t1; --replace_column 7 X 10 X 11 X EXPLAIN SELECT a FROM t1; DROP TABLE t1; --echo # --echo # Bug#24660093: REMOVING AN INVISIBLE INDEX BREAKS EXPLAIN --echo # CREATE TABLE t1 ( a INT, KEY(a) INVISIBLE ); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 FORCE INDEX(a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 FORCE INDEX FOR JOIN (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 FORCE INDEX FOR ORDER BY (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 FORCE INDEX FOR GROUP BY (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 USE INDEX(a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 USE INDEX FOR JOIN (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 USE INDEX FOR ORDER BY (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 USE INDEX FOR GROUP BY (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 IGNORE INDEX(a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 IGNORE INDEX FOR JOIN (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 IGNORE INDEX FOR ORDER BY (a); --error ER_KEY_DOES_NOT_EXITS SELECT * FROM t1 IGNORE INDEX FOR GROUP BY (a); DROP TABLE t1;