summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2004-05-19 23:20:42 +0400
committerunknown <sergefp@mysql.com>2004-05-19 23:20:42 +0400
commit32f2ecd4751968104fa5c07f5311683e92632c08 (patch)
treedbdbcf11780f6466655401b96976884f9d720c96
parent6e8252a534ae419f1209bb717631849656f5e7eb (diff)
parentea44ccb00f770387bad01eff938866a38d013a75 (diff)
downloadmariadb-git-32f2ecd4751968104fa5c07f5311683e92632c08.tar.gz
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.0
into mysql.com:/dbdata/psergey/mysql-4.0-root
-rw-r--r--mysql-test/r/handler.result12
-rw-r--r--mysql-test/t/handler.test12
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_handler.cc38
4 files changed, 48 insertions, 16 deletions
diff --git a/mysql-test/r/handler.result b/mysql-test/r/handler.result
index 1cfc3a9de8b..50d51cf14f4 100644
--- a/mysql-test/r/handler.result
+++ b/mysql-test/r/handler.result
@@ -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;
diff --git a/mysql-test/t/handler.test b/mysql-test/t/handler.test
index 936902fd9bf..1f7f32c930a 100644
--- a/mysql-test/t/handler.test
+++ b/mysql-test/t/handler.test
@@ -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;
+
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 83dc75e2b84..9663957963f 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -28,7 +28,7 @@ class Load_log_event;
class Slave_log_event;
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
-enum enum_ha_read_modes { RFIRST, RNEXT, RPREV, RLAST, RKEY };
+enum enum_ha_read_modes { RFIRST, RNEXT, RPREV, RLAST, RKEY, RNEXT_SAME };
enum enum_duplicates { DUP_ERROR, DUP_REPLACE, DUP_IGNORE };
enum enum_log_type { LOG_CLOSED, LOG_TO_BE_OPENED, LOG_NORMAL, LOG_NEW, LOG_BIN};
enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON,
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index a80b4040882..022ca76a0af 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -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 };
+ { RNEXT_SAME, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV };
int mysql_ha_read(THD *thd, TABLE_LIST *tables,
@@ -151,6 +151,11 @@ 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;
+ uint key_len;
+ LINT_INIT(key);
+ LINT_INIT(key_len);
if (!lock)
goto err0; // mysql_lock_tables() printed error message already
@@ -183,41 +188,44 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
DBUG_ASSERT(keyname != 0);
err=table->file->index_prev(table->record[0]);
break;
+ case RNEXT_SAME:
+ /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */
+ DBUG_ASSERT(keyname != 0);
+ err= table->file->index_next_same(table->record[0], key, key_len);
+ break;
case RKEY:
{
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),
- MYF(0),keyinfo->key_parts);
- goto err;
+ my_printf_error(ER_TOO_MANY_KEY_PARTS,ER(ER_TOO_MANY_KEY_PARTS),
+ MYF(0),keyinfo->key_parts);
+ goto err;
}
List_iterator_fast<Item> it_ke(*key_expr);
Item *item;
for (key_len=0 ; (item=it_ke++) ; key_part++)
{
- if (item->fix_fields(thd, tables))
- goto err;
- if (item->used_tables() & ~RAND_TABLE_BIT)
+ if (item->fix_fields(thd, tables))
+ goto err;
+ if (item->used_tables() & ~RAND_TABLE_BIT)
{
my_error(ER_WRONG_ARGUMENTS,MYF(0),"HANDLER ... READ");
- goto err;
+ goto err;
}
- item->save_in_field(key_part->field, 1);
- key_len+=key_part->store_length;
+ item->save_in_field(key_part->field, 1);
+ key_len+=key_part->store_length;
}
if (!(key= (byte*) thd->calloc(ALIGN_SIZE(key_len))))
{
- send_error(&thd->net,ER_OUTOFMEMORY);
- goto err;
+ send_error(&thd->net,ER_OUTOFMEMORY);
+ goto err;
}
key_copy(key, table, keyno, key_len);
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];
break;
}