Bug #78395 | Get "Unknown column 'c1' in 'having clause' " when c1 is a valid column | ||
---|---|---|---|
Submitted: | 10 Sep 2015 11:46 | Modified: | 11 Sep 2015 4:20 |
Reporter: | Su Dylan | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Parser | Severity: | S3 (Non-critical) |
Version: | 5.6.22, 5.1.77, 5.5.46, 5.6.26, 5.7.9 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[10 Sep 2015 11:46]
Su Dylan
[10 Sep 2015 12:03]
MySQL Verification Team
Hello Su Dylan, Thank you for the report. Thanks, Umesh
[11 Sep 2015 4:16]
MySQL Verification Team
Bug #78402 marked as duplicate of this
[11 Sep 2015 4:20]
Su Dylan
Hi, Today I realize that this sql should succeed, since in the document, it is mentioned that MySQL permits expressions in GROUP By clauses. Therefore I am changing the expected result to be : SQL "select c1+1 from t1 group by c1+1 having c1+1 " succeeds. Please confirm if this sql should succeed or not. Thanks. Quote: ===== https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html MySQL permits expressions in GROUP BY clauses, so the alias is unnecessary: =====
[14 Sep 2015 11:53]
Guilhem Bichot
About queries with "GROUP BY <expression>". Yes, MySQL supports that, but such support is not as complete as that of "GROUP BY <column>". "GROUP BY <expression>" isn't allowed in the SQL standard. Supporting this extension is more complex than "GROUP BY <column>", so we do it only in simple cases. In essence, MySQL doesn't try to spot <expression> everywhere in the query. So, in the query of the report: select c1+1 from t1 group by c1+1 having c1+1; it doesn't see that what's in HAVING is what's in GROUP BY, so it complains that HAVING isn't properly formed. If we make the query just a bit more complex: select c1+1 from t1 group by c1+1 having (c1+1) <> 0; we can easilty understand why MySQL's job is difficult: it should analyze parts of the expression "(c1+1) <> 0", to discover that one part ("c1+1") is in GROUP BY. A workaround is to help MySQL see that fact, simply by using an alias: select c1+1 as z from t1 group by z having z; It will also make it more obvious to the human reader that expressions are repeated. And it may sometimes be more performant, as redundant calculations will not be done.