Commit cdf7471c authored by unknown's avatar unknown
Browse files

Fix and test case for BUG#3649.


mysql-test/r/handler.result:
  Test case for BUG#3649
mysql-test/t/handler.test:
  Test case for BUG#3649
sql/sql_handler.cc:
  Fix for BUG#3649: when doing an index scan for an equality condition, use index_next_same to retrieve subsequent rows.
parent d4f6c7a4
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -191,3 +191,15 @@ Ok
handler t close;
use test;
drop table t1;
create table t1 ( a int, b int, INDEX a (a) );
insert into t1 values (1,2), (2,1);
handler t1 open;
handler t1 read a=(1) where b=2;
a	b
1	2
handler t1 read a=(1) where b=3;
a	b
handler t1 read a=(1) where b=1;
a	b
handler t1 close;
drop table t1;
+12 −0
Original line number Diff line number Diff line
@@ -123,3 +123,15 @@ handler t close;
use test;
drop table t1;

#
# BUG#3649
#
create table t1 ( a int, b int, INDEX a (a) );
insert into t1 values (1,2), (2,1);
handler t1 open;
handler t1 read a=(1) where b=2;
handler t1 read a=(1) where b=3;
handler t1 read a=(1) where b=1;
handler t1 close;
drop table t1;
+39 −29
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ int mysql_ha_closeall(THD *thd, TABLE_LIST *tables)
}

static enum enum_ha_read_modes rkey_to_rnext[]=
    { RNEXT, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV };
    { RKEY, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV };


int mysql_ha_read(THD *thd, TABLE_LIST *tables,
@@ -151,6 +151,10 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
  HANDLER_TABLES_HACK(thd);
  MYSQL_LOCK *lock=mysql_lock_tables(thd,&tables->table,1);
  HANDLER_TABLES_HACK(thd);
  
  byte *key= NULL;
  uint key_len;
  LINT_INIT(key_len); /* protected by key key variable */
  if (!lock)
     goto err0; // mysql_lock_tables() printed error message already

@@ -184,12 +188,17 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
      err=table->file->index_prev(table->record[0]);
      break;
    case RKEY:
    {
      if (key)
      {
        /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...)  */
        err= table->file->index_next_same(table->record[0], key, key_len);
      }
      else
      {
        DBUG_ASSERT(keyname != 0);
        KEY *keyinfo=table->key_info+keyno;
        KEY_PART_INFO *key_part=keyinfo->key_part;
      uint key_len;
      byte *key;
        if (key_expr->elements > keyinfo->key_parts)
        {
          my_printf_error(ER_TOO_MANY_KEY_PARTS,ER(ER_TOO_MANY_KEY_PARTS),
@@ -219,6 +228,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
        err=table->file->index_read(table->record[0],
                                    key,key_len,ha_rkey_mode);
        mode=rkey_to_rnext[(int)ha_rkey_mode];
      }
      break;
    }
    default: