| Bug #14583 | Bug on query using a LIKE on indexed field with ucs2_bin collation | ||
|---|---|---|---|
| Submitted: | 2 Nov 2005 18:33 | Modified: | 6 Jan 2006 5:46 |
| Reporter: | Xavier FOURNET | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S2 (Serious) |
| Version: | 4.1.15 / 5.0.15/BK source | OS: | Windows (Windows XP SP2/linux) |
| Assigned to: | Evgeny Potemkin | CPU Architecture: | Any |
[2 Nov 2005 18:33]
Xavier FOURNET
[2 Nov 2005 23:07]
MySQL Verification Team
---------------------------------------------------------------------------
mysql> -- 5.0.15/InnoDB: 4 rows, result is OK
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
+------+
| Name |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> INSERT INTO TestTable(Name) VALUES('e');
Query OK, 1 row affected (0.01 sec)
mysql> -- 5.0.15/InnoDB: 5 rows, result is KO
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
Empty set (0.01 sec)
mysql>
mysql> DROP INDEX IX_TestTable ON TestTable;
Query OK, 5 rows affected (0.10 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> -- again without index all is working fine, 'a' record is returned
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
+------+
| Name |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> select version();
+--------------+
| version() |
+--------------+
| 5.0.16-debug |
+--------------+
1 row in set (0.02 sec)
---------------------------------------------------------------------------
mysql> CREATE INDEX IX_TestTable ON TestTable(Name);
Query OK, 1 row affected (0.10 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql>
mysql> -- 4.1.15/InnoDB : 'a' record is not returned!
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
Empty set (0.00 sec)
mysql>
mysql> INSERT INTO TestTable(Name) VALUES('b');
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> -- 5.0.15/MyISAM : 'a' record is not returned!
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
Empty set (0.00 sec)
mysql>
mysql> INSERT INTO TestTable(Name) VALUES('c');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO TestTable(Name) VALUES('d');
Query OK, 1 row affected (0.00 sec)
mysql> -- 5.0.15/InnoDB: 4 rows, result is OK
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
Empty set (0.00 sec)
mysql> INSERT INTO TestTable(Name) VALUES('e');
Query OK, 1 row affected (0.01 sec)
mysql> -- 5.0.15/InnoDB: 5 rows, result is KO
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
Empty set (0.01 sec)
mysql>
mysql> DROP INDEX IX_TestTable ON TestTable;
Query OK, 5 rows affected (0.08 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> -- again without index all is working fine, 'a' record is returned
mysql> SELECT Name FROM TestTable WHERE Name LIKE 'a%';
+------+
| Name |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> select version();
+------------------+
| version() |
+------------------+
| 4.1.16-debug-log |
+------------------+
1 row in set (0.01 sec)
[3 Nov 2005 11:01]
Heikki Tuuri
Marko, please look at this ucs2_bin bug. Regards, Heikki
[3 Nov 2005 12:36]
Marko Mäkelä
In 4.1-bk, the query
SELECT Name FROM TestTable WHERE Name LIKE 'a%'
returns an empty set after adding the index, because in handler::read_range_first() MySQL passes start_key as follows:
{key = 0x8bab548 "", length = 510, flag = HA_READ_KEY_OR_NEXT}
That is, key = {0x0061, 0x0000, 0x0000, ... }.
However, InnoDB stores the field as the single character 0x0061. The comparison of start_key to the record is delegated to my_strnncollsp_ucs2_bin(), which determines that the longer string is lexicographically greater than the shorter one.
This does not seem to be an InnoDB bug. I will check 5.0-bk shortly.
Marko Mäkelä
[3 Nov 2005 13:29]
Marko Mäkelä
Not an InnoDB bug in 5.0-bk either. The statement
SELECT Name FROM TestTable WHERE Name LIKE 'a%';
fails, because in check_quick_keys(), MySQL has min_range.key equal to the 1.5-character string {0x0061,0x00}. Also the max_range.key looks very suspicious.
I'm assigning this bug away from me.
[29 Nov 2005 9:45]
Xavier FOURNET
Hello, I would like to known if a bugfix is planned for this issue. This is blocking for our customers (Swapcom is a software editor for mobile network operators) who wants to deploy our software on MySQL instead of Oracle/SQLServer that we currently support. Best regards.
[29 Nov 2005 12:27]
Sergei Golubchik
Yes, of course. Bugfix is planned.
[27 Dec 2005 17:16]
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/428
[27 Dec 2005 17:50]
Alexander Barkov
The fix is fine. Ok to push.
[28 Dec 2005 15:26]
Evgeny Potemkin
When InnoDB compares varchar field in ucs2 with given key using bin collation, it calls my_strnncollsp_ucs2_bin() to perform comparison. Because field length was lesser than length of key field should be padded with trailing spaces in order to get correct result. Because my_strnncollsp_ucs2_bin() was calling my_strnncollp_ucs2_bin(), which doesn't pads field, wrong comparison result was returned. This results in wrong result set. Fixed in 4.1.17, cset 1.2466.1.1
[28 Dec 2005 16:16]
Evgeny Potemkin
Fixed in 5.0.19
[28 Dec 2005 18:52]
Evgeny Potemkin
Fixed in 5.1.5
[6 Jan 2006 5:46]
Paul DuBois
Noted in 4.1.17, 5.0.19, 5.1.5 changelogs.
