Fix the behavior of HAVING
clause
#154
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The current implementation has a special handling for
HAVING
clauses withoutGROUP BY
(this is valid in MySQL in some SQL modes). This implementation takes advantage of the equivalence of ungrouped HAVING with WHERE and rewrites such aHAVING <condition>
clause toAND <condition>
.However, the current implementation has some issues:
GROUP BY
in a query is incorrectly detected. The detection always fails, and thus every HAVING query is considered to be ungrouped. I added a fix in the first commit.HAVING <condition>
toAND <condition>
fails with an errornear "AND": syntax error
when no WHERE is included in the query. This is fixed in the second commit.COUNT(*) > 1
), the query fails with:misuse of aggregate function COUNT()
. This is because aggregate functions can't be used in the WHERE clause. This is fixed in the second commit.To fix all of these issues, I implemented a fix for the
GROUP BY
detection (case 1), and changed the rewriting ofHAVING <condition>
withoutGROUP BY
toGROUP BY 1 HAVING <condition>
(which fixes both case 2 and 3).