mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Further tweaking of raw grammar output to distinguish different inputs.
Use a different A_Expr_Kind for LIKE/ILIKE/SIMILAR TO constructs, so that they can be distinguished from direct invocation of the underlying operators. Also, postpone selection of the operator name when transforming "x IN (select)" to "x = ANY (select)", so that those syntaxes can be told apart at parse analysis time. I had originally thought I'd also have to do something special for the syntaxes IS NOT DISTINCT FROM, IS NOT DOCUMENT, and x NOT IN (SELECT...), which the grammar translates as though they were NOT (construct). On reflection though, we can distinguish those cases reliably by noting whether the parse location shown for the NOT is the same as for its child node. This only requires tweaking the parse locations for NOT IN, which I've done here. These changes should have no effect outside the parser; they're just in support of being able to give accurate warnings for planned operator precedence changes.
This commit is contained in:
@ -182,6 +182,12 @@ transformExprRecurse(ParseState *pstate, Node *expr)
|
||||
case AEXPR_IN:
|
||||
result = transformAExprIn(pstate, a);
|
||||
break;
|
||||
case AEXPR_LIKE:
|
||||
case AEXPR_ILIKE:
|
||||
case AEXPR_SIMILAR:
|
||||
/* we can transform these just like AEXPR_OP */
|
||||
result = transformAExprOp(pstate, a);
|
||||
break;
|
||||
case AEXPR_BETWEEN:
|
||||
case AEXPR_NOT_BETWEEN:
|
||||
case AEXPR_BETWEEN_SYM:
|
||||
@ -1648,6 +1654,12 @@ transformSubLink(ParseState *pstate, SubLink *sublink)
|
||||
List *right_list;
|
||||
ListCell *l;
|
||||
|
||||
/*
|
||||
* If the source was "x IN (select)", convert to "x = ANY (select)".
|
||||
*/
|
||||
if (sublink->operName == NIL)
|
||||
sublink->operName = list_make1(makeString("="));
|
||||
|
||||
/*
|
||||
* Transform lefthand expression, and convert to a list
|
||||
*/
|
||||
|
Reference in New Issue
Block a user