• Tom Lane's avatar
    Represent BETWEEN as a special node type in raw parse trees. · 34af082f
    Tom Lane authored
    Previously, gram.y itself converted BETWEEN into AND (or AND/OR) nests of
    expression comparisons.  This was always as bogus as could be, but fixing
    it hasn't risen to the top of the to-do list.  The present patch invents an
    A_Expr representation for BETWEEN expressions, and does the expansion to
    comparison trees in parse_expr.c which is at least a slightly saner place
    to be doing semantic conversions.  There should be no change in the post-
    parse-analysis results.
    
    This does nothing for the semantic issues with BETWEEN (dubious connection
    to btree-opclass semantics, and multiple evaluation of possibly volatile
    subexpressions) ... but it's a necessary preliminary step before we could
    fix any of that.  The main immediate benefit is that preserving BETWEEN as
    an identifiable raw-parse-tree construct will enable better error messages.
    
    While at it, fix the code so that multiply-referenced subexpressions are
    physically duplicated before being passed through transformExpr().  This
    gets rid of one of the principal reasons why transformExpr() has
    historically had to allow already-processed input.
    34af082f
gram.y 378 KB