För fullständighetens skull svarar jag på mitt eget och länkar till en annan fråga av mitt eget. Det verkar som att detta beteende är en direkt konsekvens av att SQL-standarden tillåter blanksteg mellan funktionen och parentes.
Eftersom det (i allmänhet) är tillåtet att säga FUNCTION_NAME (x) så när den här funktionen tillämpas på en första term av välj
SELECT FUNCTION_NAME (x)
då kommer parsern att ha svårt att fastställa om detta är en kontext för ett funktionsnamn eller SELECT-modifierande nyckelord.
Så i ovanstående fall är FUNCTION_NAME faktiskt FUNCTION_NAME_OR_KEYWORD för tolken.
Men det går längre:eftersom utrymmet mellan funktionsnamn och parentes ÄR tillåtet kan parsern faktiskt INTE skilja mellan
SELECT FUNCTION_NAME_OR_KEYWORD (x)
och
SELECT FUNCTION_NAME_OR_KEYWORD(x)
(det måste testa nyckelorden för att se om de är funktioner), och eftersom (x) kommer att tolkas till x följer det att för FUNCTION_NAME_OR_KEYWORD -> DISTINCT (och alla andra SELECT-modifierande nyckelord) finns det ingen skillnad mellan
SELECT DISTINCT x, y, z, ...
och
SELECT DISTINCT(x), y, z, ...
QED, men utan hårda referenser (antagande att standard bryr sig inte om blanksteg mellan funktionsnamn och parentes är, tror jag, motiverat, men jag kunde inte följa BNF-grammatik till den grad att jag kunde citera den exakta regeln).
OBS:mysql har ett visst antal funktioner där den bryr sig om blanksteg mellan funktioner och parentes, men jag tror att dessa är undantag (därav serveralternativet att ignorera det)