Bug #16674 | Regression with prefix indexes and LIKE | ||
---|---|---|---|
Submitted: | 20 Jan 2006 15:01 | Modified: | 13 Jul 2006 4:21 |
Reporter: | Hartmut Holzgraefe | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
Version: | 4.1, 5.0 | OS: | Linux (linux) |
Assigned to: | Igor Babaev | CPU Architecture: | Any |
[20 Jan 2006 15:01]
Hartmut Holzgraefe
[19 May 2006 17:03]
Hartmut Holzgraefe
mysqltest test case
Attachment: bug16674.tar.gz (application/x-gzip, text), 826 bytes.
[24 May 2006 4:44]
Igor Babaev
The same problem can be demonstrated without using a partial index: mysql> SELECT VERSION(); +--------------+ | VERSION() | +--------------+ | 5.0.22-debug | +--------------+ 1 row in set (0.00 sec) mysql> SET NAMES utf8; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t2 ( -> testf CHAR(13) DEFAULT '', -> INDEX(testf) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t2 SET testf = 'Käli Käli 2-4'; Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t2 SET testf = 'Käli Käli 2-4'; Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t2 SET testf = 'Käli Käli 2+4'; Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t2 SET testf = 'Käli Käli 2+4'; Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t2 SET testf = 'Käli Käli 2-6'; Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t2 SET testf = 'Käli Käli 2-6'; Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM t2; +-----------------+ | testf | +-----------------+ | Käli Käli 2+4 | | Käli Käli 2+4 | | Käli Käli 2-4 | | Käli Käli 2-4 | | Käli Käli 2-6 | | Käli Käli 2-6 | +-----------------+ 6 rows in set (0.00 sec) mysql> EXPLAIN SELECT testf FROM t2 WHERE testf LIKE 'Käli Käli 2-%'; +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | 1 | SIMPLE | t2 | range | testf | testf | 40 | NULL | 1 | Using where; Using index | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ 1 row in set (0.00 sec) mysql> SELECT testf FROM t2 WHERE testf LIKE 'Käli Käli 2-%'; Empty set (0.00 sec) mysql> SELECT testf FROM t2 WHERE testf LIKE 'Käli Käli 2+4'; Empty set (0.00 sec)
[14 Jun 2006 7:48]
Alexander Barkov
Reassigning to myself, as Monty asked me to work on this bug.
[14 Jun 2006 11:15]
Alexander Barkov
Oops. I'm sorry, assigned a wrong bug to myself in a mistake.
[21 Jun 2006 2:57]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/7978
[5 Jul 2006 18:10]
Evgeny Potemkin
The length of the prefix of the pattern string in the LIKE predicate that determined the index range to be scanned was calculated incorrectly for multi-byte character sets. As a result of this in 4. 1 the the scanned range was wider then necessary if the prefix contained not only one-byte characters. In 5.0 additionally it caused missing some rows from the result set. Fixed in 4.1.21, 5.0.24, 5.1.12
[13 Jul 2006 4:21]
Paul DuBois
Noted in 4.1.21, 5.0.25 (not 5.0.24), 5.1.12 changelogs.