• Tom Lane's avatar
    Re-implement pl/pgsql's expression and assignment parsing. · c9d52984
    Tom Lane authored
    Invent new RawParseModes that allow the core grammar to handle
    pl/pgsql expressions and assignments directly, and thereby get rid
    of a lot of hackery in pl/pgsql's parser.  This moves a good deal
    of knowledge about pl/pgsql into the core code: notably, we have to
    invent a CoercionContext that matches pl/pgsql's (rather dubious)
    historical behavior for assignment coercions.  That's getting away
    from the original idea of pl/pgsql as an arm's-length extension of
    the core, but really we crossed that bridge a long time ago.
    
    The main advantage of doing this is that we can now use the core
    parser to generate FieldStore and/or SubscriptingRef nodes to handle
    assignments to pl/pgsql variables that are records or arrays.  That
    fixes a number of cases that had never been implemented in pl/pgsql
    assignment, such as nested records and array slicing, and it allows
    pl/pgsql assignment to support the datatype-specific subscripting
    behaviors introduced in commit c7aba7c1.
    
    There are cosmetic benefits too: when a syntax error occurs in a
    pl/pgsql expression, the error report no longer includes the confusing
    "SELECT" keyword that used to get prefixed to the expression text.
    Also, there seem to be some small speed gains.
    
    Discussion: https://postgr.es/m/4165684.1607707277@sss.pgh.pa.us
    c9d52984
equalfuncs.c 84.6 KB