File: key_myisam.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 (299 lines) | stat: -rw-r--r-- 9,640 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
--source include/force_myisam_default.inc
--source include/have_myisam.inc

SET SQL_WARNINGS=1;

#
# Test with blob + tinyint key
# (Failed for Greg Valure)
#

CREATE TABLE t1 (
  a tinytext NOT NULL,
  b tinyint(3) unsigned NOT NULL default '0',
  PRIMARY KEY (a(32),b)
) ENGINE=MyISAM;
INSERT INTO t1 VALUES ('a',1),('a',2);
SELECT * FROM t1 WHERE a='a' AND b=2;
SELECT * FROM t1 WHERE a='a' AND b in (2);
SELECT * FROM t1 WHERE a='a' AND b in (1,2);
drop table t1;

#
# Problem with UNIQUE() with NULL parts and auto increment
#

CREATE TABLE t1 (c CHAR(10) NOT NULL,i INT NOT NULL AUTO_INCREMENT,
UNIQUE (c,i)) ENGINE=MYISAM;
INSERT IGNORE INTO t1 (c) VALUES (NULL),(NULL);
SELECT * FROM t1;
INSERT INTO t1 (c) VALUES ('a'),('a');
SELECT * FROM t1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (c CHAR(10) NULL, i INT NOT NULL AUTO_INCREMENT,
UNIQUE (c,i)) ENGINE=MYISAM;
INSERT INTO t1 (c) VALUES (NULL),(NULL);
SELECT * FROM t1;
INSERT INTO t1 (c) VALUES ('a'),('a');
SELECT * FROM t1;
drop table t1;

#
# Test of key read with primary key (Bug #3497)
#

CREATE TABLE t1 (id int unsigned auto_increment, name char(50), primary key (id)) engine=myisam;
insert into t1 (name) values ('a'), ('b'),('c'),('d'),('e'),('f'),('g');
explain select 1 from t1 where id =2;
explain select 1 from t1 where id =2 or id=3;
explain select name from t1 where id =2;
ALTER TABLE t1 DROP PRIMARY KEY, ADD INDEX (id);
explain select 1 from t1 where id =2;
drop table t1;

#
# UNIQUE prefix keys and multi-byte charsets
#

create table t1 (c varchar(30), t text, unique (c(2)), unique (t(3))) charset utf8 engine=myisam;
show create table t1;
insert t1 values ('cccc', 'tttt'),
  (0xD0B1212223D0B1D0B1D0B1D0B1D0B1, 0xD0B1D0B1212223D0B1D0B1D0B1D0B1),
  (0xD0B1222123D0B1D0B1D0B1D0B1D0B1, 0xD0B1D0B1222123D0B1D0B1D0B1D0B1);
--error ER_DUP_ENTRY
insert t1 (c) values ('cc22');
--error ER_DUP_ENTRY
insert t1 (t) values ('ttt22');
--error ER_DUP_ENTRY
insert t1 (c) values (0xD0B1212322D0B1D0B1D0B1D0B1D0B1);
--error ER_DUP_ENTRY
insert t1 (t) values (0xD0B1D0B1212322D0B1D0B1D0B1D0B1);
select c from t1 where c='cccc';
select t from t1 where t='tttt';
select c from t1 where c=0xD0B1212223D0B1D0B1D0B1D0B1D0B1;
select t from t1 where t=0xD0B1D0B1212223D0B1D0B1D0B1D0B1;
drop table t1;

#
# BUG#6151 - myisam index corruption
#
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
  c1 int,
  c2 varbinary(240),
  UNIQUE KEY (c1),
  KEY (c2)
) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1,'\Z\Z\Z\Z');
INSERT INTO t1 VALUES (2,'\Z\Z\Z\Z\Z\Z');
INSERT INTO t1 VALUES (3,'\Z\Z\Z\Z');
select c1 from t1 where c2='\Z\Z\Z\Z';
DELETE FROM t1 WHERE (c1 = 1);
check table t1;
select c1 from t1 where c2='\Z\Z\Z\Z';
DELETE FROM t1 WHERE (c1 = 3);
check table t1;
select c1 from t1 where c2='\Z\Z\Z\Z';

#
# test delete of keys in a different order
#
truncate table t1;
insert into t1 values(1,"aaaa"),(2,"aaab"),(3,"aaac"),(4,"aaccc");
delete from t1 where c1=3;
delete from t1 where c1=1;
delete from t1 where c1=4;
check table t1;

drop table t1;

#
# Bug#12565 - ERROR 1034 when running simple UPDATE or DELETE 
#             on large MyISAM table
#
create table t1 (
  c1 int,
  c2 varchar(20) not null,
  primary key (c1),
  key (c2(10))
) engine=myisam;
insert into t1 values (1,'');
insert into t1 values (2,' \t\tTest String');
insert into t1 values (3,' \n\tTest String');
update t1 set c2 = 'New Test String' where c1 = 1;
select * from t1;
drop table t1;

#
# Bug #20604: Test for disabled keys with aggregate functions and FORCE INDEX.
#

CREATE TABLE t1( a TINYINT, KEY(a) ) ENGINE=MyISAM;
INSERT INTO t1 VALUES( 1 );
ALTER TABLE t1 DISABLE KEYS;
EXPLAIN SELECT MAX(a) FROM t1 FORCE INDEX(a);

drop table t1;

#
# Bug #31974: Wrong EXPLAIN output
#

