polardbxengine/mysql-test/t/func_prefix_key.test

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;