Der Vollständigkeit halber beantworte ich meine eigene und verlinke auf eine andere Frage von mir selbst. Es scheint, dass dieses Verhalten eine direkte Folge davon ist, dass der SQL-Standard Leerzeichen zwischen der Funktion und der Klammer zulässt.
Da es (allgemein) erlaubt ist, FUNCTION_NAME (x) dann zu sagen, wenn diese Funktion auf einen ersten Begriff von select angewendet wird
SELECT FUNCTION_NAME (x)
dann wird es dem Parser schwerfallen, festzustellen, ob dies ein Kontext eines Funktionsnamens oder eines SELECT-ändernden Schlüsselworts ist.
Im obigen Fall ist also FUNCTION_NAME für den Parser tatsächlich FUNCTION_NAME_OR_KEYWORD.
Aber es geht noch weiter:Da das Leerzeichen zwischen Funktionsname und Klammer erlaubt ist, kann der Parser eigentlich NICHT zwischen
unterscheidenSELECT FUNCTION_NAME_OR_KEYWORD (x)
und
SELECT FUNCTION_NAME_OR_KEYWORD(x)
(es muss die Schlüsselwörter testen, um zu sehen, ob es sich um Funktionen handelt), und da (x) zu x geparst wird, folgt daraus, dass es für FUNCTION_NAME_OR_KEYWORD -> DISTINCT (und alle anderen SELECT-modifizierenden Schlüsselwörter) keinen Unterschied zwischen gibt
SELECT DISTINCT x, y, z, ...
und
SELECT DISTINCT(x), y, z, ...
QED, aber ohne harte Referenzen (Annahme, dass Standard sich nicht um Leerzeichen zwischen Funktionsnamen und Klammern kümmert, ist meines Erachtens gerechtfertigt, aber ich konnte der BNF-Grammatik nicht so weit folgen, dass ich die genaue Regel zitieren könnte).
HINWEIS:mysql hat eine bestimmte Anzahl von Funktionen, bei denen es um Leerzeichen zwischen Funktionen und Klammern geht, aber ich glaube, dass dies Ausnahmen sind (daher die Serveroption, sie zu ignorieren)