| Bug #33348 | select does not return all records when we have a covering index on a column . | ||
|---|---|---|---|
| Submitted: | 19 Dec 2007 1:15 | Modified: | 14 Feb 2008 13:08 |
| Reporter: | Victor Paul | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server: MyISAM storage engine | Severity: | S2 (Serious) |
| Version: | 5.0.37 & 5.0.45 & 5.1 | OS: | Linux (Ubontu Fiesty and Gutsy) |
| Assigned to: | Georgi Kodinov | CPU Architecture: | Any |
| Tags: | GROUP BY, order by | ||
[19 Dec 2007 1:15]
Victor Paul
[19 Dec 2007 1:16]
Victor Paul
Insert statement for 555 records
Attachment: bug.txt (text/plain), 17.79 KiB.
[19 Dec 2007 2:19]
MySQL Verification Team
Thank you for the bug report. This bug not affects InnoDB engine.
| 264 | 2007-10-31 00:00:00 |
| 266 | 2007-11-30 00:00:00 |
| 267 | 2007-11-30 00:00:00 |
| 268 | 2007-11-30 00:00:00 |
| 269 | 2007-11-20 00:00:00 |
| 270 | 2007-11-30 00:00:00 |
| 271 | 2007-10-31 00:00:00 |
| 272 | 2007-11-26 00:00:00 |
| 273 | 2007-11-28 00:00:00 |
| 274 | 2007-11-29 00:00:00 |
| 275 | 2007-11-30 00:00:00 |
| 276 | 2007-12-05 00:00:00 |
| 277 | 2007-12-09 00:00:00 |
| 278 | 2007-12-12 00:00:00 |
| 279 | 2007-12-13 00:00:00 |
| 280 | 2007-12-13 00:00:00 |
+--------------------+---------------------+
251 rows in set (0.03 sec)
mysql> alter table tmp_customer drop index master_customer_id;
Query OK, 555 rows affected (0.09 sec)
Records: 555 Duplicates: 0 Warnings: 0
| 265 | 2007-11-30 00:00:00 |
| 266 | 2007-11-30 00:00:00 |
| 267 | 2007-11-30 00:00:00 |
| 268 | 2007-11-30 00:00:00 |
| 269 | 2007-11-20 00:00:00 |
| 270 | 2007-11-30 00:00:00 |
| 271 | 2007-10-31 00:00:00 |
| 272 | 2007-11-26 00:00:00 |
| 273 | 2007-11-28 00:00:00 |
| 274 | 2007-11-29 00:00:00 |
| 275 | 2007-11-30 00:00:00 |
| 276 | 2007-12-05 00:00:00 |
| 277 | 2007-12-09 00:00:00 |
| 278 | 2007-12-12 00:00:00 |
| 279 | 2007-12-13 00:00:00 |
| 280 | 2007-12-13 00:00:00 |
+--------------------+---------------------+
257 rows in set (0.00 sec)
mysql> CREATE TABLE `tmp_customer` (
-> `customer_id` int(11) NOT NULL default '0',
-> `master_customer_id` int(11) default NULL,
-> `cdate` datetime,
-> `balance` bigint(20) default '0',
-> UNIQUE KEY `customer_id` (`customer_id`),
-> KEY `master_customer_id` (`master_customer_id`,`cdate`)
-> ) engine = innodb;
Query OK, 0 rows affected (0.11 sec)
mysql> select master_customer_id, max(cdate)
-> from tmp_customer
-> where master_customer_id is not null group by 1 order by 1
-> ;
| 265 | 2007-11-30 00:00:00 |
| 266 | 2007-11-30 00:00:00 |
| 267 | 2007-11-30 00:00:00 |
| 268 | 2007-11-30 00:00:00 |
| 269 | 2007-11-20 00:00:00 |
| 270 | 2007-11-30 00:00:00 |
| 271 | 2007-10-31 00:00:00 |
| 272 | 2007-11-26 00:00:00 |
| 273 | 2007-11-28 00:00:00 |
| 274 | 2007-11-29 00:00:00 |
| 275 | 2007-11-30 00:00:00 |
| 276 | 2007-12-05 00:00:00 |
| 277 | 2007-12-09 00:00:00 |
| 278 | 2007-12-12 00:00:00 |
| 279 | 2007-12-13 00:00:00 |
| 280 | 2007-12-13 00:00:00 |
+--------------------+---------------------+
257 rows in set (0.00 sec)
[19 Dec 2007 6:54]
Victor Paul
You are right. we are aware that this bug does not effect Innodb. It is a MYISAM storage Engine bug. These techniques can be used to work around the problem add max(customer_id) to query add ignore index(master_customer_id) to query alter table tmp_customer engine=innodb
[14 Feb 2008 13:08]
Georgi Kodinov
This bug is a duplicate of bug #33758. What happens here is that the key buffer in MyISAM was too short to hold the key + the key block pointer. As a result _mi_get_prev_key() call at the end of _mi_search() was overwriting bytes of the key we're searching for (from mi_rkey()) when the key found was not on a leaf page.
