On Sun, Jun 10, 2018 at 11:32 AM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> Andrew Gierth <and...@tao11.riddles.org.uk> writes:
>> I beat at the grammar a bit to see what it would take to fix it at least
>> to the extent of allowing a_expr ColId in a select list after removing
>> postfix ops. It looked like it was doable by making these keywords more
>> reserved (all of which are already reserved words per spec):
>> DOUBLE, DAY, FILTER, HOUR, MINUTE, MONTH, OVER, PRECISION, SECOND,
>> VARYING, WITHIN, WITHOUT, YEAR
> Yeah, a side effect of allowing "a_expr ColId" is that we can expect,
> going forward, that a lot of new keywords are going to have to become
> fully reserved that otherwise wouldn't have to be. This is particularly
> a problem because of the SQL committee's COBOL-hangover tendency to
> invent new syntax that involves sequences of keywords; we usually
> don't have a good way to deal with that short of making the first
> keyword(s) reserved.
> It's arguable that going down that path will, in the long run, lead to
> breaking more applications (via their table/column names suddenly becoming
> reserved in some new version) than we rescue from having to quote their
> SELECT aliases. At the very least we need to recognize that this is far
> from cost-free.
It depends on the source of those applications. Applications
originally written for PostgreSQL are going to break if we reserve
those keywords. Applications originally written for other databases
that already reserve those words won't, and migrating to PostgreSQL
will become easier for those people. I think this is to some extent a
question about whether it's more important to have backward
compatibility with our own previous releases or compatibility with
other SQL database systems.
> (wanders away wondering exactly what parsing technology the SQL committee
> thinks implementations use...)
I wonder about this, too, because I've noticed that one other system
in particular seems to do parsing in a quite different manner than we
do (but I have no idea specifically how they do it). bison is a good
tool in many ways and converting to something else would be a huge
amount of work, but there are also a number of things about it that
are not so great:
- The fact that conflicts can only be resolved with precedence
declarations sucks. You can only set the priority of rule A relative
to rule B unless they've both got a precedence assigned, and there's
frequently no non-invasive way to accomplish that. It would be nice
to be able to mark the postfix operator production as "weak" so that
it's only used when no other interpretation is possible. Of course
this kind of thing could be overdone leading to a confusing grammar,
but it's not a bad idea to be able to do things like this to handle
corner cases, at least IMHO.
- It really only handles LR(1), but for certain cases more tokens of
lookahead would be really useful. NULLS_LA and NOT_LA are nasty hacks
to work around the lack of adequate lookahead, and there are other
cases where we could do nicer things if we had it.
- There's no way to modify the parser at runtime, which means our
extension facility can't invent new SQL syntax, not even e.g. CREATE
THINGY and DROP THINGY. (Our lack of support for thingys is really
holding us back.)
- The release cadence is extremely slow. They just released 3.0.5,
but 3.0.4 came out in 2015 and 3.0.3 in 2013. It's hard to imagine
bison going away completely, but it's also pretty hard to imagine it
ever having any new features that would help us. And if we find a
bug, waiting for the next release to fix it is going to be painful.
To all appearances, it's only a little ahead of abandonware.
I'm not sure that there's a better tool than bison out there and I'm
not volunteering to write one in my spare time, but if something turns
up, we might not want to dismiss it out of hand.
The Enterprise PostgreSQL Company