mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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.
This commit is contained in:
@ -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;
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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:
|
||||||
|
Reference in New Issue
Block a user