Commit 0390de86 authored by unknown's avatar unknown

Fix bug #13855 select distinct with group by caused server crash

DISTINCT wasn't optimized away and caused creation of tmp table in wrong
case. This result in integer overrun and running out of memory.

Fix backported from 4.1. Now if optimizer founds that in result be only 1
row it removes distinct.


sql/sql_select.cc:
  Fix bug #13855 select distinct with group by caused server crash
mysql-test/r/select.result:
  Test case for bug#13855 select distinct with group by caused server crash
mysql-test/t/select.test:
   Test case for bug#13855 select distinct with group by caused server crash
parent f4e6fca1
...@@ -2477,3 +2477,11 @@ a b c d ...@@ -2477,3 +2477,11 @@ a b c d
1 2 2 1 1 2 2 1
1 2 3 1 1 2 3 1
DROP TABLE IF EXISTS t1, t2; DROP TABLE IF EXISTS t1, t2;
create table t1 (f1 int primary key, f2 int);
create table t2 (f3 int, f4 int, primary key(f3,f4));
insert into t1 values (1,1);
insert into t2 values (1,1),(1,2);
select distinct count(f2) >0 from t1 left join t2 on f1=f3 group by f1;
count(f2) >0
1
drop table t1,t2;
...@@ -2013,3 +2013,12 @@ SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2,t1 ...@@ -2013,3 +2013,12 @@ SELECT t2.a, t2.b, IF(t1.b IS NULL,'',c) AS c, COUNT(*) AS d FROM t2,t1
WHERE t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c; WHERE t2.a = t1.a AND t2.b = t1.b GROUP BY a, b, c;
DROP TABLE IF EXISTS t1, t2; DROP TABLE IF EXISTS t1, t2;
#
# Bug #13855 select distinct with group by caused server crash
#
create table t1 (f1 int primary key, f2 int);
create table t2 (f3 int, f4 int, primary key(f3,f4));
insert into t1 values (1,1);
insert into t2 values (1,1),(1,2);
select distinct count(f2) >0 from t1 left join t2 on f1=f3 group by f1;
drop table t1,t2;
...@@ -626,6 +626,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, ...@@ -626,6 +626,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
{ {
order=0; // The output has only one row order=0; // The output has only one row
simple_order=1; simple_order=1;
select_distinct= 0; // No need in distinct for 1 row
} }
calc_group_buffer(&join,group); calc_group_buffer(&join,group);
......
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