Files

359 lines
14 KiB
Plaintext

# TestSetPartitionPruneMode
set @@session.tidb_partition_prune_mode = DEFAULT;
show warnings;
set @@global.tidb_partition_prune_mode = DEFAULT;
show warnings;
connect (conn1, localhost, root,,);
select @@global.tidb_partition_prune_mode;
select @@session.tidb_partition_prune_mode;
set @@session.tidb_partition_prune_mode = "static";
show warnings;
set @@global.tidb_partition_prune_mode = "static";
show warnings;
connection default;
disconnect conn1;
connect (conn1, localhost, root,,);
select @@session.tidb_partition_prune_mode;
show warnings;
select @@global.tidb_partition_prune_mode;
set @@session.tidb_partition_prune_mode = "dynamic";
show warnings;
set @@global.tidb_partition_prune_mode = "dynamic";
show warnings;
connection default;
disconnect conn1;
connect (conn1, localhost, root,,);
select @@global.tidb_partition_prune_mode;
select @@session.tidb_partition_prune_mode;
connection default;
disconnect conn1;
set @@session.tidb_partition_prune_mode = DEFAULT;
set @@global.tidb_partition_prune_mode = DEFAULT;
# TestFourReader
drop table if exists pt;
create table pt (id int, c int, key i_id(id), key i_c(c)) partition by range (c) (
partition p0 values less than (4),
partition p1 values less than (7),
partition p2 values less than (10));
analyze table pt;
insert into pt values (0, 0), (2, 2), (4, 4), (6, 6), (7, 7), (9, 9), (null, null);
--sorted_result
select * from pt;
select * from pt where c > 10;
select * from pt where c > 8;
--sorted_result
select * from pt where c < 2 or c >= 9;
--sorted_result
select c from pt;
select c from pt where c > 10;
select c from pt where c > 8;
--sorted_result
select c from pt where c < 2 or c >= 9;
--sorted_result
select /*+ use_index(pt, i_id) */ * from pt;
select /*+ use_index(pt, i_id) */ * from pt where id < 4 and c > 10;
select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c > 8;
--sorted_result
select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9;
set @@tidb_enable_index_merge = 1;
--sorted_result
select /*+ use_index(i_c, i_id) */ * from pt where id = 4 or c < 7;
set @@tidb_enable_index_merge = DEFAULT;
# TestPartitionIndexJoin
drop table if exists p, t;
create table p (id int, c int, key i_id(id), key i_c(c)) partition by range (c) (
partition p0 values less than (4),
partition p1 values less than (7),
partition p2 values less than (10));
create table t (id int);
insert into p values (3,3), (4,4), (6,6), (9,9);
insert into t values (4), (9);
--sorted_result
select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id;
--sorted_result
select /*+ INL_JOIN(p) */ p.id from p, t where p.id = t.id;
drop table if exists p, t;
create table p (id int, c int, key i_id(id), key i_c(c)) partition by list (c) (
partition p0 values in (1,2,3,4),
partition p1 values in (5,6,7),
partition p2 values in (8, 9,10));
create table t (id int);
insert into p values (3,3), (4,4), (6,6), (9,9);
insert into t values (4), (9);
--sorted_result
select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id;
--sorted_result
select /*+ INL_JOIN(p) */ p.id from p, t where p.id = t.id;
drop table if exists p, t;
create table p (id int, c int, key i_id(id), key i_c(c)) partition by hash(c) partitions 5;
create table t (id int);
insert into p values (3,3), (4,4), (6,6), (9,9);
insert into t values (4), (9);
--sorted_result
select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id;
--sorted_result
select /*+ INL_JOIN(p) */ p.id from p, t where p.id = t.id;
# TestPartitionUnionScanIndexJoin
# For issue https://github.com/pingcap/tidb/issues/19152
drop table if exists t1, t2;
create table t1 (c_int int, c_str varchar(40), primary key (c_int)) partition by range (c_int) ( partition p0 values less than (10), partition p1 values less than maxvalue);
create table t2 (c_int int, c_str varchar(40), primary key (c_int, c_str)) partition by hash (c_int) partitions 4;
insert into t1 values (10, 'interesting neumann');
insert into t2 select * from t1;
begin;
insert into t2 values (11, 'hopeful hoover');
select /*+ INL_JOIN(t1,t2) */ * from t1 join t2 on t1.c_int = t2.c_int and t1.c_str = t2.c_str where t1.c_int in (10, 11);
select /*+ INL_HASH_JOIN(t1,t2) */ * from t1 join t2 on t1.c_int = t2.c_int and t1.c_str = t2.c_str where t1.c_int in (10, 11);
commit;
# TestPartitionReaderUnderApply
## For issue 19458.
drop table if exists t;
create table t(c_int int);
insert into t values(1), (2), (3), (4), (5), (6), (7), (8), (9);
DROP TABLE IF EXISTS `t1`;
CREATE TABLE t1 (
c_int int NOT NULL,
c_str varchar(40) NOT NULL,
c_datetime datetime NOT NULL,
c_timestamp timestamp NULL DEFAULT NULL,
c_double double DEFAULT NULL,
c_decimal decimal(12,6) DEFAULT NULL,
PRIMARY KEY (c_int,c_str,c_datetime)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
PARTITION BY RANGE (c_int)
(PARTITION p0 VALUES LESS THAN (2) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (4) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (6) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (8) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (10) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (50) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (1000000000) ENGINE = InnoDB);
INSERT INTO `t1` VALUES (19,'nifty feistel','2020-02-28 04:01:28','2020-02-04 06:11:57',32.430079,1.284000),(20,'objective snyder','2020-04-15 17:55:04','2020-05-30 22:04:13',37.690874,9.372000);
begin;
insert into t1 values (22, 'wizardly saha', '2020-05-03 16:35:22', '2020-05-03 02:18:42', 96.534810, 0.088);
select c_int from t where (select min(t1.c_int) from t1 where t1.c_int > t.c_int) > (select count(*) from t1 where t1.c_int > t.c_int) order by c_int;
rollback;
## For issue 19450.
drop table if exists t1, t2;
create table t1 (c_int int, c_str varchar(40), c_decimal decimal(12, 6), primary key (c_int));
create table t2 (c_int int, c_str varchar(40), c_decimal decimal(12, 6), primary key (c_int)) partition by hash (c_int) partitions 4;
insert into t1 values (1, 'romantic robinson', 4.436), (2, 'stoic chaplygin', 9.826), (3, 'vibrant shamir', 6.300), (4, 'hungry wilson', 4.900), (5, 'naughty swartz', 9.524);
insert into t2 select * from t1;
--sorted_result
select * from t1 where c_decimal in (select c_decimal from t2 where t1.c_int = t2.c_int or t1.c_int = t2.c_int and t1.c_str > t2.c_str);
# For issue 19450 release-4.0
set @@tidb_partition_prune_mode='static';
--sorted_result
select * from t1 where c_decimal in (select c_decimal from t2 where t1.c_int = t2.c_int or t1.c_int = t2.c_int and t1.c_str > t2.c_str);
set @@tidb_partition_prune_mode=default;
# TestImproveCoverage
drop table if exists coverage_rr, coverage_dt;
create table coverage_rr (
pk1 varchar(35) NOT NULL,
pk2 int NOT NULL,
c int,
PRIMARY KEY (pk1,pk2)) partition by hash(pk2) partitions 4;
create table coverage_dt (pk1 varchar(35), pk2 int);
insert into coverage_rr values ('ios', 3, 2),('android', 4, 7),('linux',5,1);
insert into coverage_dt values ('apple',3),('ios',3),('linux',5);
set @@tidb_partition_prune_mode = 'dynamic';
--sorted_result
select /*+ INL_JOIN(dt, rr) */ * from coverage_dt dt join coverage_rr rr on (dt.pk1 = rr.pk1 and dt.pk2 = rr.pk2);
--sorted_result
select /*+ INL_MERGE_JOIN(dt, rr) */ * from coverage_dt dt join coverage_rr rr on (dt.pk1 = rr.pk1 and dt.pk2 = rr.pk2);
set @@tidb_partition_prune_mode = default;
# TestOrderByOnUnsignedPk
drop table if exists tunsigned_hash;
create table tunsigned_hash(a bigint unsigned primary key) partition by hash(a) partitions 6;
insert into tunsigned_hash values(25), (9279808998424041135);
select min(a) from tunsigned_hash;
select max(a) from tunsigned_hash;
# TestPartitionHandleWithKeepOrder
# https://github.com/pingcap/tidb/issues/44312
drop table if exists t, t1;
create table t (id int not null, store_id int not null )partition by range (store_id)(partition p0 values less than (6),partition p1 values less than (11),partition p2 values less than (16),partition p3 values less than (21));
create table t1(id int not null, store_id int not null);
insert into t values (1, 1);
insert into t values (2, 17);
insert into t1 values (0, 18);
alter table t exchange partition p3 with table t1;
alter table t add index idx(id);
analyze table t;
--sorted_result
select *,_tidb_rowid from t use index(idx) order by id limit 2;
drop table t, t1;
create table t (a int, b int, c int, key `idx_ac`(a, c), key `idx_bc`(b, c))partition by range (b)(partition p0 values less than (6),partition p1 values less than (11),partition p2 values less than (16),partition p3 values less than (21));
create table t1 (a int, b int, c int, key `idx_ac`(a, c), key `idx_bc`(b, c));
insert into t values (1,2,3), (2,3,4), (3,4,5);
insert into t1 values (1,18,3);
alter table t exchange partition p3 with table t1;
analyze table t;
--sorted_result
select * from t where a = 1 or b = 5 order by c limit 2;
# TestOrderByOnHandle
## indexLookUp + _tidb_rowid
drop table if exists t;
CREATE TABLE `t`(`a` int(11) NOT NULL,`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,KEY `idx_b` (`b`)) PARTITION BY HASH (`a`) PARTITIONS 2;
insert into t values (2,-1,3), (3,2,2), (1,1,1);
select * from t use index(idx_b) order by b, _tidb_rowid limit 10;
analyze table t;
select * from t use index(idx_b) order by b, _tidb_rowid limit 10;
## indexLookUp + pkIsHandle
drop table if exists t;
CREATE TABLE `t`(`a` int(11) NOT NULL,`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,primary key(`a`),KEY `idx_b` (`b`)) PARTITION BY HASH (`a`) PARTITIONS 2;
insert into t values (2,-1,3), (3,2,2), (1,1,1);
select * from t use index(idx_b) order by b, a limit 10;
analyze table t;
select * from t use index(idx_b) order by b, a limit 10;
## indexMerge + _tidb_rowid
drop table if exists t;
CREATE TABLE `t`(`a` int(11) NOT NULL,`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,KEY `idx_b` (`b`),KEY `idx_c` (`c`)) PARTITION BY HASH (`a`) PARTITIONS 2;
insert into t values (2,-1,3), (3,2,2), (1,1,1);
select * from t use index(idx_b, idx_c) where b = 1 or c = 2 order by _tidb_rowid limit 10;
analyze table t;
select * from t use index(idx_b, idx_c) where b = 1 or c = 2 order by _tidb_rowid limit 10;
## indexMerge + pkIsHandle
drop table if exists t;
CREATE TABLE `t`(`a` int(11) NOT NULL,`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,KEY `idx_b` (`b`),KEY `idx_c` (`c`),PRIMARY KEY (`a`)) PARTITION BY HASH (`a`) PARTITIONS 2;
insert into t values (2,-1,3), (3,2,2), (1,1,1);
select * from t use index(idx_b, idx_c) where b = 1 or c = 2 order by a limit 10;
analyze table t;
select * from t use index(idx_b, idx_c) where b = 1 or c = 2 order by a limit 10;
# TestDynamicModeByDefault
drop table if exists trange, thash;
create table trange(a int, b int, primary key(a) clustered, index idx_b(b)) partition by range(a) (
partition p0 values less than(300),
partition p1 values less than(500),
partition p2 values less than(1100));
create table thash(a int, b int, primary key(a) clustered, index idx_b(b)) partition by hash(a) partitions 4;
analyze table thash, trange;
explain format='plan_tree' select * from trange where a>400;
explain format='plan_tree' select * from thash where a>=100;
# TestAddDropPartitions
drop table if exists t;
set @@tidb_partition_prune_mode = 'dynamic';
create table t(a int) partition by range(a) (
partition p0 values less than (5),
partition p1 values less than (10),
partition p2 values less than (15));
insert into t values (2), (7), (12);
analyze table t all columns;
explain format='plan_tree' select * from t where a < 3;
--sorted_result
select * from t where a < 3;
explain format='plan_tree' select * from t where a < 8;
--sorted_result
select * from t where a < 8;
explain format='plan_tree' select * from t where a < 20;
--sorted_result
select * from t where a < 20;
alter table t drop partition p0;
explain format='plan_tree' select * from t where a < 3;
--sorted_result
select * from t where a < 3;
explain format='plan_tree' select * from t where a < 8;
--sorted_result
select * from t where a < 8;
explain format='plan_tree' select * from t where a < 20;
--sorted_result
select * from t where a < 20;
alter table t add partition (partition p3 values less than (20));
alter table t add partition (partition p4 values less than (40));
insert into t values (15), (25);
explain format='plan_tree' select * from t where a < 3;
--sorted_result
select * from t where a < 3;
explain format='plan_tree' select * from t where a < 8;
--sorted_result
select * from t where a < 8;
explain format='plan_tree' select * from t where a < 20;
--sorted_result
select * from t where a < 20;
# TestPartitionPruningInTransaction
drop table if exists t;
create table t(a int, b int) partition by range(a) (partition p0 values less than(3), partition p1 values less than (5), partition p2 values less than(11));
analyze table t;
set @@tidb_partition_prune_mode = 'static';
begin;
explain format='plan_tree' select * from t;
--sorted_result
select * from t;
explain format='plan_tree' select * from t where a > 3;
--sorted_result
select * from t where a > 3;
explain format='plan_tree' select * from t where a > 7;
--sorted_result
select * from t where a > 7;
rollback;
set @@tidb_partition_prune_mode = 'dynamic';
begin;
explain format='plan_tree' select * from t;
--sorted_result
select * from t;
explain format='plan_tree' select * from t where a > 3;
--sorted_result
select * from t where a > 3;
explain format='plan_tree' select * from t where a > 7;
--sorted_result
select * from t where a > 7;
rollback;
set @@tidb_partition_prune_mode = default;
# TestPartitionOnMissing
drop table if exists tt1, tt2;
set global tidb_partition_prune_mode='dynamic';
set session tidb_partition_prune_mode='dynamic';
CREATE TABLE tt1 (
id INT NOT NULL,
listid INT,
name varchar(10),
primary key (listid) clustered
)
PARTITION BY LIST (listid) (
PARTITION p1 VALUES IN (1),
PARTITION p2 VALUES IN (2),
PARTITION p3 VALUES IN (3),
PARTITION p4 VALUES IN (4)
);
CREATE TABLE tt2 (
id INT NOT NULL,
listid INT
);
create index idx_listid on tt1(id,listid);
create index idx_listid on tt2(listid);
insert into tt1 values(1,1,1);
insert into tt1 values(2,2,2);
insert into tt1 values(3,3,3);
insert into tt1 values(4,4,4);
insert into tt2 values(1,1);
insert into tt2 values(2,2);
insert into tt2 values(3,3);
insert into tt2 values(4,4);
insert into tt2 values(5,5);
analyze table tt1;
analyze table tt2;
select /*+ inl_join(tt1)*/ count(*) from tt2
left join tt1 on tt1.listid=tt2.listid and tt1.id=tt2.id;
select /*+ inl_join(tt1)*/ count(*) from tt2
left join tt1 on tt1.listid=tt2.listid;
explain format = 'plan_tree' select /*+ inl_join(tt1)*/ count(*) from tt2
left join tt1 on tt1.listid=tt2.listid;
set global tidb_partition_prune_mode=default;
set session tidb_partition_prune_mode=default;