File: invisible_indexes.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (133 lines) | stat: -rw-r--r-- 3,526 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
--source include/invisible_indexes.inc

--echo #
--echo # Tests that don't work on MyISAM ( native partitioning, indexes on
--echo # generated columns, etc.)
--echo #

--echo #
--echo # Partitioning on keys with an invisible index, invisible indexes over
--echo # partitioned tables.
--echo #
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) INVISIBLE,
  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;

EXPLAIN SELECT a FROM t1;
EXPLAIN SELECT b FROM t1;
EXPLAIN SELECT * FROM t1 WHERE a = '04';

ALTER TABLE t1 ALTER INDEX a VISIBLE;
EXPLAIN SELECT a FROM t1;
EXPLAIN SELECT * FROM t1 WHERE a = '04';

ALTER TABLE t1 ALTER INDEX b INVISIBLE;
EXPLAIN SELECT b FROM t1;

DROP TABLE t1;

CREATE TABLE t1 ( a INT GENERATED ALWAYS AS (1), KEY (a) INVISIBLE );
SHOW INDEXES FROM t1;
EXPLAIN SELECT a FROM t1;
DROP TABLE t1;


--echo #
--echo # Test that referential constraints implemented by the indexes are still
--echo # enforced while the index is invisible.
--echo #

CREATE TABLE t1p ( a INT KEY );
CREATE TABLE t1c ( t1p_a INT );
ALTER TABLE t1c ADD CONSTRAINT FOREIGN KEY ( t1p_a ) REFERENCES t1p( a );
ALTER TABLE t1c ALTER INDEX t1p_a INVISIBLE;

--error ER_NO_REFERENCED_ROW_2
INSERT INTO t1c VALUES ( 1 );
SELECT * FROM t1c;

DROP TABLE t1c, t1p;

--echo #
--echo # Bug#25837038: FEATURE REQUEST : USE INVISIBLE INDEXES SPECIFIC QUERY
--echo #

CREATE TABLE t1 ( a INT, KEY( a ) INVISIBLE );

INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
--replace_column 10 X
EXPLAIN SELECT a FROM t1;

--connect ( con1, localhost, root, , )
--connection con1
--replace_result hypergraph_optimizer=on hypergraph_optimizer=off
SELECT @@optimizer_switch;
--replace_column 10 X
EXPLAIN SELECT a FROM t1;
SET @@optimizer_switch='use_invisible_indexes=on';
--replace_column 10 X
EXPLAIN SELECT a FROM t1;

--connection default
--replace_result hypergraph_optimizer=on hypergraph_optimizer=off
SELECT @@optimizer_switch;
--replace_column 10 X
EXPLAIN SELECT a FROM t1;

--connection con1
--replace_result hypergraph_optimizer=on hypergraph_optimizer=off
SELECT @@optimizer_switch;
SET @@optimizer_switch='use_invisible_indexes=off';
--replace_column 10 X
EXPLAIN SELECT a FROM t1;

--disconnect con1
--connection default
--replace_column 10 X
EXPLAIN SELECT a FROM t1;

DROP TABLE t1;

--echo #
--echo # Bug#31550839 OPTIMIZER SWITCH USE_INVISIBLE_INDEXES=ON DOES NOT ALLOW FORCE INDEX
--echo #

CREATE TABLE t1 (
 id INT NOT NULL PRIMARY KEY,
 b INT NOT NULL,
 INDEX (b) INVISIBLE
);
INSERT INTO t1 VALUES (1, 1), (2,2),(3,3),(4,4),(5,5);
ANALYZE TABLE t1;

SET optimizer_switch="use_invisible_indexes=on";
EXPLAIN SELECT * FROM t1 FORCE INDEX (b) WHERE b = 3;
SET optimizer_switch="use_invisible_indexes=default";
--error ER_KEY_DOES_NOT_EXITS
EXPLAIN SELECT * FROM t1 FORCE INDEX (b) WHERE b = 3;

DROP TABLE t1;