Fix for bug #54007: assert in ha_myisam::index_next, HANDLER
Problem: the server missed the fact that one can read from 2 indexes alternately using HANDLER interface. Fix: check if the same (initialized) index is involved reading next/prev values from the index.
This commit is contained in:
parent
5932330839
commit
3058f4a136
@ -769,4 +769,97 @@ a
|
|||||||
1
|
1
|
||||||
HANDLER t1 CLOSE;
|
HANDLER t1 CLOSE;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# Bug #54007: assert in ha_myisam::index_next , HANDLER
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a), KEY b(b), KEY ab(a, b));
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
a b
|
||||||
|
HANDLER t1 READ `PRIMARY` NEXT;
|
||||||
|
a b
|
||||||
|
HANDLER t1 READ ab NEXT;
|
||||||
|
a b
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
a b
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
a b
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
INSERT INTO t1 VALUES (2, 20), (1, 10), (4, 40), (3, 30);
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
a b
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
HANDLER t1 READ `PRIMARY` NEXT;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
HANDLER t1 READ `PRIMARY` NEXT;
|
||||||
|
a b
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ ab NEXT;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
HANDLER t1 READ ab NEXT;
|
||||||
|
a b
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
a b
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
a b
|
||||||
|
3 30
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
a b
|
||||||
|
4 40
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
a b
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
a b
|
||||||
|
4 40
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
a b
|
||||||
|
3 30
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
a b
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
a b
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ `PRIMARY` PREV;
|
||||||
|
a b
|
||||||
|
4 40
|
||||||
|
HANDLER t1 READ `PRIMARY` PREV;
|
||||||
|
a b
|
||||||
|
3 30
|
||||||
|
HANDLER t1 READ b PREV;
|
||||||
|
a b
|
||||||
|
4 40
|
||||||
|
HANDLER t1 READ b PREV;
|
||||||
|
a b
|
||||||
|
3 30
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
a b
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ `PRIMARY` PREV LIMIT 3;
|
||||||
|
a b
|
||||||
|
4 40
|
||||||
|
3 30
|
||||||
|
2 20
|
||||||
|
HANDLER t1 READ b NEXT LIMIT 5;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
2 20
|
||||||
|
3 30
|
||||||
|
4 40
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -48,4 +48,53 @@ HANDLER t1 READ a NEXT;
|
|||||||
HANDLER t1 CLOSE;
|
HANDLER t1 CLOSE;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #54007: assert in ha_myisam::index_next , HANDLER
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a), KEY b(b), KEY ab(a, b));
|
||||||
|
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
HANDLER t1 READ `PRIMARY` NEXT;
|
||||||
|
HANDLER t1 READ ab NEXT;
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (2, 20), (1, 10), (4, 40), (3, 30);
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
HANDLER t1 READ `PRIMARY` NEXT;
|
||||||
|
HANDLER t1 READ `PRIMARY` NEXT;
|
||||||
|
HANDLER t1 READ ab NEXT;
|
||||||
|
HANDLER t1 READ ab NEXT;
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
HANDLER t1 READ b NEXT;
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
HANDLER t1 READ NEXT;
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
HANDLER t1 READ `PRIMARY` PREV;
|
||||||
|
HANDLER t1 READ `PRIMARY` PREV;
|
||||||
|
HANDLER t1 READ b PREV;
|
||||||
|
HANDLER t1 READ b PREV;
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
|
||||||
|
HANDLER t1 OPEN;
|
||||||
|
HANDLER t1 READ FIRST;
|
||||||
|
HANDLER t1 READ `PRIMARY` PREV LIMIT 3;
|
||||||
|
HANDLER t1 READ b NEXT LIMIT 5;
|
||||||
|
HANDLER t1 CLOSE;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -539,6 +539,14 @@ retry:
|
|||||||
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias);
|
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
/* Check if the same index involved. */
|
||||||
|
if ((uint) keyno != table->file->get_index())
|
||||||
|
{
|
||||||
|
if (mode == RNEXT)
|
||||||
|
mode= RFIRST;
|
||||||
|
else if (mode == RPREV)
|
||||||
|
mode= RLAST;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (insert_fields(thd, &thd->lex->select_lex.context,
|
if (insert_fields(thd, &thd->lex->select_lex.context,
|
||||||
@ -561,9 +569,16 @@ retry:
|
|||||||
case RNEXT:
|
case RNEXT:
|
||||||
if (table->file->inited != handler::NONE)
|
if (table->file->inited != handler::NONE)
|
||||||
{
|
{
|
||||||
error=keyname ?
|
if (keyname)
|
||||||
table->file->index_next(table->record[0]) :
|
{
|
||||||
table->file->rnd_next(table->record[0]);
|
/* Check if we read from the same index. */
|
||||||
|
DBUG_ASSERT((uint) keyno == table->file->get_index());
|
||||||
|
error= table->file->index_next(table->record[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error= table->file->rnd_next(table->record[0]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* else fall through */
|
/* else fall through */
|
||||||
@ -584,6 +599,8 @@ retry:
|
|||||||
break;
|
break;
|
||||||
case RPREV:
|
case RPREV:
|
||||||
DBUG_ASSERT(keyname != 0);
|
DBUG_ASSERT(keyname != 0);
|
||||||
|
/* Check if we read from the same index. */
|
||||||
|
DBUG_ASSERT((uint) keyno == table->file->get_index());
|
||||||
if (table->file->inited != handler::NONE)
|
if (table->file->inited != handler::NONE)
|
||||||
{
|
{
|
||||||
error=table->file->index_prev(table->record[0]);
|
error=table->file->index_prev(table->record[0]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user