Bug #13814 | index including TINYBLOB breaks SELECT functionality | ||
---|---|---|---|
Submitted: | 6 Oct 2005 19:09 | Modified: | 9 Nov 2005 3:47 |
Reporter: | Mark Modrall | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
Version: | 4.1.12/4.1 BK source | OS: | Linux (linux) |
Assigned to: | Sergey Petrunya | CPU Architecture: | Any |
Tags: | corruption, myisam |
[6 Oct 2005 19:09]
Mark Modrall
[6 Oct 2005 19:15]
Mark Modrall
By the by, the original table had bob VARCHAR(44) instead. The value could be null or text and the index and selects still worked.
[6 Oct 2005 19:26]
MySQL Verification Team
Thank you for the bug report. This bug not affects 5.0 miguel@hegel:~/dbs/4.1> bin/mysql -uroot test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.1.15-debug-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create table if not exists indexBug ( -> cip INT NOT NULL, -> time TIME NOT NULL, -> score INT NOT NULL DEFAULT 0, -> bob TINYBLOB -> ); Query OK, 0 rows affected (0.09 sec) mysql> insert into indexBug (cip, time) VALUES (1, '00:01'), (2, '00:02'), (3, -> '00:03'); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> insert into indexBug (cip, bob, time) VALUES (4, 'a', '00:04'), (5, 'b', -> '00:05'), (6, 'c', '00:06'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from indexBug where bob is null and cip=1; +-----+----------+-------+------+ | cip | time | score | bob | +-----+----------+-------+------+ | 1 | 00:01:00 | 0 | NULL | +-----+----------+-------+------+ 1 row in set (0.01 sec) mysql> create index bug on indexBug (bob(22), cip, time); Query OK, 6 rows affected (0.05 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> select * from indexBug where bob is null and cip=1; Empty set (0.00 sec) ---------------------------------------------------------------------------- mysql> create table if not exists indexBug ( -> cip INT NOT NULL, -> time TIME NOT NULL, -> score INT NOT NULL DEFAULT 0, -> bob TINYBLOB -> ) -> ; Query OK, 0 rows affected (0.04 sec) mysql> insert into indexBug (cip, time) VALUES (1, '00:01'), (2, '00:02'), (3, -> '00:03') -> -> ; Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> insert into indexBug (cip, bob, time) VALUES (4, 'a', '00:04'), (5, 'b', -> '00:05'), (6, 'c', '00:06') -> ; Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from indexBug where bob is null and cip=1; +-----+----------+-------+------+ | cip | time | score | bob | +-----+----------+-------+------+ | 1 | 00:01:00 | 0 | NULL | +-----+----------+-------+------+ 1 row in set (0.00 sec) mysql> create index bug on indexBug (bob(22), cip, time) -> ; Query OK, 6 rows affected (0.03 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> select * from indexBug where bob is null and cip=1; +-----+----------+-------+------+ | cip | time | score | bob | +-----+----------+-------+------+ | 1 | 00:01:00 | 0 | NULL | +-----+----------+-------+------+ 1 row in set (0.01 sec) mysql> mysql> select version(); +-----------------+ | version() | +-----------------+ | 5.0.15-rc-debug | +-----------------+ 1 row in set (0.00 sec)
[7 Oct 2005 21:19]
Mark Modrall
Thanks... Just heard from our operations dept that I'm not allowed to move to 5 until "Redhat starts bundling it" unfortunately.
[28 Oct 2005 19:27]
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/internals/31632
[8 Nov 2005 8:10]
Sergey Petrunya
The fix has been pushed into 4.1.16 tree. Bug description for the changelog: One can get wrong query results (or wrong actions by UPDATE/DELETE) if - The source table is as MyISAM table - There is a multipart index idx1 that covers a BLOB field fieldX (or part of it), and the fieldX is not the last key part. - The query performs index lookup on index idx1 using a key value tuple that = has NULL value for fieldX = has some values for subsequent keypart(s), i.e. the key value tuple covers keyparts up to fieldX and at least one key part after it.
[9 Nov 2005 3:47]
Paul DuBois
Noted in 4.1.16 changelog.