Represent BETWEEN as a special node type in raw parse trees.

Tom Lane <tgl@sss.pgh.pa.us>

Commit: 34af082f95aa6adb8af5fbd4da46bd4c3c176856
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2015-02-22T18:57:56Z
Releases: 9.5.0
Represent BETWEEN as a special node type in raw parse trees.

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.

Files

PathChange+/−
src/backend/nodes/outfuncs.c modified +16 −0
src/backend/parser/gram.y modified +21 −35
src/backend/parser/parse_expr.c modified +102 −0
src/include/nodes/parsenodes.h modified +5 −1