summaryrefslogtreecommitdiff
path: root/mysql-test/suite/federated/federatedx_create_handlers.test
blob: 2d6c2bc4197f9e727a55d2083eed2105923f6639 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
--source have_federatedx.inc
--source include/federated.inc
--source include/no_valgrind_without_big.inc
--source include/have_partition.inc

connection default;

set global federated_pushdown=1;

connection slave;

DROP TABLE IF EXISTS federated.t1;

CREATE TABLE federated.t1 (
  id int(20) NOT NULL,
  name varchar(16) NOT NULL default ''
)
DEFAULT CHARSET=latin1;

INSERT INTO federated.t1 VALUES
  (3,'xxx'), (7,'yyy'), (4,'xxx'), (1,'zzz'), (5,'yyy');

DROP TABLE IF EXISTS federated.t2;

CREATE TABLE federated.t2 (
  name varchar(16) NOT NULL default ''
)
DEFAULT CHARSET=latin1;

INSERT INTO federated.t2 VALUES
  ('yyy'), ('www'), ('yyy'), ('xxx'), ('www'), ('yyy'), ('www');


connection master;

DROP TABLE IF EXISTS federated.t1;

--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t1 (
  id int(20) NOT NULL,
  name varchar(16) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1';

DROP TABLE IF EXISTS federated.t2;

--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t2 (
  name varchar(16) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t2';

SELECT * FROM federated.t1;

SELECT id FROM federated.t1 WHERE id < 5;

SELECT count(*), name FROM federated.t1 WHERE id < 5 GROUP BY name;

SELECT * FROM federated.t1, federated.t2
  WHERE federated.t1.name = federated.t2.name;

SELECT * FROM federated.t1 LEFT JOIN federated.t2
              ON federated.t1.name = federated.t2.name
  WHERE federated.t1.id > 1;

SELECT * FROM federated.t1
  WHERE id IN (SELECT count(*) FROM federated.t2 GROUP BY name);

EXPLAIN
SELECT id FROM federated.t1 WHERE id < 5;
 
EXPLAIN EXTENDED
SELECT id FROM federated.t1 WHERE id < 5;

EXPLAIN FORMAT=JSON
SELECT id FROM federated.t1 WHERE id < 5;

ANALYZE
SELECT id FROM federated.t1 WHERE id < 5;

--source include/analyze-format.inc
ANALYZE FORMAT=JSON
SELECT id FROM federated.t1 WHERE id < 5;

CREATE TABLE federated.t3 (
  name varchar(16) NOT NULL default ''
)
DEFAULT CHARSET=latin1;

INSERT INTO federated.t3 VALUES
  ('yyy'), ('www'), ('yyy'), ('xxx'), ('www'), ('yyy'), ('www');

SELECT *
FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t
WHERE federated.t3.name=t.name;

EXPLAIN
SELECT *
FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t
WHERE federated.t3.name=t.name;

EXPLAIN FORMAT=JSON
SELECT *
FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t
WHERE federated.t3.name=t.name;

ANALYZE
SELECT *
FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t
WHERE federated.t3.name=t.name;

SELECT *
FROM federated.t3, (SELECT t1.name FROM federated.t1
                    WHERE id IN (SELECT count(*)
                                 FROM federated.t2 GROUP BY name)) t
WHERE federated.t3.name=t.name;

EXPLAIN
SELECT *
FROM federated.t3, (SELECT t1.name FROM federated.t1
                    WHERE id IN (SELECT count(*)
                                 FROM federated.t2 GROUP BY name)) t
WHERE federated.t3.name=t.name;

--source include/analyze-format.inc
ANALYZE FORMAT=JSON
SELECT *
FROM federated.t3, (SELECT t1.name FROM federated.t1
                    WHERE id IN (SELECT count(*)
                                 FROM federated.t2 GROUP BY name)) t
WHERE federated.t3.name=t.name;

SELECT t.id, federated.t3.name
FROM federated.t3,
     ( SELECT * FROM federated.t1 WHERE id < 3
       UNION
       SELECT * FROM federated.t1 WHERE id >= 5) t
WHERE federated.t3.name=t.name;

EXPLAIN
SELECT t.id, federated.t3.name
FROM federated.t3,
     ( SELECT * FROM federated.t1 WHERE id < 3
       UNION
       SELECT * FROM federated.t1 WHERE id >= 5) t
WHERE federated.t3.name=t.name;

--echo #
--echo # MDEV-21887: federatedx crashes on SELECT ... INTO query in select_handler code
--echo #

CREATE TABLE federated.t4 (
  id int(20) NOT NULL,
  name varchar(16) NOT NULL default ''
) engine=myisam;
insert into federated.t4 select * from federated.t1;

--sorted_result
select * from federated.t4;

select name into @var from federated.t1 where id=3 limit 1 ;
select @var;
select name into outfile 'tmp.txt' from federated.t1;

let $path=`select concat(@@datadir, 'test/tmp.txt')`;
remove_file $path;

--echo #
--echo # MDEV-22993: Crash on EXPLAIN with PUSHED DOWN SELECT and subquery
--echo #

explain
select * from federated.t1
where name in (select name from federated.t2);

explain format=json
select * from federated.t1
where name in (select name from federated.t2);

--echo #
--echo # MDEV-22993, testcase #2: EXPLAIN output doesn't make sense when
--echo #   derived table pushdown is used.
--echo #

create table t5 (a int) engine=myisam;
insert into t5 values (1),(2);

--echo # Must not show lines with id=3
explain 
select * from t5, 
(select id from federated.t1
 where name in (select name from federated.t2) or name like 'foo%') as TQ;

--echo # Must not show elements with select_id=3
explain format=json
select * from t5, 
(select id from federated.t1
 where name in (select name from federated.t2) or name like 'foo%') as TQ;

drop table t5;

DROP TABLE federated.t1, federated.t2, federated.t3, federated.t4;

connection slave;
DROP TABLE federated.t1, federated.t2;

connection default;

--echo #
--echo # MDEV-23778: Derived handler used for big derived tables
--echo #

connection slave;

CREATE TABLE federated.t1 (
  a varchar(100) NOT NULL default '123'
)
DEFAULT CHARSET=latin1;

CREATE TABLE federated.t2 LIKE federated.t1;

DELIMITER $$;
BEGIN NOT ATOMIC
  DECLARE i INT DEFAULT 0;
  START TRANSACTION;
  WHILE i < 70000 DO
    INSERT INTO federated.t1 VALUES (i);
    SET i = i + 1;
  END WHILE;
  COMMIT;
END
$$

DELIMITER ;$$

connection master;

--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t1 (
  a varchar(100) NOT NULL default '123'
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1';


--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t2 (
  a varchar(100) NOT NULL default '123'
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t2';

SELECT COUNT(DISTINCT a) FROM federated.t1;

INSERT INTO federated.t2
  SELECT * FROM (SELECT * FROM federated.t1 LIMIT 100) dt;
SELECT COUNT(DISTINCT a) FROM federated.t2;

TRUNCATE TABLE federated.t2;
INSERT INTO federated.t2
  SELECT * FROM (SELECT * FROM federated.t1 LIMIT 70000) dt;
SELECT COUNT(DISTINCT a) FROM federated.t2;


--echo #
--echo # MDEV-29640 FederatedX does not properly handle pushdown
--echo #             in case of difference in local and remote table names
--echo #
connection master;
--echo # Use tables from the previous test. Make sure pushdown works:
EXPLAIN SELECT COUNT(DISTINCT a) FROM federated.t2;
SELECT COUNT(DISTINCT a) FROM federated.t2;

--echo # Link remote table `federated.t1` with the local table named `t1_local`
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t1_local ENGINE="FEDERATED"
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1';

--echo # No pushdown here due to table names mismatch, retrieve data as usual:
EXPLAIN SELECT COUNT(DISTINCT a) FROM federated.t1_local;
SELECT COUNT(DISTINCT a) FROM federated.t1_local;


--echo #
--echo # MDEV-29863 Server crashes in federatedx_txn::acquire after select from
--echo #            the Federated table with partitions and federated_pushdown=1
--echo #            in case of difference in local and remote table names
--echo #
connection slave;
CREATE TABLE federated.t3 (a INT);
INSERT INTO federated.t3 VALUES (1),(2),(3);
CREATE TABLE federated.t4 (a INT);

connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE SERVER fedlink FOREIGN DATA WRAPPER mysql 
  OPTIONS (USER 'root', HOST '127.0.0.1', DATABASE 'federated',
  PORT $SLAVE_MYPORT);

CREATE TABLE federated.t3 (a INT)
  ENGINE=FEDERATED
  CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t3'
  PARTITION BY list (a)
  (PARTITION p1 VALUES IN (1) CONNECTION='fedlink/t3',
   PARTITION p2 VALUES IN (2) CONNECTION='fedlink/t4');

EXPLAIN SELECT * FROM federated.t3;
SELECT * FROM federated.t3;

set global federated_pushdown=0;

source include/federated_cleanup.inc;