mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
af7a22d2fa
The problem was that because there was no good indexes for the lineitem table make_join_select() tried to do a last attempt to find a usable key and called test_quick_select(). test_quick_select() found an index with fewer matching rows then every before and that caused a problem in get_range_limit_read_cost(), which assumes that 'best_rows' is the minium rows matched when all conditions has been taken into account and thus smaller than rows found in the range. Fixed by adjusting best_rows to the least rows in any index after test_quick_select() has been called.
252 lines
15 KiB
Text
252 lines
15 KiB
Text
#
|
|
# Range optimizer (and related) tests that need InnoDB.
|
|
#
|
|
#
|
|
# MDEV-6735: Range checked for each record used with key
|
|
#
|
|
create table t0(a int);
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
create table t2 (
|
|
a int,
|
|
b int,
|
|
filler1 char(100),
|
|
filler2 char(100),
|
|
filler3 char(100),
|
|
filler4 char(100),
|
|
key(a),
|
|
key(b)
|
|
) engine=innodb;
|
|
insert into t2
|
|
select
|
|
seq,seq,
|
|
repeat('0123456789', 10),
|
|
repeat('0123456789', 10),
|
|
repeat('0123456789', 10),
|
|
repeat('0123456789', 10)
|
|
from seq_0_to_9999;
|
|
analyze table t2;
|
|
Table Op Msg_type Msg_text
|
|
test.t2 analyze status Engine-independent statistics collected
|
|
test.t2 analyze status OK
|
|
# The following must not use "Range checked for each record":
|
|
explain select * from t0 left join t2 on t2.a <t0.a and t2.b between 50 and 250;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t0 ALL NULL NULL NULL NULL 10
|
|
1 SIMPLE t2 range a,b b 5 NULL 201 Using where; Using join buffer (flat, BNL join)
|
|
drop table t0,t2;
|
|
#
|
|
# MDEV-10466: constructing an invalid SEL_ARG
|
|
#
|
|
create table t1 (
|
|
pk int, a int, b int,
|
|
primary key (pk), index idx1(b), index idx2(b)
|
|
) engine=innodb STATS_AUTO_RECALC=0;
|
|
Warnings:
|
|
Note 1831 Duplicate index `idx2`. This is deprecated and will be disallowed in a future release
|
|
insert into t1 values (1,6,0),(2,1,0),(3,5,2),(4,8,0);
|
|
create table t2 (c int) engine=innodb STATS_AUTO_RECALC=0;
|
|
insert into t2 values (1),(2);
|
|
create table t3 (d int) engine=innodb STATS_AUTO_RECALC=0;
|
|
insert into t3 values (3),(-1),(4);
|
|
set @save_optimizer_switch=@@optimizer_switch;
|
|
set optimizer_switch='extended_keys=on';
|
|
explain
|
|
select pk, a, b from t1,t2,t3 where b >= d and pk < c and b = '0';
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref PRIMARY,idx1,idx2 idx1 5 const #
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL # Using where; Using join buffer (flat, BNL join)
|
|
1 SIMPLE t3 ALL NULL NULL NULL NULL # Using where; Using join buffer (incremental, BNL join)
|
|
select pk, a, b from t1,t2,t3 where b >= d and pk < c and b = '0';
|
|
pk a b
|
|
1 6 0
|
|
set optimizer_switch=@save_optimizer_switch;
|
|
drop table t1,t2,t3;
|
|
CREATE TABLE t1 (
|
|
pk INT PRIMARY KEY, f1 INT, f2 CHAR(1), f3 CHAR(1),
|
|
KEY(f1), KEY(f2)
|
|
) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES
|
|
(1,4,'v',NULL),(2,6,'v',NULL),(3,7,'c',NULL),(4,1,'e',NULL),(5,0,'x',NULL),
|
|
(6,7,'i',NULL),(7,7,'e',NULL),(8,1,'p',NULL),(9,7,'s',NULL),(10,1,'j',NULL),
|
|
(11,5,'z',NULL),(12,2,'c',NULL),(13,0,'a',NULL),(14,1,'q',NULL),(15,8,'y',NULL),
|
|
(16,1,'m',NULL),(17,1,'r',NULL),(18,9,'v',NULL),(19,1,'n',NULL);
|
|
CREATE TABLE t2 (f4 INT, f5 CHAR(1)) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (4,'q'),(NULL,'j');
|
|
SELECT * FROM t1 AS t1_1, t1 AS t1_2, t2
|
|
WHERE f5 = t1_2.f2 AND ( t1_1.f1 = 103 AND t1_1.f2 = 'o' OR t1_1.pk < f4 );
|
|
pk f1 f2 f3 pk f1 f2 f3 f4 f5
|
|
1 4 v NULL 14 1 q NULL 4 q
|
|
2 6 v NULL 14 1 q NULL 4 q
|
|
3 7 c NULL 14 1 q NULL 4 q
|
|
drop table t1,t2;
|
|
#
|
|
# MDEV-14440: Server crash in in handler::ha_external_lock or Assertion `inited==RND'
|
|
# failed in handler::ha_rnd_end upon SELECT from partitioned table
|
|
#
|
|
call mtr.add_suppression("Got error .* when reading table");
|
|
set @optimizer_switch_save= @@optimizer_switch;
|
|
set optimizer_switch='index_merge_sort_intersection=off';
|
|
create table t0(a int);
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
create table t1 (
|
|
a int, b int, c int,
|
|
key(a),key(b),key(c)
|
|
)engine=innodb;
|
|
insert into t1
|
|
select a.seq/10, a.seq/10, a.seq from seq_0_to_499 a, seq_0_to_4 b;
|
|
SET @saved_dbug = @@GLOBAL.debug_dbug;
|
|
set @@global.debug_dbug="+d,ha_index_init_fail";
|
|
explain select * from t1 where a=10 and b=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 1 Using intersect(a,b); Using where
|
|
select * from t1 where a=10 and b=10;
|
|
ERROR HY000: Table definition has changed, please retry transaction
|
|
DROP TABLE t0,t1;
|
|
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
|
set @@optimizer_switch= @optimizer_switch_save;
|
|
# End of 10.1 tests
|
|
#
|
|
# MDEV-27262: Index intersection with full scan over an index
|
|
#
|
|
CREATE TABLE t1 (
|
|
id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
|
p char(32) DEFAULT NULL,
|
|
es tinyint(3) unsigned NOT NULL DEFAULT 0,
|
|
er tinyint(3) unsigned NOT NULL DEFAULT 0,
|
|
x mediumint(8) unsigned NOT NULL DEFAULT 0,
|
|
PRIMARY KEY (id),
|
|
INDEX es (es),
|
|
INDEX x (x),
|
|
INDEX er (er,x),
|
|
INDEX p (p)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
insert into t1(es,er) select 0, 1 from seq_1_to_45;
|
|
insert into t1(es,er) select 0, 2 from seq_1_to_49;
|
|
insert into t1(es,er) select 0, 3 from seq_1_to_951;
|
|
insert into t1(es,er) select 0, 3 from seq_1_to_1054;
|
|
insert into t1(es,er) select 0, 6 from seq_1_to_25;
|
|
insert into t1(es,er) select 0, 11 from seq_1_to_1;
|
|
insert into t1(es,er) select 1, 1 from seq_1_to_45;
|
|
insert into t1(es,er) select 1, 2 from seq_1_to_16;
|
|
insert into t1(es,er) select 1, 3 from seq_1_to_511;
|
|
insert into t1(es,er) select 1, 4 from seq_1_to_687;
|
|
insert into t1(es,er) select 1, 6 from seq_1_to_50;
|
|
insert into t1(es,er) select 1, 7 from seq_1_to_4;
|
|
insert into t1(es,er) select 1, 11 from seq_1_to_1;
|
|
insert into t1(es,er) select 2, 1 from seq_1_to_82;
|
|
insert into t1(es,er) select 2, 2 from seq_1_to_82;
|
|
insert into t1(es,er) select 2, 3 from seq_1_to_1626;
|
|
insert into t1(es,er) select 2, 4 from seq_1_to_977;
|
|
insert into t1(es,er) select 2, 6 from seq_1_to_33;
|
|
insert into t1(es,er) select 2, 11 from seq_1_to_1;
|
|
insert into t1(es,er) select 3, 1 from seq_1_to_245;
|
|
insert into t1(es,er) select 3, 2 from seq_1_to_81;
|
|
insert into t1(es,er) select 3, 3 from seq_1_to_852;
|
|
insert into t1(es,er) select 3, 4 from seq_1_to_2243;
|
|
insert into t1(es,er) select 3, 6 from seq_1_to_44;
|
|
insert into t1(es,er) select 3, 11 from seq_1_to_1;
|
|
insert into t1(es,er) select 4, 1 from seq_1_to_91;
|
|
insert into t1(es,er) select 4, 2 from seq_1_to_83;
|
|
insert into t1(es,er) select 4, 3 from seq_1_to_297;
|
|
insert into t1(es,er) select 4, 4 from seq_1_to_2456;
|
|
insert into t1(es,er) select 4, 6 from seq_1_to_19;
|
|
insert into t1(es,er) select 4, 11 from seq_1_to_1;
|
|
update t1 set p='foobar';
|
|
update t1 set x=0;
|
|
set @save_isp=@@innodb_stats_persistent;
|
|
set global innodb_stats_persistent= 1;
|
|
analyze table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status Engine-independent statistics collected
|
|
test.t1 analyze status OK
|
|
set optimizer_switch='index_merge_sort_intersection=on';
|
|
SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er != 4) OR er = 4 ) AND (es >= 4) LIMIT 2;
|
|
id p es er x
|
|
14645 foobar 4 4 0
|
|
14646 foobar 4 4 0
|
|
EXPLAIN EXTENDED SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er != 4) OR er = 4 ) AND (es >= 4) LIMIT 2;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 range es,er,p es 1 NULL # 100.00 Using index condition; Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`p` AS `p`,`test`.`t1`.`es` AS `es`,`test`.`t1`.`er` AS `er`,`test`.`t1`.`x` AS `x` from `test`.`t1` where (`test`.`t1`.`p` = 'foo' and `test`.`t1`.`er` <> 4 or `test`.`t1`.`er` = 4) and `test`.`t1`.`es` >= 4 limit 2
|
|
set optimizer_switch='index_merge_sort_intersection=off';
|
|
SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er != 4) OR er = 4 ) AND (es >= 4) LIMIT 2;
|
|
id p es er x
|
|
14645 foobar 4 4 0
|
|
14646 foobar 4 4 0
|
|
EXPLAIN EXTENDED SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er != 4) OR er = 4 ) AND (es >= 4) LIMIT 2;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 range es,er,p es 1 NULL # 100.00 Using index condition; Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`p` AS `p`,`test`.`t1`.`es` AS `es`,`test`.`t1`.`er` AS `er`,`test`.`t1`.`x` AS `x` from `test`.`t1` where (`test`.`t1`.`p` = 'foo' and `test`.`t1`.`er` <> 4 or `test`.`t1`.`er` = 4) and `test`.`t1`.`es` >= 4 limit 2
|
|
set optimizer_switch='index_merge_sort_intersection=on';
|
|
SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er < 6) OR er >=2 ) AND (es >= 4) LIMIT 2;
|
|
id p es er x
|
|
14007 foobar 4 2 0
|
|
14008 foobar 4 2 0
|
|
EXPLAIN EXTENDED SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er < 6) OR er >=2 ) AND (es >= 4) LIMIT 2;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 range es,er,p es 1 NULL # 100.00 Using index condition; Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`p` AS `p`,`test`.`t1`.`es` AS `es`,`test`.`t1`.`er` AS `er`,`test`.`t1`.`x` AS `x` from `test`.`t1` where (`test`.`t1`.`p` = 'foo' and `test`.`t1`.`er` < 6 or `test`.`t1`.`er` >= 2) and `test`.`t1`.`es` >= 4 limit 2
|
|
set optimizer_switch='index_merge_sort_intersection=off';
|
|
SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er < 6) OR er >=2 ) AND (es >= 4) LIMIT 2;
|
|
id p es er x
|
|
14007 foobar 4 2 0
|
|
14008 foobar 4 2 0
|
|
EXPLAIN EXTENDED SELECT * FROM t1
|
|
WHERE ((p = 'foo' AND er < 6) OR er >=2 ) AND (es >= 4) LIMIT 2;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 range es,er,p es 1 NULL # 100.00 Using index condition; Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`p` AS `p`,`test`.`t1`.`es` AS `es`,`test`.`t1`.`er` AS `er`,`test`.`t1`.`x` AS `x` from `test`.`t1` where (`test`.`t1`.`p` = 'foo' and `test`.`t1`.`er` < 6 or `test`.`t1`.`er` >= 2) and `test`.`t1`.`es` >= 4 limit 2
|
|
set optimizer_switch='index_merge_sort_intersection=default';
|
|
set global innodb_stats_persistent= @save_isp;
|
|
DROP TABLE t1;
|
|
# End of 10.2 tests
|
|
#
|
|
# MDEV-19634: Assertion `0' failed in row_sel_convert_mysql_key_to_innobase,
|
|
# [Warning] InnoDB: Using a partial-field key prefix in search
|
|
#
|
|
CREATE TABLE t1 (
|
|
pk INT,
|
|
a VARCHAR(1),
|
|
b INT,
|
|
PRIMARY KEY (pk),
|
|
KEY (a,b)
|
|
) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1,'a',1),(2,'b',2);
|
|
explain SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 range PRIMARY,a PRIMARY 4 NULL 1 Using where
|
|
SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0;
|
|
a
|
|
drop table t1;
|
|
# End of 10.4 tests
|
|
#
|
|
# MDEV-31501 Assertion `cond_selectivity <= 1.000000001' failed
|
|
# (actual value 1.125)
|
|
#
|
|
CREATE TABLE lineitem (l_orderkey int(11) NOT NULL DEFAULT '0', l_partkey int(11) DEFAULT NULL, l_suppkey int(11) DEFAULT NULL, l_linenumber int(11) NOT NULL DEFAULT '0', l_quantity double DEFAULT NULL, l_extendedprice double DEFAULT NULL, l_discount double DEFAULT NULL, l_tax double DEFAULT NULL, l_returnflag char(1) DEFAULT NULL, l_linestatus char(1) DEFAULT NULL, l_shipDATE date DEFAULT NULL, l_commitDATE date DEFAULT NULL, l_receiptDATE date DEFAULT NULL, l_shipinstruct char(25) DEFAULT NULL, l_shipmode char(10) DEFAULT NULL, l_comment varchar(44) DEFAULT NULL, PRIMARY KEY (l_orderkey,l_linenumber), KEY i_l_shipdate (l_shipDATE), KEY i_l_suppkey_partkey (l_partkey,l_suppkey), KEY i_l_partkey (l_partkey), KEY i_l_suppkey (l_suppkey), KEY i_l_receiptdate (l_receiptDATE), KEY i_l_orderkey (l_orderkey), KEY i_l_orderkey_quantity (l_orderkey,l_quantity), KEY i_l_commitdate (l_commitDATE)) ENGINE=InnoDB;
|
|
CREATE TABLE part (p_partkey int(11) NOT NULL, p_name varchar(55) DEFAULT NULL, p_mfgr char(25) DEFAULT NULL, p_brand char(10) DEFAULT NULL, p_type varchar(25) DEFAULT NULL, p_size int(11) DEFAULT NULL, p_container char(10) DEFAULT NULL, p_retailprice double DEFAULT NULL, p_comment varchar(23) DEFAULT NULL, PRIMARY KEY (p_partkey)) ENGINE=InnoDB;
|
|
CREATE TABLE partsupp (ps_partkey int(11) NOT NULL DEFAULT '0', ps_suppkey int(11) NOT NULL DEFAULT '0', ps_availqty int(11) DEFAULT NULL, ps_supplycost double DEFAULT NULL, ps_comment varchar(199) DEFAULT NULL, PRIMARY KEY (ps_partkey,ps_suppkey), KEY i_ps_partkey (ps_partkey), KEY i_ps_suppkey (ps_suppkey)) ENGINE=InnoDB;
|
|
INSERT INTO lineitem VALUES (581,7,1,1,41,37187,0.09,0.07,'N','O','1997-05-26','1997-04-06','1997-06-10','TAKE BACK RETURN','MAIL','even, bold excuses about the'),(581,10,1,2,14,12740.14,0.06,0.08,'N','O','1997-05-17','1997-04-14','1997-06-08','NONE','MAIL','furiously silent depths'),(581,11,1,3,49,44639.49,0.1,0.02,'N','O','1997-02-27','1997-04-24','1997-03-10','TAKE BACK RETURN','MAIL','furiously regular theodolites wake qu'),(581,8,1,4,30,27240,0.1,0.08,'N','O','1997-06-19','1997-05-21','1997-06-22','TAKE BACK RETURN','TRUCK','even deposits wa'),(582,6,1,1,7,6342,0.07,0,'N','O','1997-11-16','1997-11-29','1997-12-10','TAKE BACK RETURN','FOB','carefully final requests sleep slyly. even,'),(582,6,1,2,49,44394,0.05,0.03,'N','O','1997-12-17','1998-01-12','1997-12-31','COLLECT COD','REG AIR','carefully regular'),(582,15,1,3,42,38430.42,0.07,0,'N','O','1997-11-15','1997-12-21','1997-12-03','COLLECT COD','SHIP','pending, spe'),(582,17,1,4,36,33012.36,0.06,0.01,'N','O','1997-12-09','1997-11-27','1997-12-26','TAKE BACK RETURN','SHIP','slyly final foxes nag permanen');
|
|
INSERT INTO part VALUES (1,'goldenrod lace spring peru powder','Manufacturer#1','Brand#13','PROMO BURNISHED COPPER',7,'JUMBO PKG',901,'final deposits s'),(2,'blush rosy metallic lemon navajo','Manufacturer#1','Brand#13','LARGE BRUSHED BRASS',1,'LG CASE',902,'final platelets hang f'),(3,'dark green antique puff wheat','Manufacturer#4','Brand#42','STANDARD POLISHED BRASS',21,'WRAP CASE',903,'unusual excuses ac'),(4,'chocolate metallic smoke ghost drab','Manufacturer#3','Brand#34','SMALL PLATED BRASS',14,'MED DRUM',904,'ironi'),(5,'forest blush chiffon thistle chocolate','Manufacturer#3','Brand#32','STANDARD POLISHED TIN',15,'SM PKG',905,'pending, spe'),(6,'white ivory azure firebrick black','Manufacturer#2','Brand#24','PROMO PLATED STEEL',4,'MED BAG',906,'pending pinto be'),(7,'blue blanched tan indian olive','Manufacturer#1','Brand#11','SMALL PLATED COPPER',45,'SM BAG',907,'blithely ironic');
|
|
INSERT INTO partsupp VALUES (1,1,3325,771.64,'requests after the carefully ironic ideas cajole alongside of the enticingly special accounts. fluffily regular deposits haggle about the blithely ironic deposits. regular requests sleep c'),(2,1,8895,378.49,'furiously even asymptotes are furiously regular plate'),(3,1,4651,920.92,'ironic, pending theodolites sleep slyly at the slyly final foxes. slyly ironic accounts sleep express accounts. quickly fina'),(4,1,1339,113.97,'furiously even accounts sleep. slyly regular deposits hag'),(5,1,3735,255.88,'even, ironic requests snooze blithely throughout the carefully pending deposits. busy deposits mold blithely after the furiously final pinto beans. regular, unus'),(6,1,8851,130.72,'carefully regular asymptotes wake slyly according to the quickly re'),(7,1,7454,763.98,'carefully even ideas should wake. blithely final instructions are special foxes. pending, ironic requests wake blithely about the furiously regular foxes. ironic idea'),(8,1,6834,249.63,'furiously unusual instructions use quickly. unusual deposits among the regular deposits doze unusual epitaph'),(9,1,7054,84.2,'final ideas through the requests boost quickly about the furiously regular accounts. blithely silent foxes affix carefully ironic instructions. blithely bold foxe'),(10,1,2952,996.12,'blithely even foxes nag furiously about the quickly ex'),(11,1,4540,709.87,'final packages mold after the carefully unusual requests. quickly fi'),(12,1,3610,659.73,'unusual dolphins sleep slyly. ironic deposits use fluffily. carefully unusual platelets poach slyly. evenly pending deposits nag ironi'),(13,1,612,169.44,'blithely special theodolites serve quickly. regular deposits are alongside of the fluffily sl'),(14,1,5278,650.07,'quickly even deposits doze quickly pending, bold deposits. carefully regular packages sublate carefully'),(15,1,7047,835.7,'packages haggle across the carefully express ideas. slyly bold instructions promise even, express packages. furiously ironic acc');
|
|
SELECT ps_suppkey FROM part
|
|
JOIN partsupp ON (p_partkey = ps_partkey)
|
|
JOIN lineitem ON (ps_partkey = l_partkey AND ps_suppkey = l_suppkey)
|
|
WHERE p_partkey != 222 order by 1 limit 1;
|
|
ps_suppkey
|
|
1
|
|
drop table partsupp,part,lineitem;
|
|
#
|
|
# End of 11.0 tests
|
|
#
|