Commit da04e3fe authored by unknown's avatar unknown

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 527f80b8
...@@ -191,3 +191,15 @@ Ok ...@@ -191,3 +191,15 @@ Ok
handler t close; handler t close;
use test; use test;
drop table t1; 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;
...@@ -123,3 +123,15 @@ handler t close; ...@@ -123,3 +123,15 @@ handler t close;
use test; use test;
drop table t1; 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;
...@@ -103,7 +103,7 @@ int mysql_ha_closeall(THD *thd, TABLE_LIST *tables) ...@@ -103,7 +103,7 @@ int mysql_ha_closeall(THD *thd, TABLE_LIST *tables)
} }
static enum enum_ha_read_modes rkey_to_rnext[]= 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, int mysql_ha_read(THD *thd, TABLE_LIST *tables,
...@@ -151,6 +151,10 @@ 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); HANDLER_TABLES_HACK(thd);
MYSQL_LOCK *lock=mysql_lock_tables(thd,&tables->table,1); MYSQL_LOCK *lock=mysql_lock_tables(thd,&tables->table,1);
HANDLER_TABLES_HACK(thd); HANDLER_TABLES_HACK(thd);
byte *key= NULL;
uint key_len;
LINT_INIT(key_len); /* protected by key key variable */
if (!lock) if (!lock)
goto err0; // mysql_lock_tables() printed error message already goto err0; // mysql_lock_tables() printed error message already
...@@ -184,12 +188,17 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -184,12 +188,17 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
err=table->file->index_prev(table->record[0]); err=table->file->index_prev(table->record[0]);
break; break;
case RKEY: 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); DBUG_ASSERT(keyname != 0);
KEY *keyinfo=table->key_info+keyno; KEY *keyinfo=table->key_info+keyno;
KEY_PART_INFO *key_part=keyinfo->key_part; KEY_PART_INFO *key_part=keyinfo->key_part;
uint key_len;
byte *key;
if (key_expr->elements > keyinfo->key_parts) if (key_expr->elements > keyinfo->key_parts)
{ {
my_printf_error(ER_TOO_MANY_KEY_PARTS,ER(ER_TOO_MANY_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, ...@@ -219,6 +228,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
err=table->file->index_read(table->record[0], err=table->file->index_read(table->record[0],
key,key_len,ha_rkey_mode); key,key_len,ha_rkey_mode);
mode=rkey_to_rnext[(int)ha_rkey_mode]; mode=rkey_to_rnext[(int)ha_rkey_mode];
}
break; break;
} }
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment