summaryrefslogtreecommitdiff
path: root/mysql-test/main/derived_split_innodb.test
blob: d4d7fde1fcdb1ae96cd3f0d44451b3d7ad1e68d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
--source include/have_innodb.inc
--source include/default_optimizer_switch.inc
--source include/have_sequence.inc

--echo #
--echo # MDEV-16917: do not use splitting for derived with join cache
--echo #

CREATE TABLE t1 (
  n1 int(10) NOT NULL,
  n2 int(10) NOT NULL,
  c1 char(1) NOT NULL,
  KEY c1 (c1),
  KEY n1_c1_n2 (n1,c1,n2)
) ENGINE=InnoDB;
INSERT INTO t1 VALUES (0, 2, 'a'), (1, 3, 'a');
insert into t1 select seq+1,seq+2,'c' from seq_1_to_1000;

ANALYZE TABLE t1;

Let $q=
SELECT t1.n1 FROM t1, (SELECT n1, n2 FROM t1 WHERE c1 = 'a' GROUP BY n1) as t
  WHERE t.n1 = t1.n1 AND t.n2 = t1.n2 AND c1 = 'a' GROUP BY n1;

eval EXPLAIN $q;
eval $q;

DROP TABLE t1;

--echo #
--echo # MDEV-17211: splittable materialized derived joining 3 tables with
--echo #             GROUP BY list containing fields from 2 of them
--echo #

CREATE TABLE t1 (
  id1 int, i1 int, id2 int,
  PRIMARY KEY (id1), KEY (i1), KEY (id2)
) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1,1,1);

CREATE TABLE t2 (id2 int, i2 int) ENGINE=InnoDB;
INSERT INTO t2  VALUES (1, 1);

CREATE TABLE t3 (id3 int, i3 int, PRIMARY KEY (id3)) ENGINE=InnoDB;
INSERT INTO t3 VALUES (1,1);

let $q=
SELECT id3
  FROM (SELECT t3.id3, t2.i2, t1.id2  FROM t3,t1,t2
          WHERE t3.i3=t1.id1 AND t2.id2=t1.id2
            GROUP BY t3.id3, t1.id2) AS t,
        t2
    WHERE t2.id2=t.id2;

eval EXPLAIN $q;
eval $q;

DROP TABLE t1,t2,t3;

--echo #
--echo # Bug mdev-17381: equi-join of derived table with join_cache_level=4
--echo #

CREATE TABLE t1 (
  id int NOT NULL,
  amount decimal DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE t2 (
  id int NOT NULL,
  name varchar(50) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;

INSERT INTO t1 VALUES
(1, 10.0000), (2, 20.0000), (3, 30.0000), (4, 40.0000),
(5, NULL), (6, NULL), (7, 70.0000), (8, 80.0000);

INSERT INTO t2 VALUES
(1,'A'), (2,'B'), (3,'C'), (4,'D'), (5, NULL), (6, NULL),
(7,'E'), (8,'F'), (9,'G'), (10,'H'), (11, NULL), (12, NULL);

set join_cache_level=4;

let $q=
SELECT t2.id,t2.name,t.total_amt
  FROM  t2
        LEFT JOIN
        (SELECT id, sum(amount) total_amt FROM t1 GROUP BY id) AS t
        ON t2.id=t.id
  WHERE t2.id < 3;

eval $q;
eval EXPLAIN $q;

set join_cache_level=default;

DROP TABLE t1,t2;

--echo #
--echo # Bug mdev-18467: join of grouping view and a base table as inner operand
--echo #                 of left join with on condition containing impossible range
--echo #

create table t1 (f1 int, f2 int, key(f2)) engine=InnoDB;
insert into t1 values (3,33), (7,77), (1,11);

create table t2 (f1 int, f2 int, primary key (f1)) engine=InnoDB;
insert into t2 values (3,33), (9,99), (1,11);

create view v1 as
  select f1, max(f2) as f2 from t2 group by f1;

let $q=
select t.f2
  from t1
       left join
       (v1 join t1 as t on v1.f1=t.f1 and t.f2 = null)
       on t1.f1=t.f1;

eval $q;
eval explain $q;
eval set statement optimizer_switch='split_materialized=off' for explain $q;

drop view v1;

drop table t1,t2;