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;
|