完全を期すために、私は自分自身に答えて、別の質問 この動作は、SQL標準が関数と括弧の間に空白を許可した直接の結果であるようです。
(一般的に)FUNCTION_NAME(x)と言うことが許可されているので、この関数がselectの最初の項に適用されるとき
SELECT FUNCTION_NAME (x)
その場合、パーサーは、これが関数名またはSELECT変更キーワードのコンテキストであるかどうかを確認するのに苦労します。
したがって、上記の場合、FUNCTION_NAMEは実際にはパーサーに対するFUNCTION_NAME_OR_KEYWORDです。
しかし、それはさらに進んでいます。関数名と括弧の間のスペースが許可されているため、パーサーは実際には区別できません
SELECT FUNCTION_NAME_OR_KEYWORD(x)
および
SELECT FUNCTION_NAME_OR_KEYWORD(x)
(キーワードをテストして関数かどうかを確認する必要があります)。(x)はxに解析されるため、FUNCTION_NAME_OR_KEYWORD-> DISTINCT(および他のすべてのSELECT変更キーワード)の場合、違いはありません。
SELECT DISTINCT x, y, z, ...
および
SELECT DISTINCT(x), y, z, ...
QED、ただしハードリファレンスなし(標準> 関数名と括弧の間の空白を気にしないことは正当であると私は信じていますが、正確な規則を引用できるほどBNF文法に従うことができませんでした。
注:mysqlには、関数と括弧の間の空白を気にする関数がいくつかありますが、これらは例外であると思います(したがって、サーバーはそれを無視するオプションです)