mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
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.
This commit is contained in:
@@ -232,7 +232,11 @@ typedef enum A_Expr_Kind
|
||||
AEXPR_DISTINCT, /* IS DISTINCT FROM - name must be "=" */
|
||||
AEXPR_NULLIF, /* NULLIF - name must be "=" */
|
||||
AEXPR_OF, /* IS [NOT] OF - name must be "=" or "<>" */
|
||||
AEXPR_IN /* [NOT] IN - name must be "=" or "<>" */
|
||||
AEXPR_IN, /* [NOT] IN - name must be "=" or "<>" */
|
||||
AEXPR_BETWEEN, /* name must be "BETWEEN" */
|
||||
AEXPR_NOT_BETWEEN, /* name must be "NOT BETWEEN" */
|
||||
AEXPR_BETWEEN_SYM, /* name must be "BETWEEN SYMMETRIC" */
|
||||
AEXPR_NOT_BETWEEN_SYM /* name must be "NOT BETWEEN SYMMETRIC" */
|
||||
} A_Expr_Kind;
|
||||
|
||||
typedef struct A_Expr
|
||||
|
||||
Reference in New Issue
Block a user