CREATE TABLE t1 (a INT, b INT, INDEX (a,b)) engine=myisam;
INSERT INTO t1 (a, b)
   VALUES
     (1,1), (1,2), (1,3), (1,4), (1,5),
     (2,2), (2,3), (2,1), (3,1), (4,1), (4,2), (4,3), (4,4), (4,5), (4,6),
     (5,1), (5,2), (5,3), (5,4), (5,5);
EXPLAIN SELECT 1 FROM t1 AS t1_outer WHERE
  (SELECT max(b) FROM t1 GROUP BY a HAVING a < 2) > 12;
SELECT 1 as RES FROM t1 AS t1_outer WHERE
  (SELECT max(b) FROM t1 GROUP BY a HAVING a < 2) > 12;

DROP TABLE t1;

--echo #
--echo # Bug#18144: Cost with FORCE/USE index seems incorrect in some cases.
--echo #
--echo # We are interested in showing that the cost for the last plan is higher
--echo # than for the preceding two plans.
--echo #
CREATE TABLE t1( a INT, b INT, KEY( a ) ) engine=myisam;
INSERT INTO t1 values (1, 2), (1, 3), (2, 3), (2, 4), (3, 4), (3, 5);

EXPLAIN SELECT a, SUM( b ) FROM t1 GROUP BY a;
--skip_if_hypergraph  # Depends on the query plan.
SHOW STATUS LIKE 'Last_query_cost';

EXPLAIN SELECT a, SUM( b ) FROM t1 USE INDEX( a ) GROUP BY a;
--skip_if_hypergraph  # Depends on the query plan.
SHOW STATUS LIKE 'Last_query_cost';

EXPLAIN SELECT a, SUM( b ) FROM t1 FORCE INDEX( a ) GROUP BY a;
--skip_if_hypergraph  # Depends on the query plan.
SHOW STATUS LIKE 'Last_query_cost';

DROP TABLE t1;

--echo #
--echo # Additional coverage for handling of key algorithm in index definition.
--echo #

--echo #
--echo # 1) Default case. If key algorithm was not specified explicitly and
--echo #    this is normal key (not spatial or fulltext) storage engine
--echo #    default key algorithm is used.
--echo #  
create table tm (k int, index (k)) charset utf8mb4 engine=myisam;
--echo #
--echo # Key algorithm is not shown in SHOW CREATE TABLE output in this case
--echo #
show create table tm;
--echo #
--echo # But visible in I_S.STATISTICS
--echo #
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name ='tm' order by table_name;
--echo #
--echo # Same applies when keys are added by ALTER TABLE
--echo #
alter table tm add column l int, add index (l);
show create table tm;
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' and index_name = 'l'
  order by table_name;
drop tables tm;

--echo #
--echo # 2) For SPATIAL and FULLTEXT keys we always use special key
--echo #    algorithms and there is no way to specify it explicitly.
--echo #
create table tm (pk int primary key, p point not null SRID 0, spatial index (p))
charset utf8mb4 engine=myisam;
--echo #
--echo # Key algorithm is not shown in SHOW CREATE TABLE output in this
--echo # case as well.
--echo #
show create table tm;
--echo #
--echo # But visible in I_S.STATISTICS
--echo #
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' and index_name = 'p'
  order by table_name;
--echo #
--echo # Same applies when keys are added by ALTER TABLE
--echo #
alter table tm add column q point not null SRID 0, add spatial index (q);
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' and index_name = 'q'
  order by table_name;
drop tables tm;
--echo #
--echo # Same applies to FULLTEXT indexes.
--echo #
create table tm (pk int primary key, v varchar(255), fulltext index (v))
charset utf8mb4 engine=myisam;
show create table tm;
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' and index_name = 'v'
  order by table_name;
--echo #
--echo # Same applies when keys are added by ALTER TABLE
--echo #
alter table tm add column w varchar(255), add fulltext index (w);
show create table tm;
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' and index_name = 'w'
  order by table_name;
drop tables tm;

--echo #
--echo # 3) If key algorithm was specified explicitly and it is supported
--echo #    by the storage engine it will be used.
--echo #
create table tm (k int, index using btree (k)) charset utf8mb4 engine=myisam;
--echo #
--echo # In this case it is shown in SHOW CREATE TABLE output
--echo #
show create table tm;
--echo #
--echo # Also visible in I_S.STATISTICS
--echo #
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' order by table_name;
--echo #
--echo # Same applies when keys are added by ALTER TABLE
--echo #
--echo # Note that the information that algorithm was provided explicitly is
--echo # preserved by ALTER TABLE.
alter table tm add column l int, add index using btree (l);
show create table tm;
select table_name, index_type from information_schema.statistics
  where table_schema = 'test' and table_name = 'tm' and index_name = 'l'
  order by table_name;
drop tables tm;

--echo #
--echo # 7) Key algorithm and ALTER TABLE ALGORITHM=INPLACE
--echo #
--echo # Changing key algorithm from one used by default to the same one
--echo # but specified explicitly should be inplace/fast operation.
create table t1 (k int, index (k)) charset utf8mb4 engine=myisam;
show create table t1;
alter table t1 drop key k, add index using btree (k), algorithm=inplace;
show create table t1;
alter table t1 drop key k, add index (k), algorithm=inplace;
show create table t1;
--echo # Note that below statement doesn't really change algorithm.
alter table t1 drop key k, add index using hash (k), algorithm=inplace;
drop table t1;
--echo # Changing key algorithm to another one can require COPY algorithm.
create table t1 (k int, index (k)) charset utf8mb4 engine=heap;
show create table t1;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t1 drop key k, add index using btree (k), algorithm=inplace;
show create table t1;
alter table t1 drop key k, add index using btree (k), algorithm=copy;
show create table t1;
drop table t1;