In PostgreSQL 12.1 Documentation chapter 4.2.7. Aggregate Expressions it says
The syntax of an aggregate expression is one of the following: ... aggregate_name (DISTINCT expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ] ...
I believe this is incorrect in the case where the DISTINCT is on a comma-separated list of expressions. It would imply that this is legal
It is...you didn't get a syntax error.
select count(DISTINCT parent_id , name) from mytable
but that is rejected with ERROR: function count(bigint, text) does not exist
The error is that while the query is syntactically correct in order to execute it as written a function would need to exist that does not. As far as a general syntax diagram goes it has correctly communicated what is legal.
whereas
select count(DISTINCT ( parent_id , name) ) from mytable
is accepted.
Correct, converting the two individual columns into a "tuple" allows the default tuple distinct-making infrastructure to be used to execute the query.
So I think to handle all cases the line in the doc should read
I don't know how to indicate that those extra parentheses can be omitted if the list has only one expression.
Then I would have to say the proposed solution to this edge case is worse than the problem. I also don't expect there to be a clean solution to dealing with the complexities of expressions at the syntax diagram level.