Commit f63d8c8d authored by unknown's avatar unknown
Browse files

BUG#25048 - ERROR 126 : Incorrect key file for table '.XXXX.MYI'; try to

            repair it

Multi-table delete that is optimized with QUICK_RANGE reports table
corruption.

DELETE statement must not use KEYREAD optimization, and sets
table->no_keyread to 1. This was ignored in QUICK_RANGE optimization.

With this fix QUICK_RANGE optimization honors table->no_keyread
value and does not enable KEYREAD when it is requested.


mysql-test/r/index_merge.result:
  Fixed a test case according to fix for bug#25048.
mysql-test/r/index_merge_ror.result:
  A test case for bug#25048.
mysql-test/t/index_merge_ror.test:
  A test case for bug#25048.
sql/opt_range.cc:
  Do not use key read when head->no_keyread is set.
parent 16b596bf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -284,7 +284,7 @@ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL
explain select * from (select * from t1 where key1 = 3 or key2 =3) as Z where key8 >5;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	<derived2>	system	NULL	NULL	NULL	NULL	1	
2	DERIVED	t1	index_merge	i1,i2	i1,i2	4,4	NULL	2	Using union(i1,i2); Using where
2	DERIVED	t1	index_merge	i1,i2	i1,i2	4,4	NULL	2	Using union(i1,i2); Using where; Using index
create table t3 like t0;
insert into t3 select * from t0;
alter table t3 add key9 int not null, add index i9(key9);
+11 −0
Original line number Diff line number Diff line
@@ -194,3 +194,14 @@ explain select a from t2 where a='ab';
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t2	ref	a	a	6	const	1	Using where
drop table t2;
CREATE TABLE t1(c1 INT, c2 INT DEFAULT 0, c3 CHAR(255) DEFAULT '',
KEY(c1), KEY(c2), KEY(c3));
INSERT INTO t1(c1) VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
INSERT INTO t1 VALUES(0,0,0);
CREATE TABLE t2(c1 int);
INSERT INTO t2 VALUES(1);
DELETE t1 FROM t1,t2 WHERE t1.c1=0 AND t1.c2=0;
SELECT * FROM t1;
c1	c2	c3
DROP TABLE t1,t2;
+15 −0
Original line number Diff line number Diff line
@@ -250,3 +250,18 @@ select count(a) from t2 ignore index(a,b) where a='AAAAAAAA' and b='AAAAAAAA';
insert into t2 values ('ab', 'ab', 'uh', 'oh');
explain select a from t2 where a='ab';
drop table t2;

#
# BUG#25048 - ERROR 126 : Incorrect key file for table '.XXXX.MYI'; try to
#             repair it
#
CREATE TABLE t1(c1 INT, c2 INT DEFAULT 0, c3 CHAR(255) DEFAULT '',
KEY(c1), KEY(c2), KEY(c3));
INSERT INTO t1(c1) VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
INSERT INTO t1 VALUES(0,0,0);
CREATE TABLE t2(c1 int);
INSERT INTO t2 VALUES(1);
DELETE t1 FROM t1,t2 WHERE t1.c1=0 AND t1.c2=0;
SELECT * FROM t1;
DROP TABLE t1,t2;
+17 −6
Original line number Diff line number Diff line
@@ -875,7 +875,11 @@ QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT()
    if (file) 
    {
      range_end();
      if (head->key_read)
      {
        head->key_read= 0;
        file->extra(HA_EXTRA_NO_KEYREAD);
      }
      if (free_file)
      {
        DBUG_PRINT("info", ("Freeing separate handler 0x%lx (free: %d)", (long) file,
@@ -1017,8 +1021,12 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
  if (reuse_handler)
  {
    DBUG_PRINT("info", ("Reusing handler %p", file));
    if (file->extra(HA_EXTRA_KEYREAD) ||
        file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
    if (!head->no_keyread)
    {
      head->key_read= 1;
      file->extra(HA_EXTRA_KEYREAD);
    }
    if (file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
        init() || reset())
    {
      DBUG_RETURN(1);
@@ -1041,9 +1049,12 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
  }
  if (file->external_lock(thd, F_RDLCK))
    goto failure;

  if (file->extra(HA_EXTRA_KEYREAD) ||
      file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
  if (!head->no_keyread)
  {
    head->key_read= 1;
    file->extra(HA_EXTRA_KEYREAD);
  }
  if (file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
      init() || reset())
  {
    file->external_lock(thd, F_UNLCK);