diff options
author | konstantin@mysql.com <> | 2003-12-10 01:15:31 +0300 |
---|---|---|
committer | konstantin@mysql.com <> | 2003-12-10 01:15:31 +0300 |
commit | 8ee31c26f2986ae5be66f400a2190c867210fd13 (patch) | |
tree | 79d42648f32956a4f1b55227ac3f4d9df1eb5287 | |
parent | 4ddefbb081cb8ce20c415d5fb59ecc9a031e609a (diff) | |
parent | 25a0bfb268609c662f8dea1ae7f640675c7a563d (diff) | |
download | mariadb-git-8ee31c26f2986ae5be66f400a2190c867210fd13.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-4.0
into mysql.com:/home/kostja/mysql/mysql-4.0-1335
-rw-r--r-- | mysql-test/r/group_by.result | 31 | ||||
-rw-r--r-- | mysql-test/t/group_by.test | 24 | ||||
-rw-r--r-- | sql/sql_select.cc | 14 |
3 files changed, 66 insertions, 3 deletions
diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result index f89cb8a6792..dba95614052 100644 --- a/mysql-test/r/group_by.result +++ b/mysql-test/r/group_by.result @@ -287,7 +287,7 @@ table type possible_keys key key_len ref rows Extra t1 ALL NULL NULL NULL NULL 8 Using filesort explain select sql_big_result spid,sum(userid) from t1 group by spid desc order by null; table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 8 +t1 ALL NULL NULL NULL NULL 8 Using filesort select sql_big_result spid,sum(userid) from t1 group by spid desc; spid sum(userid) 7 3 @@ -597,3 +597,32 @@ count(*) category 1 3 1 4 drop table t1; +CREATE TABLE t1 ( +userid int(10) unsigned, +score smallint(5) unsigned, +key (score) +); +INSERT INTO t1 VALUES (1,1),(2,2),(1,1),(3,3),(3,3),(3,3),(3,3),(3,3); +SELECT userid,count(*) FROM t1 GROUP BY userid DESC; +userid count(*) +3 5 +2 1 +1 2 +EXPLAIN SELECT userid,count(*) FROM t1 GROUP BY userid DESC; +table type possible_keys key key_len ref rows Extra +t1 ALL NULL NULL NULL NULL 8 Using temporary; Using filesort +DROP TABLE t1; +CREATE TABLE t1 ( +i int(11) default NULL, +j int(11) default NULL +); +INSERT INTO t1 VALUES (1,2),(2,3),(4,5),(3,5),(1,5),(23,5); +SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL; +i COUNT(DISTINCT(i)) +1 1 +2 1 +4 4 +explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL; +table type possible_keys key key_len ref rows Extra +t1 ALL NULL NULL NULL NULL 6 Using filesort +DROP TABLE t1; diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test index df99bc2a9dc..58bb4b3e268 100644 --- a/mysql-test/t/group_by.test +++ b/mysql-test/t/group_by.test @@ -423,3 +423,27 @@ select id, sum(qty) as sqty, count(qty) as cqty from t1 group by id having sum(q select count(*), case interval(qty,2,3,4,5,6,7,8) when -1 then NULL when 0 then "zero" when 1 then "one" when 2 then "two" end as category from t1 group by category; select count(*), interval(qty,2,3,4,5,6,7,8) as category from t1 group by category; drop table t1; +# +# Tests for bug #1355: 'Using filesort' is missing in EXPLAIN when ORDER BY +# NULL is used. +# +CREATE TABLE t1 ( + userid int(10) unsigned, + score smallint(5) unsigned, + key (score) +); +INSERT INTO t1 VALUES (1,1),(2,2),(1,1),(3,3),(3,3),(3,3),(3,3),(3,3); +# Here we select unordered GROUP BY into a temporary talbe, +# and then sort it with filesort (GROUP BY in MySQL +# implies sorted order of results) +SELECT userid,count(*) FROM t1 GROUP BY userid DESC; +EXPLAIN SELECT userid,count(*) FROM t1 GROUP BY userid DESC; +DROP TABLE t1; +CREATE TABLE t1 ( + i int(11) default NULL, + j int(11) default NULL +); +INSERT INTO t1 VALUES (1,2),(2,3),(4,5),(3,5),(1,5),(23,5); +SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL; +explain SELECT i, COUNT(DISTINCT(i)) FROM t1 GROUP BY j ORDER BY NULL; +DROP TABLE t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7f8dfd219d0..df4b0226ff6 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -696,8 +696,18 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, if (select_options & SELECT_DESCRIBE) { - if (!order && !no_order) - order=group; + /* + Check if we managed to optimize ORDER BY away and don't use temporary + table to resolve ORDER BY: in that case, we only may need to do + filesort for GROUP BY. + */ + if (!order && !no_order && (!skip_sort_order || !need_tmp)) + { + /* Reset 'order' to 'group' and reinit variables describing 'order' */ + order= group; + simple_order= simple_group; + skip_sort_order= 0; + } if (order && (join.const_tables == join.tables || ((simple_order || skip_sort_order) && |