mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 20:36:16 +01:00 
			
		
		
		
	This includes all test changes from
"Changing all cost calculation to be given in milliseconds"
and forwards.
Some of the things that caused changes in the result files:
- As part of fixing tests, I added 'echo' to some comments to be able to
  easier find out where things where wrong.
- MATERIALIZED has now a higher cost compared to X than before. Because
  of this some MATERIALIZED types have changed to DEPENDEND SUBQUERY.
  - Some test cases that required MATERIALIZED to repeat a bug was
    changed by adding more rows to force MATERIALIZED to happen.
- 'Filtered' in SHOW EXPLAIN has in many case changed from 100.00 to
  something smaller. This is because now filtered also takes into
  account the smallest possible ref access and filters, even if they
  where not used. Another reason for 'Filtered' being smaller is that
  we now also take into account implicit filtering done for subqueries
  using FIRSTMATCH.
  (main.subselect_no_exists_to_in)
  This is caluculated in best_access_path() and stored in records_out.
- Table orders has changed because more accurate costs.
- 'index' and 'ALL' for small tables has changed to use 'range' or
   'ref' because of optimizer_scan_setup_cost.
- index can be changed to 'range' as 'range' optimizer assumes we don't
  have to read the blocks from disk that range optimizer has already read.
  This can be confusing in the case where there is no obvious where clause
  but instead there is a hidden 'key_column > NULL' added by the optimizer.
  (main.subselect_no_exists_to_in)
