Commit 660eb5bb authored by unknown's avatar unknown

Bug #31794: no syntax error on SELECT id FROM t HAVING count(*)>2

The HAVING clause is subject to the same rules as the SELECT list
about using aggregated and non-aggregated columns.
But this was not enforced when processing implicit grouping from
using aggregate functions.
Fixed by performing the same checks for HAVING as for SELECT.


mysql-test/r/func_group.result:
  Bug #31794: test case
mysql-test/t/func_group.test:
  Bug #31794: test case
sql/sql_select.cc:
  Bug #31794: Check HAVING in addition to SELECT list
parent 95acd426
...@@ -1392,4 +1392,19 @@ SELECT MIN(b) FROM t1 WHERE a=1 AND b>'2007-08-01'; ...@@ -1392,4 +1392,19 @@ SELECT MIN(b) FROM t1 WHERE a=1 AND b>'2007-08-01';
MIN(b) MIN(b)
NULL NULL
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3),(4);
SET SQL_MODE=ONLY_FULL_GROUP_BY;
SELECT a FROM t1 HAVING COUNT(*)>2;
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
SELECT COUNT(*), a FROM t1;
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
SET SQL_MODE=DEFAULT;
SELECT a FROM t1 HAVING COUNT(*)>2;
a
1
SELECT COUNT(*), a FROM t1;
COUNT(*) a
4 1
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -882,5 +882,24 @@ CREATE TABLE t1 (a int, b date NOT NULL, KEY k1 (a,b)); ...@@ -882,5 +882,24 @@ CREATE TABLE t1 (a int, b date NOT NULL, KEY k1 (a,b));
SELECT MIN(b) FROM t1 WHERE a=1 AND b>'2007-08-01'; SELECT MIN(b) FROM t1 WHERE a=1 AND b>'2007-08-01';
DROP TABLE t1; DROP TABLE t1;
#
# Bug #31794: no syntax error on SELECT id FROM t HAVING count(*)>2;
#
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3),(4);
SET SQL_MODE=ONLY_FULL_GROUP_BY;
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
SELECT a FROM t1 HAVING COUNT(*)>2;
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
SELECT COUNT(*), a FROM t1;
SET SQL_MODE=DEFAULT;
SELECT a FROM t1 HAVING COUNT(*)>2;
SELECT COUNT(*), a FROM t1;
DROP TABLE t1;
### ###
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -565,11 +565,12 @@ JOIN::prepare(Item ***rref_pointer_array, ...@@ -565,11 +565,12 @@ JOIN::prepare(Item ***rref_pointer_array,
/* /*
Check if one one uses a not constant column with group functions Check if there are references to un-aggregated columns when computing
and no GROUP BY. aggregate functions with implicit grouping (there is no GROUP BY).
TODO: Add check of calculation of GROUP functions and fields: TODO: Add check of calculation of GROUP functions and fields:
SELECT COUNT(*)+table.col1 from table1; SELECT COUNT(*)+table.col1 from table1;
*/ */
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY)
{ {
if (!group_list) if (!group_list)
{ {
...@@ -583,6 +584,13 @@ JOIN::prepare(Item ***rref_pointer_array, ...@@ -583,6 +584,13 @@ JOIN::prepare(Item ***rref_pointer_array,
else if (!(flag & 2) && !item->const_during_execution()) else if (!(flag & 2) && !item->const_during_execution())
flag|=2; flag|=2;
} }
if (having)
{
if (having->with_sum_func)
flag |= 1;
else if (!having->const_during_execution())
flag |= 2;
}
if (flag == 3) if (flag == 3)
{ {
my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS, my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS,
......
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