Bug #2754 Index error when using order by and limit on indexes
Submitted: 12 Feb 2004 10:24 Modified: 26 Mar 2004 11:05
Reporter: Jeremy Lichfield Email Updates:
Status: No Feedback Impact on me:
None 
Category:MySQL Server: Command-line Clients Severity:S1 (Critical)
Version:4.0.17 OS:MacOS (Mac OS X and RedHat 9)
Assigned to: CPU Architecture:Any

[12 Feb 2004 10:24] Jeremy Lichfield
Description:
Index error when using order by and limit on indexes. Here is an example:

CREATE TABLE USERS_MAIN (
  ID bigint(20) NOT NULL auto_increment,
  DATE_CREATED datetime NOT NULL default '0000-00-00 00:00:00',
  DATE_MOD datetime default NULL,
  MERIT_DATE date NULL default NULL,
  RELATIONSHIP varchar(40) NOT NULL default '',
  TIME_ZONE enum('mt','at','ht','pt','ct','et','lt') NOT NULL default 'mt',
  ACTIVE enum('y','n') NOT NULL default 'y',
  STATUS enum('on','off') NOT NULL default 'on',
  FIRST_NAME varchar(25) NOT NULL default '',
  LAST_NAME varchar(25) NOT NULL default '',
  USERNAME varchar(20) NOT NULL default '',
  PASSWORD varchar(20) NOT NULL default '',
  SID varchar(20) default NULL,
  LOCK_OUT int(1) default NULL,
  LOCKED enum('n','y') NOT NULL default 'n',
  ADMIN_USERNAME bigint(20) default NULL,
  IP_ADDRESS varchar(20) default NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY USERNAME (USERNAME),
  KEY RELATIONSHIP (RELATIONSHIP),
  KEY FIRST_NAME (FIRST_NAME),
  KEY LAST_NAME (LAST_NAME),
  KEY ACTIVE (ACTIVE),
  KEY STATUS (STATUS),
  KEY SID (SID),
  KEY LOCK_OUT (LOCK_OUT),
  KEY LOCKED (LOCKED)
) TYPE=MyISAM;

select ID,LOCKED,FIRST_NAME,LAST_NAME,RELATIONSHIP,STATUS from USERS_MAIN where ACTIVE 
= 'y' and RELATIONSHIP != 'parent' order by RELATIONSHIP limit 0, 50;
ERROR 1030: Got error 124 from table handler

How to repeat:
Here is an example:

CREATE TABLE USERS_MAIN (
  ID bigint(20) NOT NULL auto_increment,
  DATE_CREATED datetime NOT NULL default '0000-00-00 00:00:00',
  DATE_MOD datetime default NULL,
  MERIT_DATE date NULL default NULL,
  RELATIONSHIP varchar(40) NOT NULL default '',
  TIME_ZONE enum('mt','at','ht','pt','ct','et','lt') NOT NULL default 'mt',
  ACTIVE enum('y','n') NOT NULL default 'y',
  STATUS enum('on','off') NOT NULL default 'on',
  FIRST_NAME varchar(25) NOT NULL default '',
  LAST_NAME varchar(25) NOT NULL default '',
  USERNAME varchar(20) NOT NULL default '',
  PASSWORD varchar(20) NOT NULL default '',
  SID varchar(20) default NULL,
  LOCK_OUT int(1) default NULL,
  LOCKED enum('n','y') NOT NULL default 'n',
  ADMIN_USERNAME bigint(20) default NULL,
  IP_ADDRESS varchar(20) default NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY USERNAME (USERNAME),
  KEY RELATIONSHIP (RELATIONSHIP),
  KEY FIRST_NAME (FIRST_NAME),
  KEY LAST_NAME (LAST_NAME),
  KEY ACTIVE (ACTIVE),
  KEY STATUS (STATUS),
  KEY SID (SID),
  KEY LOCK_OUT (LOCK_OUT),
  KEY LOCKED (LOCKED)
) TYPE=MyISAM;

