File: bug13581713.inc

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (150 lines) | stat: -rw-r--r-- 6,841 bytes parent folder | download
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
--source include/turn_off_only_full_group_by.inc

insert into t1 values(100,1,2),(200,1,1),(300,2,1),(400,2,2);
analyze table t1;

eval select distinct b from $source order by c;
--sorted_result
eval select distinct min(b) from $source group by a order by min(c);
# just to see that if source is a view, it is merged
--sorted_result
--replace_column 9 #
eval explain select distinct min(b) from $source group by a order by min(c);

--echo Insert rows in different order:
delete from t1;
insert into t1 values(200,1,1),(100,1,2),(400,2,2),(300,2,1);
analyze table t1;

--echo And get a different order. Query is executed like this:
--echo - First, DISTINCT, using a tmp MEMORY table with a unique
--echo index, thus if two rows have the same 'b' but a different 'c',
--echo the second row is rejected, so the first value of 'c' wins
--echo (=> randomness of 'c')
--echo - Second, ORDER BY on the random 'c'.
eval select distinct b from $source order by c;

--echo Random order too (same reason):
--sorted_result
eval select distinct min(b) from $source group by a order by min(c);

--source include/restore_sql_mode_after_turn_off_only_full_group_by.inc

--echo This query gives random order:
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct b from $source order by c;
--echo and this one too:
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct b from $source order by b-1,b+1,c;

--echo and this one too:
--sorted_result
--error ER_AGGREGATE_IN_ORDER_NOT_SELECT
eval select distinct min(b) from $source group by a order by min(c);

--echo Not random (though Standard bans aggregates from ORDER BY):
eval select distinct min(b) from $source group by a order by min(b);
--error ER_AGGREGATE_IN_ORDER_NOT_SELECT
eval select distinct min(b) from $source group by a order by -min(b);
--echo All group exprs are in select list => DISTINCT is removed => no error
eval select distinct a, min(b) from $source group by a order by max(b-2)-min(c*5);

--echo This one is standard:
eval select distinct min(b) as z from $source group by a order by z;

--echo Other queries:
eval select distinct b from $source where b<0 order by rand();
eval select distinct b from $source order by 45.0+3;
eval select (select distinct b from $source_no_alias as S2 where b=7 order by S3.a) from $source_no_alias as S3;
eval select distinct b from $source order by abs(b);
eval select distinct b as z from $source order by abs(z);

--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct b from $source order by abs(b+a);

eval select distinct abs(b) as z from $source order by z;
eval select distinct abs(b) as z from $source order by abs(b);
eval select distinct abs(b) from $source order by abs(b);

--echo Not ok: ABS(b)+1 is neither a SELECTed expression nor an alias
--echo to one, and mentions a column of FROM tables.
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) as z from $source order by abs(b)+1;
eval select distinct abs(b) as z from $source order by z+1;
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source order by abs(b)+1;
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) as z from $source order by floor(10*b);
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source order by floor(10*b);
--echo Two offending columns; error message needs to report only one
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source order by floor(10*b),floor(10*a);
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source_no_alias as S2 order by
 (select floor(10*S2.b) from $source_no_alias as S3 limit 1);
--echo Ok as S2.b in SELECT list
eval select distinct abs(b),b from $source_no_alias as S2 order by
 (select floor(10*S2.b) from $source_no_alias as S3 limit 1);
--echo Ok as subq does not use columns of FROM clause of ordered Q.
eval select distinct abs(b) from $source_no_alias as S2 order by
 (select floor(10*S3.b) from $source_no_alias as S3 limit 1);
--echo Subq as alias => ok
eval select distinct abs(b),
 (select floor(10*S3.b) from $source_no_alias as S3 limit 1) as subq
 from $source_no_alias as S2 order by subq;
--echo Bad field in left or right argument of ALL/ANY(subq):
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source_no_alias as S2 order by
 floor(10*S2.b) IN (select floor(10*S3.b) from $source_no_alias as S3);
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source_no_alias as S2 order by
 floor(10*S2.b) > ALL(select floor(10*S3.b) from $source_no_alias as S3);
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source_no_alias as S2 order by
 floor(10*10) IN (select floor(10*S2.b) from $source_no_alias as S3);
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval select distinct abs(b) from $source_no_alias as S2 order by
 floor(10*10) > ALL(select floor(10*S2.b) from $source_no_alias as S3);

--echo Aggregates:
--error ER_AGGREGATE_IN_ORDER_NOT_SELECT
SELECT distinct 1 FROM t1 group by a order by count(*);
--error ER_AGGREGATE_IN_ORDER_NOT_SELECT
SELECT distinct 1 FROM t1 group by a order by count(*)-count(*);
--echo Test ANY_VALUE
SELECT distinct 1 FROM t1 group by a order by any_value(count(*)-count(b));
SELECT distinct 1 FROM t1 group by a order by any_value(count(*))-any_value(count(b));
--echo All group exprs are in select list => DISTINCT is removed => no error
--sorted_result
SELECT distinct a, min(b) FROM t1 group by a order by count(*)-count(*);
--error ER_AGGREGATE_IN_ORDER_NOT_SELECT
SELECT distinct 1 FROM t1 group by a order by count(*)-count(b);
--echo aggregation in outer Q => constant in inner Q
select * from t1 as t2 where t2.a in
  (SELECT distinct 1 FROM t1 group by a order by count(t2.a)-max(t2.a));
--echo ORDER BY expressions are in SELECT list => ok
SELECT distinct 1, count(*)-count(b) FROM t1 group by a order by count(*)-count(b);
--echo Without GROUP BY, aggregates yield a single row, no random order
SELECT distinct sum(a) FROM t1 order by count(*)-count(*);
SELECT distinct sum(a) FROM t1 order by count(*)-count(b);

--echo Verify that DISTINCT is optimized away even if the aggregate
--echo function is hidden in a subquery
EXPLAIN SELECT DISTINCT MAX(b) FROM t1;
EXPLAIN SELECT DISTINCT (SELECT MAX(t1.b) FROM t1 AS t2 LIMIT 1) FROM t1;
--echo but if the subquery is the aggregation query, DISTINCT must stay:
EXPLAIN SELECT DISTINCT (SELECT MAX(t1.b+0*t2.a) FROM t1 AS t2 LIMIT 1) FROM t1;
--echo QA's query is properly rejected:
--error ER_FIELD_IN_ORDER_NOT_SELECT
eval SELECT DISTINCT GP1.a AS g1 FROM $source_no_alias AS GP1
WHERE GP1.a >= 0
ORDER BY GP1.b LIMIT 8;

--echo result order does change depending on chosen plan.
--sorted_result
eval SELECT DISTINCT GP1.a AS g1 FROM $source_no_alias AS GP1
WHERE GP1.a >= 0
ORDER BY 2+ANY_VALUE(GP1.b) LIMIT 8;

DELETE FROM t1;