@@ -11,20 +11,29 @@ INSERT INTO t2 VALUES(1), (2);
11
11
CREATE TABLE t0 AS SELECT *FROM t1;
12
12
CREATE TABLE t3(a INT, b INT);
13
13
INSERT INTO t3 VALUES(1, 3), (2, 3);
14
+ CREATE VIEW v3 AS SELECT * FROM t3;
14
15
ANALYZE TABLE t1, t2, t0, t3;
15
16
16
17
--echo #
17
18
--echo # example supported query
18
19
--echo #
19
20
20
- # inner field present in SELECT list (t2.a)
21
+ --echo # inner field present in SELECT list (t2.a)
21
22
let $query =
22
23
SELECT * FROM t1 WHERE(SELECT a FROM t2 WHERE t2.a = t1.a) > 0;
23
24
24
25
eval $query;
25
26
eval EXPLAIN $query;
26
27
27
- # inner field not present in SELECT list (t3.a)
28
+ --echo # function(inner) present in select list
29
+ let $query =
30
+ SELECT * FROM t1 WHERE(SELECT -a FROM t2 WHERE -t2.a = -t1.a) < 0;
31
+
32
+ --sorted_result
33
+ eval $query;
34
+ eval EXPLAIN $query;
35
+
36
+ --echo # inner field not present in SELECT list (t3.a)
28
37
let $query =
29
38
SELECT * FROM t1 WHERE(SELECT b FROM t3 WHERE t3.a = t1.a) > 0;
30
39
@@ -36,6 +45,88 @@ SELECT * FROM t1 WHERE(SELECT ABS(a) FROM t2 WHERE t2.a = t1.a) > 0;
36
45
37
46
eval $query;
38
47
eval EXPLAIN $query;
48
+
49
+ --echo # function(inner) not present in SELECT list
50
+ let $query =
51
+ SELECT * FROM t1 WHERE(SELECT a FROM t2 WHERE -t2.a = -t1.a) > 0;
52
+
53
+ --sorted_result
54
+ eval $query;
55
+ eval EXPLAIN $query;
56
+
57
+ let $query =
58
+ SELECT * FROM t1 WHERE(SELECT a FROM t2 WHERE -t2.a = -t1.a AND t2.a = t1.a) > 0;
59
+
60
+ eval $query;
61
+ eval EXPLAIN $query;
62
+
63
+ let $query =
64
+ SELECT * FROM t1 WHERE(SELECT -t2.a FROM t2 WHERE -t2.a = -t1.a AND t2.a = t1.a) > 0;
65
+
66
+ eval $query;
67
+ eval EXPLAIN $query;
68
+
69
+ let $query =
70
+ SELECT * FROM t1 WHERE(SELECT ABS(t2.a) FROM t2 WHERE -t2.a = -t1.a AND t2.a = t1.a) > 0;
71
+
72
+ eval $query;
73
+ eval EXPLAIN $query;
74
+
75
+ --echo # Could have been transformed, since t1.a selected is equal to t2.a
76
+ --echo # (functionally dependent here, but this analysis is not done at the
77
+ --echo # moment.
78
+ let $query =
79
+ SELECT * FROM t1 WHERE(SELECT t1.a FROM t2 WHERE -t2.a = -t1.a AND t2.a = t1.a) > 0;
80
+
81
+ eval $query;
82
+ eval EXPLAIN $query;
83
+
84
+ # multiple inner fields in a function
85
+ let $query =
86
+ SELECT * FROM t1 WHERE(SELECT t3.a FROM t3 WHERE t3.a + t3.b = t1.a ) > 0;
87
+
88
+ eval $query;
89
+ eval EXPLAIN $query;
90
+
91
+ let $query =
92
+ SELECT * FROM t1 WHERE(SELECT ABS(t3.a) FROM t3 WHERE t3.a + t3.b = t1.a ) > 0;
93
+
94
+ eval $query;
95
+ eval EXPLAIN $query;
96
+
97
+ --echo # We don't group on abs(t3.a), since abs(t3.a) is functionally dependent
98
+ --echo # on t3.a.
99
+ let $query =
100
+ SELECT * FROM t1 WHERE(SELECT ABS(t3.a) FROM t3 WHERE t3.a + t3.b = t1.a AND t3.a = t1.a) > 0;
101
+
102
+ eval $query;
103
+ eval EXPLAIN $query;
104
+
105
+ --echo # Not transformed, non-deterministic function
106
+ let $query =
107
+ SELECT * FROM t1 WHERE(SELECT ABS(t3.a) + ROUND(RAND()*10) FROM t3 WHERE t3.a + t3.b = t1.a AND t3.a = t1.a) > 0;
108
+
109
+ eval $query;
110
+ eval EXPLAIN $query;
111
+
112
+ let $query =
113
+ SELECT * FROM t1 WHERE(SELECT v3.a FROM v3 WHERE v3.a = t1.a) > 0;
114
+
115
+ eval $query;
116
+ eval EXPLAIN $query;
117
+
118
+ let $query =
119
+ SELECT * FROM t1 WHERE(SELECT v3.a FROM v3 WHERE v3.a + v3.b = t1.a) > 0;
120
+
121
+ eval $query;
122
+ eval EXPLAIN $query;
123
+
124
+ let $query =
125
+ SELECT * FROM t1 WHERE(SELECT v3.a + v3.b FROM v3 WHERE v3.a + v3.b = t1.a) > 0;
126
+
127
+ eval $query;
128
+ eval EXPLAIN $query;
129
+
39
130
--echo #
40
131
--echo # example supported query: more than one correlated field
41
132
--echo #
@@ -151,16 +242,24 @@ eval EXPLAIN $query;
151
242
--echo # add GROUP BY
152
243
--echo #
153
244
INSERT INTO t2 VALUES (2);
154
- let $query =
245
+ let $query_field =
155
246
SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a = t1.a) > 0;
247
+ let $query_func=
248
+ SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE ABS(t2.a) = t1.a) > 0;
156
249
157
250
--error ER_SUBQUERY_NO_1_ROW
158
- eval $query;
159
- eval EXPLAIN $query;
251
+ eval $query_field;
252
+ eval EXPLAIN $query_field;
253
+ --error ER_SUBQUERY_NO_1_ROW
254
+ eval $query_func;
255
+ eval EXPLAIN $query_func;
160
256
SET optimizer_switch = 'subquery_to_derived=default';
161
257
--error ER_SUBQUERY_NO_1_ROW
162
- eval $query;
163
- eval EXPLAIN $query;
258
+ eval $query_field;
259
+ eval EXPLAIN $query_field;
260
+ --error ER_SUBQUERY_NO_1_ROW
261
+ eval $query_func;
262
+ eval EXPLAIN $query_func;
164
263
165
264
SET optimizer_switch = 'subquery_to_derived=on';
166
265
@@ -181,6 +280,21 @@ SELECT * FROM t1 WHERE (SELECT COUNT(a) FROM t3 WHERE t3.a = t1.a GROUP BY b) >
181
280
eval $query;
182
281
eval EXPLAIN $query;
183
282
283
+ let $query=
284
+ SELECT * FROM t1 WHERE (SELECT COUNT(a) FROM t3 WHERE ANY_VALUE(t3.a) = t1.a GROUP BY b) > 0;
285
+ eval $query;
286
+ eval EXPLAIN $query;
287
+
288
+ let $query=
289
+ SELECT * FROM t1 WHERE (SELECT COUNT(a) FROM t3 WHERE ABS(t3.a) = t1.a GROUP BY b) > 0;
290
+ --error ER_WRONG_FIELD_WITH_GROUP
291
+ eval $query;
292
+
293
+ let $query=
294
+ SELECT * FROM t1 WHERE (SELECT COUNT(a) FROM t3 WHERE ABS(ANY_VALUE(t3.a)) = t1.a GROUP BY b) > 0;
295
+ eval $query;
296
+ eval EXPLAIN $query;
297
+
184
298
--echo #
185
299
--echo # Test case that used to yield wrong result before we corrected
186
300
--echo # computations of slice positions to accommodate non-hidden fields
@@ -209,6 +323,7 @@ eval EXPLAIN $query;
209
323
210
324
DROP TABLE p, l;
211
325
326
+ DROP VIEW v3;
212
327
DROP TABLE t0, t1, t2, t3;
213
328
214
329
--echo #
@@ -240,15 +355,23 @@ INSERT INTO t1 VALUES (1), (2), (3), (4);
240
355
INSERT INTO t2 VALUES (1, 3, 3), (2, 3, 3);
241
356
ANALYZE TABLE t1, t2;
242
357
243
- let $query =
358
+ let $query_field =
244
359
SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.b = t1.a and t2.c = t1.a GROUP BY b) > 0;
360
+ let $query_func=
361
+ SELECT * FROM t1 WHERE (SELECT ABS(a) FROM t2 WHERE ABS(t2.b) = t1.a and ABS(t2.c) = t1.a GROUP BY b) > 0;
245
362
--error 1055
246
- eval EXPLAIN $query;
363
+ eval EXPLAIN $query_field;
364
+ --error 1055
365
+ eval EXPLAIN $query_func;
366
+
247
367
SET sql_mode='';
248
- eval EXPLAIN $query;
249
- eval $query;
368
+ eval EXPLAIN $query_field;
369
+ eval $query_field;
370
+ eval EXPLAIN $query_func;
371
+ eval $query_func;
250
372
DELETE FROM t2 WHERE a = 2;
251
- eval $query;
373
+ eval $query_field;
374
+ eval $query_func;
252
375
SET sql_mode=default;
253
376
254
377
let $query=
@@ -258,10 +381,37 @@ eval EXPLAIN $query;
258
381
259
382
# bug found during review of Bug#35508108: used to get cardinality error
260
383
let $query=
261
- SELECT * FROM t1 WHERE (SELECT b FROM t2 WHERE t2.b = t1.a and t2.c = t1.a GROUP BY b) > 0;
384
+ SELECT * FROM t1 WHERE (SELECT b FROM t2 WHERE t2.b = t1.a AND t2.c = t1.a GROUP BY b) > 0;
262
385
eval $query;
263
386
eval EXPLAIN $query;
264
387
388
+ --echo # This query gets imprecise full group by checking: accepted without transform
389
+ let $query=
390
+ SELECT * FROM t1 WHERE (SELECT ABS(b) FROM t2 WHERE ABS(t2.b) = t1.a AND t2.c + 1 = t1.a + 1 GROUP BY b) > 0;
391
+ --error ER_WRONG_FIELD_WITH_GROUP
392
+ eval $query;
393
+
394
+ --echo # Ok without transform
395
+ SET optimizer_switch = 'subquery_to_derived=off';
396
+ eval $query;
397
+ SET optimizer_switch = 'subquery_to_derived=on';
398
+
399
+ --echo # Remedied with an ANY_VALUE:
400
+ let $query=
401
+ SELECT * FROM t1 WHERE (SELECT ABS(b) FROM t2 WHERE ABS(t2.b) = t1.a AND ANY_VALUE(t2.c) + 1 = t1.a + 1 GROUP BY b) > 0;
402
+ eval $query;
403
+ eval EXPLAIN $query;
404
+
405
+ --echo # Wrong both with transform and without
406
+ let $query=
407
+ SELECT * FROM t1 WHERE (SELECT abs(a-b) FROM t2 WHERE ABS(a-b) = t1.a AND t2.c + 1 = t1.a + 1 GROUP BY a+b) > 0;
408
+ --error ER_WRONG_FIELD_WITH_GROUP
409
+ eval $query;
410
+ SET optimizer_switch = 'subquery_to_derived=off';
411
+ --error ER_WRONG_FIELD_WITH_GROUP
412
+ eval $query;
413
+ SET optimizer_switch = 'subquery_to_derived=on';
414
+
265
415
DROP TABLE t1, t2;
266
416
267
417
--echo #
@@ -275,7 +425,6 @@ INSERT INTO t3 VALUES (1, 3), (2, 3), (1, 4);
275
425
ANALYZE TABLE t1, t3;
276
426
let $query =
277
427
SELECT * FROM t1 WHERE (SELECT COUNT(a) FROM t3 WHERE t3.a = t1.a GROUP BY b) > 0;
278
-
279
428
--error ER_SUBQUERY_NO_1_ROW
280
429
eval $query;
281
430
eval EXPLAIN $query;
@@ -841,6 +990,46 @@ eval EXPLAIN $query;
841
990
842
991
DROP TABLE t1, t2;
843
992
993
+ --echo Somewhat realistic example
994
+ CREATE TABLE employees(employee_id INT,
995
+ name VARCHAR(255),
996
+ salary DECIMAL(8,2),
997
+ department VARCHAR(255));
998
+ INSERT INTO employees
999
+ VALUES (1, 'Bob', 250000, 'English'),
1000
+ (2, 'Charles', 250000, 'English'),
1001
+ (3, 'Kari', 250000, 'English'),
1002
+ (4, 'Per', 250000, 'ENGLISH'),
1003
+ (6, 'Ole', 300000, 'English'),
1004
+ (7, 'Heinrich', 250000, 'English'),
1005
+ (8, 'James', 250000, 'Math'),
1006
+ (9, 'Dag', 300000, 'MATHEMATICS'),
1007
+ (10, 'Norvald', 250000, 'Math'),
1008
+ (11, 'Edward', 250000, 'Math'),
1009
+ (12, 'Rose', 250000, 'MATH'),
1010
+ (13, 'Sally', 250000, 'MATH');
1011
+
1012
+ --echo # Sloppy department data doesn't give right answer for maths dept.
1013
+ --echo # WL#13520:
1014
+ SELECT employee_id, name
1015
+ FROM employees oemp
1016
+ WHERE salary > (
1017
+ SELECT AVG(salary)
1018
+ FROM employees
1019
+ WHERE department = oemp.department);
1020
+ --echo # In addition to default case insignificance, use only first four letters
1021
+ --echo # to get desired answer
1022
+ --echo # WL#15540
1023
+ SELECT employee_id, name
1024
+ FROM employees oemp
1025
+ WHERE salary > (
1026
+ SELECT AVG(salary)
1027
+ FROM employees
1028
+ WHERE SUBSTRING(department,1,4) = SUBSTRING(oemp.department,1,4));
1029
+
1030
+ DROP TABLE employees;
1031
+
1032
+
844
1033
--echo #
845
1034
--echo # Bug#36060557 WL#15540: Expression containing Non-deterministic function
846
1035
--echo # UUID() is transformed
0 commit comments