Commit 3fc27f31 authored by unknown's avatar unknown

bug#5373: handler READ NEXT w/o HANDLER READ [FIRST]

check table->file->inited to catch incorrect calling sequence.


mysql-test/r/innodb_handler.result:
  bug#5373: handler READ NEXT w/o HANDLER READ [FIRST]
mysql-test/t/innodb_handler.test:
  bug#5373: handler READ NEXT w/o HANDLER READ [FIRST]
sql/sql_handler.cc:
  cleanup: call index_init *correctly*, not every time.
  check table->file->inited to catch incorrect calling sequence.
parent 7ceda6b2
...@@ -132,6 +132,22 @@ a b ...@@ -132,6 +132,22 @@ a b
handler t2 read last; handler t2 read last;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
handler t2 close; handler t2 close;
handler t1 open;
handler t1 read a next;
a b
14 aaa
handler t1 read a next;
a b
15 bbb
handler t1 close;
handler t1 open;
handler t1 read a prev;
a b
22 iii
handler t1 read a prev;
a b
21 hhh
handler t1 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
a b a b
......
...@@ -69,6 +69,16 @@ handler t2 read next; ...@@ -69,6 +69,16 @@ handler t2 read next;
handler t2 read last; handler t2 read last;
handler t2 close; handler t2 close;
handler t1 open;
handler t1 read a next; # this used to crash as a bug#5373
handler t1 read a next;
handler t1 close;
handler t1 open;
handler t1 read a prev; # this used to crash as a bug#5373
handler t1 read a prev;
handler t1 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
alter table t1 engine=innodb; alter table t1 engine=innodb;
......
...@@ -429,12 +429,10 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -429,12 +429,10 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
tables->table=table; tables->table=table;
if (cond && ((!cond->fixed && if (cond && ((!cond->fixed &&
cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1))) cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1)))
goto err0; goto err0;
table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it
if (keyname) if (keyname)
{ {
if ((keyno=find_type(keyname, &table->keynames, 1+2)-1)<0) if ((keyno=find_type(keyname, &table->keynames, 1+2)-1)<0)
...@@ -443,8 +441,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -443,8 +441,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
keyname,tables->alias); keyname,tables->alias);
goto err0; goto err0;
} }
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
} }
if (insert_fields(thd,tables,tables->db,tables->alias,&it)) if (insert_fields(thd,tables,tables->db,tables->alias,&it))
...@@ -471,9 +467,22 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -471,9 +467,22 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
for (num_rows=0; num_rows < select_limit; ) for (num_rows=0; num_rows < select_limit; )
{ {
switch (mode) { switch (mode) {
case RNEXT:
if (table->file->inited != handler::NONE)
{
err=keyname ?
table->file->index_next(table->record[0]) :
table->file->rnd_next(table->record[0]);
break;
}
/* else fall through */
case RFIRST: case RFIRST:
if (keyname) if (keyname)
{
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
err=table->file->index_first(table->record[0]); err=table->file->index_first(table->record[0]);
}
else else
{ {
table->file->ha_index_or_rnd_end(); table->file->ha_index_or_rnd_end();
...@@ -482,20 +491,21 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -482,20 +491,21 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
mode=RNEXT; mode=RNEXT;
break; break;
case RPREV:
DBUG_ASSERT(keyname != 0);
if (table->file->inited != handler::NONE)
{
err=table->file->index_prev(table->record[0]);
break;
}
/* else fall through */
case RLAST: case RLAST:
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
err=table->file->index_last(table->record[0]); err=table->file->index_last(table->record[0]);
mode=RPREV; mode=RPREV;
break; break;
case RNEXT:
err=keyname ?
table->file->index_next(table->record[0]) :
table->file->rnd_next(table->record[0]);
break;
case RPREV:
DBUG_ASSERT(keyname != 0);
err=table->file->index_prev(table->record[0]);
break;
case RNEXT_SAME: case RNEXT_SAME:
/* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */ /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
...@@ -517,7 +527,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -517,7 +527,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
for (key_len=0 ; (item=it_ke++) ; key_part++) for (key_len=0 ; (item=it_ke++) ; key_part++)
{ {
// 'item' can be changed by fix_fields() call // 'item' can be changed by fix_fields() call
if ((!item->fixed && if ((!item->fixed &&
item->fix_fields(thd, tables, it_ke.ref())) || item->fix_fields(thd, tables, it_ke.ref())) ||
(item= *it_ke.ref())->check_cols(1)) (item= *it_ke.ref())->check_cols(1))
goto err; goto err;
...@@ -535,6 +545,8 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -535,6 +545,8 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
goto err; goto err;
} }
key_copy(key, table, keyno, key_len); key_copy(key, table, keyno, key_len);
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
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];
......
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