Commit 8becc506 authored by sergefp@mysql.com's avatar sergefp@mysql.com

Fix for BUG33649: Post-review fixes

parent 482058be
...@@ -28,7 +28,7 @@ class Load_log_event; ...@@ -28,7 +28,7 @@ class Load_log_event;
class Slave_log_event; class Slave_log_event;
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE }; 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_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_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, enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON,
......
...@@ -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[]=
{ RKEY, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV }; { RNEXT_SAME, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV };
int mysql_ha_read(THD *thd, TABLE_LIST *tables, int mysql_ha_read(THD *thd, TABLE_LIST *tables,
...@@ -152,9 +152,10 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -152,9 +152,10 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
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; byte *key;
uint key_len; uint key_len;
LINT_INIT(key_len); /* protected by key key variable */ LINT_INIT(key);
LINT_INIT(key_len);
if (!lock) if (!lock)
goto err0; // mysql_lock_tables() printed error message already goto err0; // mysql_lock_tables() printed error message already
...@@ -187,48 +188,45 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -187,48 +188,45 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
err=table->file->index_prev(table->record[0]); err=table->file->index_prev(table->record[0]);
break; 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: case RKEY:
{ {
if (key) DBUG_ASSERT(keyname != 0);
KEY *keyinfo=table->key_info+keyno;
KEY_PART_INFO *key_part=keyinfo->key_part;
if (key_expr->elements > keyinfo->key_parts)
{ {
/* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */ my_printf_error(ER_TOO_MANY_KEY_PARTS,ER(ER_TOO_MANY_KEY_PARTS),
err= table->file->index_next_same(table->record[0], key, key_len); MYF(0),keyinfo->key_parts);
goto err;
} }
else List_iterator_fast<Item> it_ke(*key_expr);
Item *item;
for (key_len=0 ; (item=it_ke++) ; key_part++)
{ {
DBUG_ASSERT(keyname != 0); if (item->fix_fields(thd, tables))
KEY *keyinfo=table->key_info+keyno;
KEY_PART_INFO *key_part=keyinfo->key_part;
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; goto err;
} if (item->used_tables() & ~RAND_TABLE_BIT)
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)
{
my_error(ER_WRONG_ARGUMENTS,MYF(0),"HANDLER ... READ");
goto err;
}
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); my_error(ER_WRONG_ARGUMENTS,MYF(0),"HANDLER ... READ");
goto err; goto err;
} }
key_copy(key, table, keyno, key_len); item->save_in_field(key_part->field, 1);
err=table->file->index_read(table->record[0], key_len+=key_part->store_length;
key,key_len,ha_rkey_mode); }
mode=rkey_to_rnext[(int)ha_rkey_mode]; if (!(key= (byte*) thd->calloc(ALIGN_SIZE(key_len))))
{
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);
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