Commit 575a46a1 authored by unknown's avatar unknown
Browse files

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 062a1b8b
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -132,6 +132,22 @@ a b
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
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 t2 read first;
a	b
+10 −0
Original line number Diff line number Diff line
@@ -69,6 +69,16 @@ handler t2 read next;
handler t2 read last;
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 t2 read first;
alter table t1 engine=innodb;
+27 −15
Original line number Diff line number Diff line
@@ -433,8 +433,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
              cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1)))
    goto err0;

  table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it

  if (keyname)
  {
    if ((keyno=find_type(keyname, &table->keynames, 1+2)-1)<0)
@@ -443,8 +441,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
          keyname,tables->alias);
      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))
@@ -471,9 +467,22 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
  for (num_rows=0; num_rows < select_limit; )
  {
    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:
      if (keyname)
      {
        table->file->ha_index_or_rnd_end();
        table->file->ha_index_init(keyno);
        err=table->file->index_first(table->record[0]);
      }
      else
      {
        table->file->ha_index_or_rnd_end();
@@ -482,20 +491,21 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
      }
      mode=RNEXT;
      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:
      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]);
      mode=RPREV;
      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:
      /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...)  */
      DBUG_ASSERT(keyname != 0);
@@ -535,6 +545,8 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
	goto err;
      }
      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],
				  key,key_len,ha_rkey_mode);
      mode=rkey_to_rnext[(int)ha_rkey_mode];