select ID,LOCKED,FIRST_NAME,LAST_NAME,RELATIONSHIP,STATUS from USERS_MAIN where ACTIVE 
= 'y' and RELATIONSHIP != 'parent' order by RELATIONSHIP limit 0, 50;
ERROR 1030: Got error 124 from table handler

Notice when I do an explain it is not using filesort:

+------------+-------+---------------+--------------+---------+------+------
+-------------+
| table      | type  | possible_keys | key          | key_len | ref  | rows | Extra       |
+------------+-------+---------------+--------------+---------+------+------
+-------------+
| USERS_MAIN | index | NULL          | RELATIONSHIP |      40 | NULL |   76 | Using where |
+------------+-------+---------------+--------------+---------+------+------
+-------------+

Suggested fix:
I'm not an expert at this, however I do know that this same querry worked on earilier versions of 
mysql: 3.23. It appears it is not recognizing the order by key?
[24 Feb 2004 10:57] MySQL Verification Team
Can't repeat it with 4.0.18.

We need a snippet of your table that would help us reproduce it.

You can upload it here, under "Files" tab.
[24 Feb 2004 10:58] MySQL Verification Team
This is what I have got:
mysql> CREATE TABLE USERS_MAIN (
    ->   ID bigint(20) NOT NULL auto_increment,
    ->   DATE_CREATED datetime NOT NULL default '0000-00-00 00:00:00',
    ->   DATE_MOD datetime default NULL,
    ->   MERIT_DATE date NULL default NULL,
    ->   RELATIONSHIP varchar(40) NOT NULL default '',
    ->   TIME_ZONE enum('mt','at','ht','pt','ct','et','lt') NOT NULL default 'mt',
    ->   ACTIVE enum('y','n') NOT NULL default 'y',
    ->   STATUS enum('on','off') NOT NULL default 'on',
    ->   FIRST_NAME varchar(25) NOT NULL default '',
    ->   LAST_NAME varchar(25) NOT NULL default '',
    ->   USERNAME varchar(20) NOT NULL default '',
    ->   PASSWORD varchar(20) NOT NULL default '',
    ->   SID varchar(20) default NULL,
    ->   LOCK_OUT int(1) default NULL,
    ->   LOCKED enum('n','y') NOT NULL default 'n',
    ->   ADMIN_USERNAME bigint(20) default NULL,
    ->   IP_ADDRESS varchar(20) default NULL,
    ->   PRIMARY KEY (ID),
    ->   UNIQUE KEY USERNAME (USERNAME),
    ->   KEY RELATIONSHIP (RELATIONSHIP),
    ->   KEY FIRST_NAME (FIRST_NAME),
    ->   KEY LAST_NAME (LAST_NAME),
    ->   KEY ACTIVE (ACTIVE),
    ->   KEY STATUS (STATUS),
    ->   KEY SID (SID),
    ->   KEY LOCK_OUT (LOCK_OUT),
    ->   KEY LOCKED (LOCKED)
    -> ) TYPE=MyISAM;
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> show tables;
+---------------+
| Tables_in_bug |
+---------------+
| USERS_MAIN    |
+---------------+
1 row in set (0.00 sec)

mysql> select ID,LOCKED,FIRST_NAME,LAST_NAME,RELATIONSHIP,STATUS from USERS_MAIN where
    -> ACTIVE 
    -> = 'y' and RELATIONSHIP != 'parent' order by RELATIONSHIP limit 0, 50;
Empty set (0.08 sec)
[26 Feb 2004 11:05] Jeremy Lichfield
I dumped the database tables and reloaded it. Now I don't get any errors? I'm not sure what was 
wrong now? I know the repair table syntax did not work. Thanks for your help.

Jeremy
[14 Feb 2005 22:54] Bugs System
No feedback was provided for this bug for over a month, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".