Commit 04468cba authored by unknown's avatar unknown

Merge polly.(none):/home/kaa/src/opt/bug32202/my50-bug26215

into  polly.(none):/home/kaa/src/opt/mysql-5.0-opt


sql/sql_select.cc:
  Auto merged
parents 6b00e6eb 55499d2b
...@@ -1113,3 +1113,68 @@ c b ...@@ -1113,3 +1113,68 @@ c b
3 1 3 1
3 2 3 2
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1(
id INT AUTO_INCREMENT PRIMARY KEY,
c1 INT NOT NULL,
c2 INT NOT NULL,
UNIQUE KEY (c2,c1));
INSERT INTO t1(c1,c2) VALUES (5,1), (4,1), (3,5), (2,3), (1,3);
SELECT * FROM t1 ORDER BY c1;
id c1 c2
5 1 3
4 2 3
3 3 5
2 4 1
1 5 1
SELECT * FROM t1 GROUP BY id ORDER BY c1;
id c1 c2
5 1 3
4 2 3
3 3 5
2 4 1
1 5 1
SELECT * FROM t1 GROUP BY id ORDER BY id DESC;
id c1 c2
5 1 3
4 2 3
3 3 5
2 4 1
1 5 1
SELECT * FROM t1 GROUP BY c2 ,c1, id ORDER BY c2, c1;
id c1 c2
2 4 1
1 5 1
5 1 3
4 2 3
3 3 5
SELECT * FROM t1 GROUP BY c2, c1, id ORDER BY c2 DESC, c1;
id c1 c2
3 3 5
5 1 3
4 2 3
2 4 1
1 5 1
SELECT * FROM t1 GROUP BY c2, c1, id ORDER BY c2 DESC, c1 DESC;
id c1 c2
3 3 5
4 2 3
5 1 3
1 5 1
2 4 1
SELECT * FROM t1 GROUP BY c2 ORDER BY c2, c1;
id c1 c2
1 5 1
4 2 3
3 3 5
SELECT * FROM t1 GROUP BY c2 ORDER BY c2 DESC, c1;
id c1 c2
3 3 5
4 2 3
1 5 1
SELECT * FROM t1 GROUP BY c2 ORDER BY c2 DESC, c1 DESC;
id c1 c2
3 3 5
4 2 3
1 5 1
DROP TABLE t1;
End of 5.0 tests
...@@ -815,3 +815,38 @@ EXPLAIN SELECT c,b FROM t1 GROUP BY c,b; ...@@ -815,3 +815,38 @@ EXPLAIN SELECT c,b FROM t1 GROUP BY c,b;
SELECT c,b FROM t1 GROUP BY c,b; SELECT c,b FROM t1 GROUP BY c,b;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #32202: ORDER BY not working with GROUP BY
#
CREATE TABLE t1(
id INT AUTO_INCREMENT PRIMARY KEY,
c1 INT NOT NULL,
c2 INT NOT NULL,
UNIQUE KEY (c2,c1));
INSERT INTO t1(c1,c2) VALUES (5,1), (4,1), (3,5), (2,3), (1,3);
# Show that the test cases from the bug report pass
SELECT * FROM t1 ORDER BY c1;
SELECT * FROM t1 GROUP BY id ORDER BY c1;
# Show that DESC is handled correctly
SELECT * FROM t1 GROUP BY id ORDER BY id DESC;
# Show that results are correctly ordered when ORDER BY fields
# are a subset of GROUP BY ones
SELECT * FROM t1 GROUP BY c2 ,c1, id ORDER BY c2, c1;
SELECT * FROM t1 GROUP BY c2, c1, id ORDER BY c2 DESC, c1;
SELECT * FROM t1 GROUP BY c2, c1, id ORDER BY c2 DESC, c1 DESC;
# Show that results are correctly ordered when GROUP BY fields
# are a subset of ORDER BY ones
SELECT * FROM t1 GROUP BY c2 ORDER BY c2, c1;
SELECT * FROM t1 GROUP BY c2 ORDER BY c2 DESC, c1;
SELECT * FROM t1 GROUP BY c2 ORDER BY c2 DESC, c1 DESC;
DROP TABLE t1;
--echo End of 5.0 tests
...@@ -1065,9 +1065,18 @@ JOIN::optimize() ...@@ -1065,9 +1065,18 @@ JOIN::optimize()
We have found that grouping can be removed since groups correspond to We have found that grouping can be removed since groups correspond to
only one row anyway, but we still have to guarantee correct result only one row anyway, but we still have to guarantee correct result
order. The line below effectively rewrites the query from GROUP BY order. The line below effectively rewrites the query from GROUP BY
<fields> to ORDER BY <fields>. One exception is if skip_sort_order is <fields> to ORDER BY <fields>. There are two exceptions:
set (see above), then we can simply skip GROUP BY. - if skip_sort_order is set (see above), then we can simply skip
*/ GROUP BY;
- we can only rewrite ORDER BY if the ORDER BY fields are 'compatible'
with the GROUP BY ones, i.e. either one is a prefix of another.
We only check if the ORDER BY is a prefix of GROUP BY. In this case
test_if_subpart() copies the ASC/DESC attributes from the original
ORDER BY fields.
If GROUP BY is a prefix of ORDER BY, then it is safe to leave
'order' as is.
*/
if (!order || test_if_subpart(group_list, order))
order= skip_sort_order ? 0 : group_list; order= skip_sort_order ? 0 : group_list;
group_list= 0; group_list= 0;
group= 0; group= 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment