Thread: CREATE RULE syntax simplification

CREATE RULE syntax simplification

From
Tom Lane
Date:
There are a couple of gripes in the pgsql-sql list this morning about
being unable to enter CREATE RULE commands that specify multiple
actions --- those folk are getting parser: parse error at or near ""
from what appears to be perfectly valid syntax.  I suppose they are
getting burnt by a broken vendor-supplied yacc.  But while looking at
this, I couldn't help noticing how crufty the syntax is:

RuleActionList:  NOTHING                { $$ = NIL; }       | SelectStmt                    { $$ = lcons($1, NIL); }
  | RuleActionStmt                { $$ = lcons($1, NIL); }       | '[' RuleActionBlock ']'       { $$ = $2; }       |
'('RuleActionBlock ')'       { $$ = $2; }        ;
 

RuleActionBlock:  RuleActionMulti       {  $$ = $1; }       | RuleActionStmt                { $$ = lcons($1, NIL); }
  ;
 

RuleActionMulti:  RuleActionMulti RuleActionStmt               {  $$ = lappend($1, $2); }       | RuleActionMulti
RuleActionStmt';'               {  $$ = lappend($1, $2); }       | RuleActionStmt ';'               { $$ = lcons($1,
NIL);}       ;
 

RuleActionStmt: InsertStmt       | UpdateStmt       | DeleteStmt       | NotifyStmt       ;

What's wrong with that you say?  Well, it allows a RuleActionBlock to
be made up of RuleActionStmts that aren't separated by semicolons.
Specifically    stmt1 ; stmt2 stmt3 stmt4
has a production sequence.

I don't know if that was intentional or not, but it sure looks like
a shift/reduce conflict waiting to happen, as soon as the possible
RuleActionStmts get any more complicated.  In any case, it's pretty
bizarre that a semi is only required after the first statement.

I suggest that we require separating semicolons and simplify the
RuleActionBlock production to a more conventional list style,

RuleActionBlock:  RuleActionStmt    | RuleActionBlock ';' RuleActionStmt    | RuleActionBlock ';'

(the last alternative isn't normal list style, but it allows a trailing
semicolon which is accepted by the existing grammar).

Aside from forestalling future trouble with syntax extensions, this
might make us work a little better with old versions of yacc.  I don't
know exactly why this area is a trouble spot for vendor yaccs, but it
seems to be.  Simplifying the syntax may well help.

Comments?  Anyone really in love with semicolon-less rule lists?
        regards, tom lane