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.
parent f370e4b3
......@@ -1392,4 +1392,19 @@ SELECT MIN(b) FROM t1 WHERE a=1 AND b>'2007-08-01';
MIN(b)
NULL
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
......@@ -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';
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
......@@ -565,11 +565,12 @@ JOIN::prepare(Item ***rref_pointer_array,
/*
Check if one one uses a not constant column with group functions
and no GROUP BY.
Check if there are references to un-aggregated columns when computing
aggregate functions with implicit grouping (there is no GROUP BY).
TODO: Add check of calculation of GROUP functions and fields:
SELECT COUNT(*)+table.col1 from table1;
*/
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY)
{
if (!group_list)
{
......@@ -583,6 +584,13 @@ JOIN::prepare(Item ***rref_pointer_array,
else if (!(flag & 2) && !item->const_during_execution())
flag|=2;
}
if (having)
{
if (having->with_sum_func)
flag |= 1;
else if (!having->const_during_execution())
flag |= 2;
}
if (flag == 3)
{
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