mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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.
This commit is contained in:
@ -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;
|
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
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
|
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;
|
create table t3 like t0;
|
||||||
insert into t3 select * from t0;
|
insert into t3 select * from t0;
|
||||||
alter table t3 add key9 int not null, add index i9(key9);
|
alter table t3 add key9 int not null, add index i9(key9);
|
||||||
|
@ -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
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref a a 6 const 1 Using where
|
1 SIMPLE t2 ref a a 6 const 1 Using where
|
||||||
drop table t2;
|
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;
|
||||||
|
@ -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');
|
insert into t2 values ('ab', 'ab', 'uh', 'oh');
|
||||||
explain select a from t2 where a='ab';
|
explain select a from t2 where a='ab';
|
||||||
drop table t2;
|
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;
|
||||||
|
@ -875,7 +875,11 @@ QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT()
|
|||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
range_end();
|
range_end();
|
||||||
file->extra(HA_EXTRA_NO_KEYREAD);
|
if (head->key_read)
|
||||||
|
{
|
||||||
|
head->key_read= 0;
|
||||||
|
file->extra(HA_EXTRA_NO_KEYREAD);
|
||||||
|
}
|
||||||
if (free_file)
|
if (free_file)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Freeing separate handler 0x%lx (free: %d)", (long) 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)
|
if (reuse_handler)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Reusing handler %p", file));
|
DBUG_PRINT("info", ("Reusing handler %p", file));
|
||||||
if (file->extra(HA_EXTRA_KEYREAD) ||
|
if (!head->no_keyread)
|
||||||
file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
|
{
|
||||||
|
head->key_read= 1;
|
||||||
|
file->extra(HA_EXTRA_KEYREAD);
|
||||||
|
}
|
||||||
|
if (file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
|
||||||
init() || reset())
|
init() || reset())
|
||||||
{
|
{
|
||||||
DBUG_RETURN(1);
|
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))
|
if (file->external_lock(thd, F_RDLCK))
|
||||||
goto failure;
|
goto failure;
|
||||||
|
if (!head->no_keyread)
|
||||||
if (file->extra(HA_EXTRA_KEYREAD) ||
|
{
|
||||||
file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
|
head->key_read= 1;
|
||||||
|
file->extra(HA_EXTRA_KEYREAD);
|
||||||
|
}
|
||||||
|
if (file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY) ||
|
||||||
init() || reset())
|
init() || reset())
|
||||||
{
|
{
|
||||||
file->external_lock(thd, F_UNLCK);
|
file->external_lock(thd, F_UNLCK);
|
||||||
|
Reference in New Issue
Block a user