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.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.041 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.