Demi kelengkapan, saya menjawab milik saya sendiri dan menautkan ke pertanyaan milik saya sendiri. Tampaknya perilaku ini merupakan konsekuensi langsung dari standar SQL yang mengizinkan spasi putih antara fungsi dan tanda kurung.
Karena (umumnya) diperbolehkan untuk mengatakan FUNCTION_NAME (x) maka ketika fungsi ini diterapkan pada istilah pertama pilih
SELECT FUNCTION_NAME (x)
maka parser akan kesulitan menentukan apakah ini adalah konteks nama fungsi atau kata kunci pengubah SELECT.
Jadi dalam kasus di atas FUNCTION_NAME sebenarnya adalah FUNCTION_NAME_OR_KEYWORD untuk parser.
Tetapi lebih jauh:karena spasi antara nama fungsi dan tanda kurung diperbolehkan, parser sebenarnya TIDAK dapat membedakan antara
SELECT FUNCTION_NAME_OR_KEYWORD (x)
dan
SELECT FUNCTION_NAME_OR_KEYWORD(x)
(itu harus menguji kata kunci untuk melihat apakah itu fungsi), dan karena (x) akan diuraikan ke x, maka untuk FUNCTION_NAME_OR_KEYWORD -> DISTINCT (dan semua kata kunci pengubah SELECT lainnya) tidak ada perbedaan antara
SELECT DISTINCT x, y, z, ...
dan
SELECT DISTINCT(x), y, z, ...
QED, tetapi tanpa referensi keras (asumsi bahwa standar tidak peduli tentang spasi putih antara nama fungsi dan tanda kurung, saya yakin, dibenarkan, tetapi saya tidak dapat mengikuti tata bahasa BNF sampai-sampai saya dapat mengutip aturan yang tepat).
CATATAN:mysql memiliki sejumlah fungsi di mana ia peduli dengan spasi putih antara fungsi dan tanda kurung, tapi saya percaya bahwa ini adalah pengecualian (maka opsi server untuk mengabaikannya)