Peter Eisentraut <peter_e@gmx.net> writes:
> Entertaining parser conflicts again.
I agree with sorting out the privileges lists later.
> Attempt 2:
> We set up
> privileges = SELECT | UPDATE | ... | EXECUTE | ALL PRIVILEGES
> grant_table = GRANT privileges ON tablename TO ...
> grant_func = GRANT privileges ON FUNCTION funcname(...) TO ...
> This leads to a shift/reduce conflict at the state
> GRANT privileges ON FUNCTION
> where FUNCTION could be a table name or introducing an actual function
> name.
The trick with this sort of problem is to make sure that the parser
doesn't have to reduce anything until it's seen enough tokens to make
the result unambiguous. You are losing here because the parser has to
decide whether or not to reduce FUNCTION to tablename before it can
see any further than the TO.
I think it might work to do
grant := GRANT privileges ON grant_target TO ...
grant_target := tablename
| FUNCTION funcname(...)
regards, tom lane