- Scan on primary clustered key does not report 'Using Index' anymore
  (It's a table scan, not an index scan).
- For derived tables, the number of rows is now 100 instead of 2,
  which can be seen in EXPLAIN.
- More tests have "Using index for group by" as the cost of this
  optimization is now more correct (lower).
- A primary key could be preferred for a normal key, even if it would
  access more rows, as it's faster to do 1 lokoup and 3 'index_next' on a
  clustered primary key than one lookup trough a secondary.
  (main.stat_tables_innodb)
Notes:
- There was a 4.7% more calls to best_extension_by_limited_search() in
  the main.greedy_optimizer test.  However examining the test results
  it looked that the plans where slightly better (eq_ref where more
  chained together) so I assume this is ok.
- I have verified a few test cases where there was notable/unexpected
  changes in the plan and in all cases the new optimizer plans where
  faster.  (main.greedy_optimizer and some others)
		
	
			
		
			
				
	
	
		
			528 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			528 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#
 | 
						|
# MDEV-7317: Make an index ignorable to the optimizer
 | 
						|
#
 | 
						|
# Test of ALTER INDEX syntax.
 | 
						|
CREATE TABLE t1 ( a INT, KEY (a) );
 | 
						|
SHOW KEYS FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED;
 | 
						|
SHOW KEYS FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED;
 | 
						|
SHOW KEYS FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
DROP TABLE t1;
 | 
						|
# Test of CREATE INDEX syntax with IGNORED indexes.
 | 
						|
CREATE TABLE t1 ( a INT, b INT );
 | 
						|
CREATE INDEX a_ignorable ON t1(a) IGNORED;
 | 
						|
CREATE INDEX b_not_ignorable ON t1(a) NOT IGNORED;
 | 
						|
Warnings:
 | 
						|
Note	1831	Duplicate index `b_not_ignorable`. This is deprecated and will be disallowed in a future release
 | 
						|
CREATE INDEX a_b_ignorable ON t1(a, b) IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a_ignorable	1	a	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
t1	1	b_not_ignorable	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	a_b_ignorable	1	a	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
t1	1	a_b_ignorable	2	b	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
DROP TABLE t1;
 | 
						|
# Test that IGNORED indexes are not used.
 | 
						|
CREATE TABLE t1 ( a INT, KEY (a) );
 | 
						|
CREATE TABLE t2 ( a INT, KEY (a) IGNORED );
 | 
						|
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
 | 
						|
INSERT INTO t2 SELECT * FROM t1;
 | 
						|
ANALYZE TABLE t1, t2;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	OK
 | 
						|
test.t2	analyze	status	Engine-independent statistics collected
 | 
						|
test.t2	analyze	status	Table is already up to date
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	a	5	NULL	5	Using index
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED;
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	5	
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED;
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	a	5	NULL	5	Using index
 | 
						|
EXPLAIN SELECT a FROM t2;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	5	
 | 
						|
ALTER TABLE t2 ALTER INDEX a NOT IGNORED;
 | 
						|
EXPLAIN SELECT a FROM t2;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t2	index	NULL	a	5	NULL	5	Using index
 | 
						|
DROP TABLE t1, t2;
 | 
						|
# Test that renaming an index does not change ignorability and vice versa.
 | 
						|
CREATE TABLE t1 (
 | 
						|
a INT, INDEX (a),
 | 
						|
b INT, INDEX (b) IGNORED
 | 
						|
);
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	b	1	b	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 RENAME INDEX a TO a1;
 | 
						|
ALTER TABLE t1 RENAME INDEX b TO b1;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a1	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	b1	1	b	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ALTER INDEX a1 IGNORED;
 | 
						|
ALTER TABLE t1 ALTER INDEX b1 NOT IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a1	1	a	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
t1	1	b1	1	b	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
DROP TABLE t1;
 | 
						|
# Test of SHOW CREATE TABLE.
 | 
						|
CREATE TABLE t1 (
 | 
						|
a INT,
 | 
						|
b INT,
 | 
						|
c INT,
 | 
						|
INDEX (a) NOT IGNORED,
 | 
						|
INDEX (b) IGNORED,
 | 
						|
INDEX (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,
 | 
						|
  KEY `a` (`a`),
 | 
						|
  KEY `b` (`b`) IGNORED,
 | 
						|
  KEY `c` (`c`)
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
DROP TABLE t1;
 | 
						|
# Test that primary key indexes can't be made ignorable.
 | 
						|
CREATE TABLE t1 ( a INT, PRIMARY KEY (a) IGNORED );
 | 
						|
ERROR HY000: A primary key cannot be marked as IGNORE
 | 
						|
CREATE TABLE t1 ( a INT PRIMARY KEY IGNORED );
 | 
						|
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 'IGNORED )' at line 1
 | 
						|
CREATE TABLE t1 ( a INT KEY IGNORED );
 | 
						|
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 'IGNORED )' at line 1
 | 
						|
ALTER TABLE t1 ALTER INDEX PRIMARY IGNORED;
 | 
						|
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 IGNORED' at line 1
 | 
						|
CREATE TABLE t1(a INT NOT NULL);
 | 
						|
ALTER TABLE t1 ADD PRIMARY KEY (a) IGNORED;
 | 
						|
ERROR HY000: A primary key cannot be marked as IGNORE
 | 
						|
DROP TABLE t1;
 | 
						|
CREATE TABLE t1 (
 | 
						|
a INT, KEY (a),
 | 
						|
b INT, KEY (b) IGNORED
 | 
						|
);
 | 
						|
ALTER TABLE t1 RENAME INDEX no_such_index TO x;
 | 
						|
ERROR 42000: Key 'no_such_index' doesn't exist in table 't1'
 | 
						|
ALTER TABLE t1 ALTER INDEX no_such_index IGNORED;
 | 
						|
ERROR 42000: Key 'no_such_index' doesn't exist in table 't1'
 | 
						|
DROP TABLE t1;
 | 
						|
CREATE TABLE t1 (
 | 
						|
a INT, KEY (a),
 | 
						|
b INT, KEY (b) IGNORED
 | 
						|
);
 | 
						|
ALTER TABLE t1 RENAME INDEX no_such_index TO x;
 | 
						|
ERROR 42000: Key 'no_such_index' doesn't exist in table 't1'
 | 
						|
ALTER TABLE t1 ALTER INDEX no_such_index IGNORED;
 | 
						|
ERROR 42000: Key 'no_such_index' doesn't exist in table 't1'
 | 
						|
#
 | 
						|
# Repeated alter actions. Should work.
 | 
						|
#
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED, ALTER INDEX a NOT IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	b	1	b	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED, ALTER INDEX b IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	b	1	b	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
#
 | 
						|
# Various combinations of RENAME INDEX and ALTER INDEX ... IGNORED.
 | 
						|
#
 | 
						|
ALTER TABLE t1 RENAME INDEX a TO x, RENAME INDEX x TO a;
 | 
						|
ERROR 42000: Key 'x' doesn't exist in table 't1'
 | 
						|
ALTER TABLE t1 RENAME INDEX a TO x, ALTER INDEX x IGNORED;
 | 
						|
ERROR 42000: Key 'x' doesn't exist in table 't1'
 | 
						|
ALTER TABLE t1 RENAME INDEX a TO x, ALTER INDEX a NOT IGNORED;
 | 
						|
ERROR 42000: Key 'a' doesn't exist in table 't1'
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED, RENAME INDEX a TO x;
 | 
						|
ERROR 42000: Key 'a' doesn't exist in table 't1'
 | 
						|
#
 | 
						|
# Various algorithms and their effects.
 | 
						|
#
 | 
						|
INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3);
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	OK
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED, ALGORITHM = COPY;
 | 
						|
affected rows: 3
 | 
						|
info: Records: 3  Duplicates: 0  Warnings: 0
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	OK
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	3	NULL	NULL	YES	BTREE			YES
 | 
						|
t1	1	b	1	b	A	3	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED, ALGORITHM = INPLACE;
 | 
						|
affected rows: 0
 | 
						|
info: Records: 0  Duplicates: 0  Warnings: 0
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	Table is already up to date
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	3	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	b	1	b	A	3	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED, ALGORITHM = DEFAULT;
 | 
						|
affected rows: 0
 | 
						|
info: Records: 0  Duplicates: 0  Warnings: 0
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	Table is already up to date
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	3	NULL	NULL	YES	BTREE			YES
 | 
						|
t1	1	b	1	b	A	3	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED;
 | 
						|
affected rows: 0
 | 
						|
info: Records: 0  Duplicates: 0  Warnings: 0
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	Table is already up to date
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	3	NULL	NULL	YES	BTREE			NO
 | 
						|
t1	1	b	1	b	A	3	NULL	NULL	YES	BTREE			YES
 | 
						|
ALTER TABLE t1 ADD INDEX ab(a, b), ALTER INDEX ab IGNORED;
 | 
						|
ERROR 42000: Key 'ab' doesn't exist in table 't1'
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# The first NOT NULL UNIQUE index may of course be IGNORED if it is
 | 
						|
# not promoted to a primary key
 | 
						|
#
 | 
						|
CREATE TABLE t1 (
 | 
						|
a INT NOT NULL,
 | 
						|
b INT NOT NULL PRIMARY KEY,
 | 
						|
UNIQUE KEY (a) IGNORED
 | 
						|
);
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	0	PRIMARY	1	b	A	0	NULL	NULL		BTREE			NO
 | 
						|
t1	0	a	1	a	A	0	NULL	NULL		BTREE			YES
 | 
						|
DROP TABLE t1;
 | 
						|
# 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) IGNORED
 | 
						|
);
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	0	a	1	a	A	0	NULL	NULL		BTREE			NO
 | 
						|
t1	0	b	1	b	A	0	NULL	NULL		BTREE			YES
 | 
						|
DROP TABLE t1;
 | 
						|
CREATE TABLE t1 ( a INT NOT NULL, UNIQUE KEY (a) IGNORED);
 | 
						|
ERROR HY000: A primary key cannot be marked as IGNORE
 | 
						|
CREATE TEMPORARY TABLE t1 ( a INT, KEY (a) IGNORED);
 | 
						|
INSERT INTO t1 VALUES (0), (1), (2), (3);
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	4	
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED;
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	a	5	NULL	4	Using index
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# IGNORED fulltext indexes.
 | 
						|
#
 | 
						|
CREATE TABLE t1 (a VARCHAR(200), b TEXT, FULLTEXT (a,b));
 | 
						|
INSERT INTO t1 VALUES('Some data', 'for full-text search'),("hello","hello world"),("mars","here I come");
 | 
						|
SELECT * FROM t1 WHERE MATCH(a, b) AGAINST ("search");
 | 
						|
a	b
 | 
						|
Some data	for full-text search
 | 
						|
EXPLAIN SELECT * FROM t1 WHERE MATCH(a, b) AGAINST ("search");
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	fulltext	a	a	0		1	Using where
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED;
 | 
						|
SELECT * FROM t1 WHERE MATCH(a, b) AGAINST ("search");
 | 
						|
ERROR HY000: Can't find FULLTEXT index matching the column list
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# IGNORED indexes on AUTO_INCREMENT columns.
 | 
						|
#
 | 
						|
CREATE TABLE t1 ( a INT AUTO_INCREMENT, KEY ( a ) );
 | 
						|
INSERT INTO t1 VALUES (), (), ();
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	OK
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	a	4	NULL	3	Using index
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	a	1	a	A	3	NULL	NULL		BTREE			YES
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	3	
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# IGNORED spatial indexes
 | 
						|
#
 | 
						|
CREATE TABLE t1 (
 | 
						|
fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 | 
						|
g GEOMETRY NOT NULL,
 | 
						|
SPATIAL KEY key1(g)
 | 
						|
);
 | 
						|
EXPLAIN SELECT fid, AsText(g) FROM t1
 | 
						|
WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	range	key1	key1	34	NULL	8	Using where
 | 
						|
ALTER TABLE t1 ALTER INDEX key1 IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	0	PRIMARY	1	fid	A	150	NULL	NULL		BTREE			NO
 | 
						|
t1	1	key1	1	g	A	NULL	32	NULL		SPATIAL			YES
 | 
						|
EXPLAIN SELECT fid, AsText(g) FROM t1
 | 
						|
WHERE Within(g, GeomFromText('Polygon((140 140,160 140,160 160,140 160,140 140))'));
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	150	Using where
 | 
						|
DROP TABLE t1;
 | 
						|
CREATE TABLE t1 ( a INT GENERATED ALWAYS AS (1), KEY key1(a));
 | 
						|
INSERT INTO t1 VALUES (),(),();
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	key1	1	a	A	NULL	NULL	NULL	YES	BTREE			NO
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	key1	5	NULL	3	Using index
 | 
						|
ALTER TABLE t1 ALTER INDEX key1 IGNORED;
 | 
						|
SHOW INDEXES FROM t1;
 | 
						|
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment	Ignored
 | 
						|
t1	1	key1	1	a	A	NULL	NULL	NULL	YES	BTREE			YES
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	3	
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# Partitioning on keys with an IGNORED index, IGNORED indexes over
 | 
						|
# partitioned tables.
 | 
						|
#
 | 
						|
CREATE TABLE t1 (
 | 
						|
a CHAR(2) NOT NULL,
 | 
						|
b CHAR(2) NOT NULL,
 | 
						|
c INT(10) UNSIGNED NOT NULL,
 | 
						|
d VARCHAR(255) DEFAULT NULL,
 | 
						|
e VARCHAR(1000) DEFAULT NULL,
 | 
						|
KEY (a) IGNORED,
 | 
						|
KEY (b)
 | 
						|
) PARTITION BY KEY (a) PARTITIONS 20;
 | 
						|
INSERT INTO t1 (a, b, c, d, e) VALUES
 | 
						|
('07', '03', 343, '1', '07_03_343'),
 | 
						|
('01', '04', 343, '2', '01_04_343'),
 | 
						|
('01', '06', 343, '3', '01_06_343'),
 | 
						|
('01', '07', 343, '4', '01_07_343'),
 | 
						|
('01', '08', 343, '5', '01_08_343'),
 | 
						|
('01', '09', 343, '6', '01_09_343'),
 | 
						|
('03', '03', 343, '7', '03_03_343'),
 | 
						|
('03', '06', 343, '8', '03_06_343'),
 | 
						|
('03', '07', 343, '9', '03_07_343'),
 | 
						|
('04', '03', 343, '10', '04_03_343'),
 | 
						|
('04', '06', 343, '11', '04_06_343'),
 | 
						|
('05', '03', 343, '12', '05_03_343'),
 | 
						|
('11', '03', 343, '13', '11_03_343'),
 | 
						|
('11', '04', 343, '14', '11_04_343');
 | 
						|
ANALYZE TABLE t1;
 | 
						|
Table	Op	Msg_type	Msg_text
 | 
						|
test.t1	analyze	status	Engine-independent statistics collected
 | 
						|
test.t1	analyze	status	OK
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	14	
 | 
						|
EXPLAIN SELECT b FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	b	2	NULL	14	Using index
 | 
						|
EXPLAIN SELECT * FROM t1 WHERE a = '04';
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 | 
						|
ALTER TABLE t1 ALTER INDEX a NOT IGNORED;
 | 
						|
EXPLAIN SELECT a FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	a	2	NULL	14	Using index
 | 
						|
EXPLAIN SELECT * FROM t1 WHERE a = '04';
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ref	a	a	2	const	2	Using where
 | 
						|
ALTER TABLE t1 ALTER INDEX b IGNORED;
 | 
						|
EXPLAIN SELECT b FROM t1;
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	14	
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# Using FORCE INDEX for an IGNORED index
 | 
						|
#
 | 
						|
CREATE TABLE t1(a INT, key k1(a));
 | 
						|
INSERT INTO t1 VALUES (1),(2),(3);
 | 
						|
EXPLAIN SELECT * FROM t1 FORCE INDEX(k1);
 | 
						|
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | 
						|
1	SIMPLE	t1	index	NULL	k1	5	NULL	3	Using index
 | 
						|
ALTER TABLE t1 ALTER INDEX k1 IGNORED;
 | 
						|
SHOW CREATE TABLE t1;
 | 
						|
Table	Create Table
 | 
						|
t1	CREATE TABLE `t1` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  KEY `k1` (`a`) IGNORED
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
EXPLAIN SELECT * FROM t1 FORCE INDEX(k1);
 | 
						|
ERROR 42000: Key 'k1' doesn't exist in table 't1'
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# MDEV-25075: Ignorable index makes the resulting CREATE TABLE invalid
 | 
						|
#
 | 
						|
CREATE TABLE t1 (a INT, KEY (a));
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED;
 | 
						|
show create table t1;
 | 
						|
Table	Create Table
 | 
						|
t1	CREATE TABLE `t1` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  KEY `a` (`a`) IGNORED
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
DROP TABLE t1;
 | 
						|
CREATE TABLE t1 ( a INT, KEY (a) IGNORED);
 | 
						|
show create table t1;
 | 
						|
Table	Create Table
 | 
						|
t1	CREATE TABLE `t1` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  KEY `a` (`a`) IGNORED
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
# Tests to check usage of IGNORED keyword
 | 
						|
#
 | 
						|
CREATE TABLE IGNORED(a INT);
 | 
						|
DROP TABLE IGNORED;
 | 
						|
CREATE TABLE t1(a INT);
 | 
						|
SELECT * FROM t1 IGNORED;
 | 
						|
a
 | 
						|
CREATE FUNCTION f1(a INT) RETURNS INT
 | 
						|
BEGIN
 | 
						|
DECLARE IGNORED INT DEFAULT 0;
 | 
						|
RETURN 0;
 | 
						|
END|
 | 
						|
CREATE FUNCTION f2(a INT) RETURNS INT
 | 
						|
BEGIN
 | 
						|
DECLARE IGNORED INT DEFAULT 0;
 | 
						|
DECLARE x INT DEFAULT 0;
 | 
						|
SET x= IGNORED;
 | 
						|
RETURN 0;
 | 
						|
END|
 | 
						|
DROP TABLE t1;
 | 
						|
DROP FUNCTION f1;
 | 
						|
DROP FUNCTION f2;
 | 
						|
CREATE PROCEDURE test_sp()
 | 
						|
BEGIN
 | 
						|
ignored:
 | 
						|
LOOP
 | 
						|
LEAVE ignored;
 | 
						|
END LOOP;
 | 
						|
END|
 | 
						|
DROP PROCEDURE test_sp;
 | 
						|
CREATE PROCEDURE test_sp()
 | 
						|
BEGIN
 | 
						|
set @@ignored= 1;
 | 
						|
END|
 | 
						|
ERROR HY000: Unknown system variable 'ignored'
 | 
						|
CREATE PROCEDURE proc()
 | 
						|
BEGIN
 | 
						|
SET IGNORED= a+b;
 | 
						|
END |
 | 
						|
ERROR HY000: Unknown system variable 'IGNORED'
 | 
						|
#
 | 
						|
# ALLOWING ALTER KEY syntax in ALTER TABLE
 | 
						|
#
 | 
						|
CREATE TABLE t1 (a INT, KEY (a));
 | 
						|
ALTER TABLE t1 ALTER INDEX a IGNORED;
 | 
						|
SHOW CREATE TABLE t1;
 | 
						|
Table	Create Table
 | 
						|
t1	CREATE TABLE `t1` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  KEY `a` (`a`) IGNORED
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
DROP TABLE t1;
 | 
						|
CREATE TABLE t1 (a INT, KEY (a));
 | 
						|
ALTER TABLE t1 ALTER KEY a IGNORED;
 | 
						|
SHOW CREATE TABLE t1;
 | 
						|
Table	Create Table
 | 
						|
t1	CREATE TABLE `t1` (
 | 
						|
  `a` int(11) DEFAULT NULL,
 | 
						|
  KEY `a` (`a`) IGNORED
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
DROP TABLE t1;
 | 
						|
#
 | 
						|
#  MDEV-25078, part #2: allow IF EXISTS
 | 
						|
#
 | 
						|
create table t1 (a int, b int, c int, key(a), key(b), key(c));
 | 
						|
alter table t1 alter key if exists no_such_key ignored;
 | 
						|
Warnings:
 | 
						|
Note	1176	Key 'no_such_key' doesn't exist in table 't1'
 | 
						|
alter table t1 alter key if exists a ignored;
 | 
						|
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 `a` (`a`) IGNORED,
 | 
						|
  KEY `b` (`b`),
 | 
						|
  KEY `c` (`c`)
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
alter table t1
 | 
						|
alter key if exists no_such_key ignored,
 | 
						|
alter key if exists c ignored ;
 | 
						|
Warnings:
 | 
						|
Note	1176	Key 'no_such_key' doesn't exist in table 't1'
 | 
						|
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 `a` (`a`) IGNORED,
 | 
						|
  KEY `b` (`b`),
 | 
						|
  KEY `c` (`c`) IGNORED
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
alter table t1 
 | 
						|
alter key if exists no_such_key not ignored, 
 | 
						|
alter key if exists c not ignored ;
 | 
						|
Warnings:
 | 
						|
Note	1176	Key 'no_such_key' doesn't exist in table 't1'
 | 
						|
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 `a` (`a`) IGNORED,
 | 
						|
  KEY `b` (`b`),
 | 
						|
  KEY `c` (`c`)
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
drop table t1;
 |