mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
index_merge_innodb did sometimes give wrong results
Fixed by adding more rows to a table Other things: - Speed up index_merge tests 20% by adding begin/commit around loops that generated rows.
This commit is contained in:
parent
48810a0014
commit
8840045021
8 changed files with 34 additions and 2 deletions
|
@ -37,12 +37,14 @@ insert into t0 values (1),(2),(3),(4),(5),(6),(7),(8);
|
||||||
|
|
||||||
let $1=7;
|
let $1=7;
|
||||||
set @d=8;
|
set @d=8;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t0 select key1+@d from t0;
|
eval insert into t0 select key1+@d from t0;
|
||||||
eval set @d=@d*2;
|
eval set @d=@d*2;
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
alter table t0 add key2 int not null, add index i2(key2);
|
alter table t0 add key2 int not null, add index i2(key2);
|
||||||
|
@ -365,6 +367,7 @@ INSERT INTO t1 VALUES ('foo','bar', 'ZZ'),('fuz','baz', 'ZZ');
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
let $1=9;
|
let $1=9;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval INSERT INTO t1 SELECT * from t1 WHERE cola = 'foo';
|
eval INSERT INTO t1 SELECT * from t1 WHERE cola = 'foo';
|
||||||
|
@ -377,6 +380,7 @@ while ($1)
|
||||||
eval INSERT INTO t1 SELECT * from t1 WHERE cola <> 'foo';
|
eval INSERT INTO t1 SELECT * from t1 WHERE cola <> 'foo';
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
|
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
|
|
|
@ -34,11 +34,13 @@ create table t1
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
let $1=200;
|
let $1=200;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t1 values (200-$1, $1);
|
eval insert into t1 values (200-$1, $1);
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
# No primary key
|
# No primary key
|
||||||
|
@ -80,11 +82,13 @@ create table t1 (
|
||||||
show warnings;
|
show warnings;
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
let $1=30;
|
let $1=30;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t1 (key1, key2, filler) values ($1/4, $1/8, 'filler-data');
|
eval insert into t1 (key1, key2, filler) values ($1/4, $1/8, 'filler-data');
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
explain select pk from t1 where key1 = 1 and key2 = 1;
|
explain select pk from t1 where key1 = 1 and key2 = 1;
|
||||||
select pk from t1 where key2 = 1 and key1 = 1;
|
select pk from t1 where key2 = 1 and key1 = 1;
|
||||||
|
@ -331,16 +335,20 @@ insert into t1(key1) values (1),(2),(3),(4),(5),(6),(7),(8);
|
||||||
|
|
||||||
let $1=7;
|
let $1=7;
|
||||||
set @d=8;
|
set @d=8;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t1 (key1) select key1+@d from t1;
|
eval insert into t1 (key1) select key1+@d from t1;
|
||||||
eval set @d=@d*2;
|
eval set @d=@d*2;
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
|
|
||||||
alter table t1 add index i2(key2);
|
alter table t1 add index i2(key2);
|
||||||
alter table t1 add index i3(key3);
|
alter table t1 add index i3(key3);
|
||||||
update t1 set key2=key1,key3=key1;
|
update t1 set key2=key1,key3=key1;
|
||||||
|
|
||||||
|
insert into t1 select 10000+key1, 10000+key2,10000+key3 from t1;
|
||||||
analyze table t1;
|
analyze table t1;
|
||||||
|
|
||||||
# to test the bug, the following must use "sort_union":
|
# to test the bug, the following must use "sort_union":
|
||||||
|
|
|
@ -32,12 +32,14 @@ create table t1 (
|
||||||
|
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
|
begin;
|
||||||
let $1=1000;
|
let $1=1000;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t1 values($1, $1, $1, 'filler-data','filler-data-2');
|
eval insert into t1 values($1, $1, $1, 'filler-data','filler-data-2');
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
select * from t1 where (key1 >= 2 and key1 <= 10) or (pk >= 4 and pk <=8 );
|
select * from t1 where (key1 >= 2 and key1 <= 10) or (pk >= 4 and pk <=8 );
|
||||||
|
|
|
@ -67,18 +67,21 @@ create table t1
|
||||||
create table t0 as select * from t1;
|
create table t0 as select * from t1;
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--echo # Printing of many insert into t0 values (....) disabled.
|
--echo # Printing of many insert into t0 values (....) disabled.
|
||||||
|
begin;
|
||||||
let $cnt=1000;
|
let $cnt=1000;
|
||||||
while ($cnt)
|
while ($cnt)
|
||||||
{
|
{
|
||||||
eval insert into t0 values (1, 2, 3, 1, 2, 3, 0, 0, 0, 0, 'data1', 'data2', 'data3', 'data4', 'data5', 'data6');
|
eval insert into t0 values (1, 2, 3, 1, 2, 3, 0, 0, 0, 0, 'data1', 'data2', 'data3', 'data4', 'data5', 'data6');
|
||||||
dec $cnt;
|
dec $cnt;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
alter table t1 disable keys;
|
alter table t1 disable keys;
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--echo # Printing of many insert into t1 select .... from t0 disabled.
|
--echo # Printing of many insert into t1 select .... from t0 disabled.
|
||||||
let $1=4;
|
let $1=4;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
let $2=4;
|
let $2=4;
|
||||||
|
@ -94,6 +97,7 @@ while ($1)
|
||||||
}
|
}
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
|
|
||||||
--echo # Printing of many insert into t1 (...) values (....) disabled.
|
--echo # Printing of many insert into t1 (...) values (....) disabled.
|
||||||
# Row retrieval tests
|
# Row retrieval tests
|
||||||
|
@ -101,6 +105,7 @@ while ($1)
|
||||||
# insert enough rows for index intersection to be used for (key1,key2)
|
# insert enough rows for index intersection to be used for (key1,key2)
|
||||||
insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, 100, 100,'key1-key2-key3-key4');
|
insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, 100, 100,'key1-key2-key3-key4');
|
||||||
let $cnt=400;
|
let $cnt=400;
|
||||||
|
begin;
|
||||||
while ($cnt)
|
while ($cnt)
|
||||||
{
|
{
|
||||||
eval insert into t1 (key1, key2, key3, key4, filler1) values (100, -1, 100, -1,'key1-key3');
|
eval insert into t1 (key1, key2, key3, key4, filler1) values (100, -1, 100, -1,'key1-key3');
|
||||||
|
@ -112,6 +117,7 @@ while ($cnt)
|
||||||
eval insert into t1 (key1, key2, key3, key4, filler1) values (-1, 100, -1, 100,'key2-key4');
|
eval insert into t1 (key1, key2, key3, key4, filler1) values (-1, 100, -1, 100,'key2-key4');
|
||||||
dec $cnt;
|
dec $cnt;
|
||||||
}
|
}
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
alter table t1 enable keys;
|
alter table t1 enable keys;
|
||||||
select count(*) from t1;
|
select count(*) from t1;
|
||||||
|
@ -249,6 +255,7 @@ create table t2 (
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
let $1=8;
|
let $1=8;
|
||||||
|
begin;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t2 values (repeat(char($1+64), 8),repeat(char($1+64), 8),'filler1', 'filler2');
|
eval insert into t2 values (repeat(char($1+64), 8),repeat(char($1+64), 8),'filler1', 'filler2');
|
||||||
|
@ -256,6 +263,7 @@ while ($1)
|
||||||
}
|
}
|
||||||
insert into t2 select * from t2;
|
insert into t2 select * from t2;
|
||||||
insert into t2 select * from t2;
|
insert into t2 select * from t2;
|
||||||
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
# The table row buffer is reused. Fill it with rows that don't match.
|
# The table row buffer is reused. Fill it with rows that don't match.
|
||||||
|
|
|
@ -56,14 +56,14 @@ create table t1
|
||||||
);
|
);
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
set autocommit=0;
|
begin;
|
||||||
let $1=10000;
|
let $1=10000;
|
||||||
while ($1)
|
while ($1)
|
||||||
{
|
{
|
||||||
eval insert into t1 values ($1 div 10,$1 mod 100, $1/100,$1/100, $1/100,$1/100,$1/100,$1/100,$1/100, $1 mod 100, $1/1000,'filler-data-$1','filler2');
|
eval insert into t1 values ($1 div 10,$1 mod 100, $1/100,$1/100, $1/100,$1/100,$1/100,$1/100,$1/100, $1 mod 100, $1/1000,'filler-data-$1','filler2');
|
||||||
dec $1;
|
dec $1;
|
||||||
}
|
}
|
||||||
set autocommit=1;
|
commit;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
# Verify that range scan on CPK is ROR
|
# Verify that range scan on CPK is ROR
|
||||||
|
|
|
@ -296,6 +296,7 @@ key3 int not null default 0
|
||||||
);
|
);
|
||||||
insert into t1(key1) values (1),(2),(3),(4),(5),(6),(7),(8);
|
insert into t1(key1) values (1),(2),(3),(4),(5),(6),(7),(8);
|
||||||
set @d=8;
|
set @d=8;
|
||||||
|
begin;
|
||||||
insert into t1 (key1) select key1+@d from t1;
|
insert into t1 (key1) select key1+@d from t1;
|
||||||
set @d=@d*2;
|
set @d=@d*2;
|
||||||
insert into t1 (key1) select key1+@d from t1;
|
insert into t1 (key1) select key1+@d from t1;
|
||||||
|
@ -310,9 +311,11 @@ insert into t1 (key1) select key1+@d from t1;
|
||||||
set @d=@d*2;
|
set @d=@d*2;
|
||||||
insert into t1 (key1) select key1+@d from t1;
|
insert into t1 (key1) select key1+@d from t1;
|
||||||
set @d=@d*2;
|
set @d=@d*2;
|
||||||
|
commit;
|
||||||
alter table t1 add index i2(key2);
|
alter table t1 add index i2(key2);
|
||||||
alter table t1 add index i3(key3);
|
alter table t1 add index i3(key3);
|
||||||
update t1 set key2=key1,key3=key1;
|
update t1 set key2=key1,key3=key1;
|
||||||
|
insert into t1 select 10000+key1, 10000+key2,10000+key3 from t1;
|
||||||
analyze table t1;
|
analyze table t1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 analyze status Engine-independent statistics collected
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
@ -675,6 +678,7 @@ a int,
|
||||||
b int,
|
b int,
|
||||||
INDEX idx(a))
|
INDEX idx(a))
|
||||||
ENGINE=INNODB;
|
ENGINE=INNODB;
|
||||||
|
begin;
|
||||||
INSERT INTO t1(a,b) VALUES
|
INSERT INTO t1(a,b) VALUES
|
||||||
(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
|
(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
|
||||||
(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
|
(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
|
||||||
|
@ -694,6 +698,7 @@ INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
||||||
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
||||||
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
||||||
INSERT INTO t1 VALUES (1000000, 0, 0);
|
INSERT INTO t1 VALUES (1000000, 0, 0);
|
||||||
|
commit;
|
||||||
SET SESSION sort_buffer_size = 1024*36;
|
SET SESSION sort_buffer_size = 1024*36;
|
||||||
set @tmp_optimizer_switch=@@optimizer_switch;
|
set @tmp_optimizer_switch=@@optimizer_switch;
|
||||||
set optimizer_switch='derived_merge=off,derived_with_keys=off';
|
set optimizer_switch='derived_merge=off,derived_with_keys=off';
|
||||||
|
|
|
@ -47,6 +47,7 @@ CREATE TABLE t1 (
|
||||||
INDEX idx(a))
|
INDEX idx(a))
|
||||||
ENGINE=INNODB;
|
ENGINE=INNODB;
|
||||||
|
|
||||||
|
begin;
|
||||||
INSERT INTO t1(a,b) VALUES
|
INSERT INTO t1(a,b) VALUES
|
||||||
(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
|
(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
|
||||||
(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
|
(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
|
||||||
|
@ -66,6 +67,7 @@ INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
||||||
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
||||||
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
INSERT INTO t1(a,b) SELECT a,b FROM t1;
|
||||||
INSERT INTO t1 VALUES (1000000, 0, 0);
|
INSERT INTO t1 VALUES (1000000, 0, 0);
|
||||||
|
commit;
|
||||||
|
|
||||||
SET SESSION sort_buffer_size = 1024*36;
|
SET SESSION sort_buffer_size = 1024*36;
|
||||||
set @tmp_optimizer_switch=@@optimizer_switch;
|
set @tmp_optimizer_switch=@@optimizer_switch;
|
||||||
|
|
|
@ -1135,6 +1135,7 @@ key3 int not null default 0
|
||||||
);
|
);
|
||||||
insert into t1(key1) values (1),(2),(3),(4),(5),(6),(7),(8);
|
insert into t1(key1) values (1),(2),(3),(4),(5),(6),(7),(8);
|
||||||
set @d=8;
|
set @d=8;
|
||||||
|
begin;
|
||||||
insert into t1 (key1) select key1+@d from t1;
|
insert into t1 (key1) select key1+@d from t1;
|
||||||
set @d=@d*2;
|
set @d=@d*2;
|
||||||
insert into t1 (key1) select key1+@d from t1;
|
insert into t1 (key1) select key1+@d from t1;
|
||||||
|
@ -1149,9 +1150,11 @@ insert into t1 (key1) select key1+@d from t1;
|
||||||
set @d=@d*2;
|
set @d=@d*2;
|
||||||
insert into t1 (key1) select key1+@d from t1;
|
insert into t1 (key1) select key1+@d from t1;
|
||||||
set @d=@d*2;
|
set @d=@d*2;
|
||||||
|
commit;
|
||||||
alter table t1 add index i2(key2);
|
alter table t1 add index i2(key2);
|
||||||
alter table t1 add index i3(key3);
|
alter table t1 add index i3(key3);
|
||||||
update t1 set key2=key1,key3=key1;
|
update t1 set key2=key1,key3=key1;
|
||||||
|
insert into t1 select 10000+key1, 10000+key2,10000+key3 from t1;
|
||||||
analyze table t1;
|
analyze table t1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 analyze status Engine-independent statistics collected
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
|
Loading…
Reference in a new issue