139 lines
4.6 KiB
Plaintext
139 lines
4.6 KiB
Plaintext
CREATE TABLE t1(a int, b VARCHAR(5), PRIMARY KEY(a))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES (1, 'a'), (2, 'ab'), (3, 'abc'), (4, 'abcd'), (5, 'abcde');
|
|
ALTER TABLE t1 ADD KEY k2 (b(4));
|
|
ANALYZE TABLE t1;
|
|
|
|
--source include/func_prefix_key.inc
|
|
|
|
DROP TABLE t1;
|
|
|
|
CREATE TABLE t1(a int, b VARCHAR(5), PRIMARY KEY(a))ENGINE=INNODB DEFAULT CHARSET=latin1;
|
|
INSERT INTO t1 VALUES (1, 'a'), (2, 'ab'), (3, 'abc'), (4, 'abcd'), (5, 'abcde');
|
|
ALTER TABLE t1 ADD KEY k2 (b(4));
|
|
ANALYZE TABLE t1;
|
|
|
|
--source include/func_prefix_key.inc
|
|
|
|
DROP TABLE t1;
|
|
|
|
CREATE TABLE t1(a int, b VARCHAR(5), PRIMARY KEY(a))ENGINE=INNODB DEFAULT CHARSET=utf32;
|
|
INSERT INTO t1 VALUES (1, 'a'), (2, 'ab'), (3, 'abc'), (4, 'abcd'), (5, 'abcde');
|
|
ALTER TABLE t1 ADD KEY k2 (b(4));
|
|
ANALYZE TABLE t1;
|
|
|
|
--source include/func_prefix_key.inc
|
|
|
|
DROP TABLE t1;
|
|
|
|
# Test for TEXT field.
|
|
|
|
CREATE TABLE t1(a int, b TEXT, PRIMARY KEY(a))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES (1, 'a'), (2, 'ab'), (3, 'abc'), (4, 'abcd'), (5, 'abcde');
|
|
ALTER TABLE t1 ADD KEY k2 (b(4));
|
|
ANALYZE TABLE t1;
|
|
|
|
--source include/func_prefix_key.inc
|
|
|
|
DROP TABLE t1;
|
|
|
|
# More tests with the indexes with different prefix length.
|
|
|
|
CREATE TABLE t1(a int, b VARCHAR(5), PRIMARY KEY(a))ENGINE=INNODB DEFAULT CHARSET=utf32;
|
|
INSERT INTO t1 VALUES (1, 'a'), (2, 'ab'), (3, 'abc'), (4, 'abcd'), (5, 'abcde'), (6, 'abcdf');
|
|
ALTER TABLE t1 ADD KEY k2 (b(4));
|
|
ALTER TABLE t1 ADD KEY k3 (b(2));
|
|
ALTER TABLE t1 ADD KEY k4 (a, b(3));
|
|
ANALYZE TABLE t1;
|
|
|
|
--echo # k2 index used since it's covering.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE b like 'abc%';
|
|
SELECT COUNT(*) FROM t1 WHERE b like 'abc%';
|
|
|
|
--echo # k4 index used since it's covering.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a > 4 AND b like 'abc%';
|
|
SELECT COUNT(*) FROM t1 WHERE a > 4 AND b like 'abc%';
|
|
|
|
--echo # k3 index is used since it's shorters key.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE b like 'ab%';
|
|
SELECT COUNT(*) FROM t1 WHERE b like 'ab%';
|
|
|
|
--echo # Index access is not used, no covering keys.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a > 4 AND b like 'abcde%';
|
|
SELECT COUNT(*) FROM t1 WHERE a > 4 AND b like 'abcde%';
|
|
|
|
--echo # k2 index used since it's covering.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a > 4 AND b like 'abcd%';
|
|
SELECT COUNT(*) FROM t1 WHERE a > 4 AND b like 'abcd%';
|
|
|
|
--echo # Index access is not used, no covering keys.
|
|
EXPLAIN SELECT b like 'abcdf%' FROM t1 WHERE a > 4 AND b like 'abcd%';
|
|
SELECT b like 'abcdf%' FROM t1 WHERE a > 4 AND b like 'abcd%';
|
|
|
|
--echo # Index access is used since k4 is covering.
|
|
EXPLAIN SELECT b like 'ab%' FROM t1 WHERE a > 4 AND b like 'a%';
|
|
SELECT b like 'ab%' FROM t1 WHERE a > 4 AND b like 'a%';
|
|
|
|
--echo # Index access is used since k3 is forced and covering.
|
|
EXPLAIN SELECT b like 'ab%' FROM t1 FORCE INDEX(k3) WHERE a > 4 AND b like 'a%';
|
|
SELECT b like 'ab%' FROM t1 FORCE INDEX(k3) WHERE a > 4 AND b like 'a%';
|
|
|
|
--echo # No index access is used since second argument is not const.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE b like a;
|
|
SELECT COUNT(*) FROM t1 WHERE b like a;
|
|
|
|
DROP TABLE t1;
|
|
|
|
CREATE TABLE t1(a int, b TEXT, c TEXT, PRIMARY KEY(a))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES (1, 'a', 'a'), (2, 'ab', 'ab'), (3, 'abc', 'abc'), (4, 'abcd', 'abcd'), (5, 'abcde', 'abcde');
|
|
ALTER TABLE t1 ADD KEY k2 (b(4), c(3));
|
|
ANALYZE TABLE t1;
|
|
--echo # Index access is used since key is covering.
|
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE b like 'aaaa';
|
|
DROP TABLE t1;
|
|
|
|
--echo #
|
|
--echo # Bug#27660560 RECENT REGRESSION: CRASH IN CHECK_COVERING_PREFIX_KEYS.
|
|
--echo #
|
|
|
|
CREATE TABLE t1(f1 BLOB, KEY(f1(1))) ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES ('ccc'), ('aa');
|
|
ANALYZE TABLE t1;
|
|
|
|
SELECT (f1 LIKE null) from t1;
|
|
--error ER_INVALID_JSON_TEXT_IN_PARAM
|
|
SELECT 1 FROM t1 WHERE f1 NOT LIKE json_merge('' ,'+' );
|
|
--error ER_INVALID_JSON_TEXT_IN_PARAM
|
|
SELECT 1 FROM t1 WHERE f1 LIKE json_contains('key2' ,'key4' );
|
|
SELECT 1 FROM t1 WHERE f1 LIKE json_depth(null);
|
|
|
|
# Tests below should use index access.
|
|
EXPLAIN SELECT (f1 LIKE null) from t1;
|
|
EXPLAIN SELECT (f1 LIKE null) from t1 WHERE f1 LIKE 'a%';
|
|
|
|
DROP TABLE t1;
|
|
|
|
--echo #
|
|
--echo # Bug#28934315 CASE STATEMENT USE IN CONDITIONAL WITH SUB_PART INDEX REGRESSION IN 8.0.
|
|
--echo #
|
|
|
|
CREATE TABLE t1 (
|
|
id INT(11) NOT NULL AUTO_INCREMENT,
|
|
example VARCHAR(100) NOT NULL DEFAULT '',
|
|
PRIMARY KEY (id),
|
|
KEY example_key (example(9))
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE t2 (
|
|
id INT(11) NOT NULL AUTO_INCREMENT,
|
|
example VARCHAR(100) NOT NULL DEFAULT '',
|
|
PRIMARY KEY (id)
|
|
) ENGINE=InnoDB;
|
|
|
|
INSERT INTO t1 (example) VALUES ('1234567890');
|
|
INSERT INTO t2 (example) VALUES ('1234567890');
|
|
|
|
EXPLAIN SELECT t2.example, t2.id FROM t2, t1 WHERE t1.example = LOWER(t2.example);
|
|
SELECT t2.example, t2.id FROM t2, t1 WHERE t1.example = LOWER(t2.example);
|
|
|
|
DROP TABLE t1, t2;
|