Skip to content

Commit 2647ad6

Browse files
committed
Fix alias-for-target-table-of-UPDATE-or-DELETE patch so that alias can
be any ColId other than 'SET', rather than only IDENT as originally. Per discussion.
1 parent 1d763d9 commit 2647ad6

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

src/backend/parser/gram.y

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.523 2006/01/22 05:20:33 neilc Exp $
14+
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.524 2006/01/22 20:03:16 tgl Exp $
1515
*
1616
* HISTORY
1717
* AUTHOR DATE MAJOR EVENT
@@ -429,6 +429,7 @@ static void doNegateFloat(Value *v);
429429
%token <ival> ICONST PARAM
430430

431431
/* precedence: lowest to highest */
432+
%nonassoc SET /* see relation_expr_opt_alias */
432433
%left UNION EXCEPT
433434
%left INTERSECT
434435
%left OR
@@ -5880,11 +5881,27 @@ relation_expr:
58805881
;
58815882

58825883

5883-
relation_expr_opt_alias: relation_expr
5884+
/*
5885+
* Given "UPDATE foo set set ...", we have to decide without looking any
5886+
* further ahead whether the first "set" is an alias or the UPDATE's SET
5887+
* keyword. Since "set" is allowed as a column name both interpretations
5888+
* are feasible. We resolve the shift/reduce conflict by giving the first
5889+
* relation_expr_opt_alias production a higher precedence than the SET token
5890+
* has, causing the parser to prefer to reduce, in effect assuming that the
5891+
* SET is not an alias.
5892+
*/
5893+
relation_expr_opt_alias: relation_expr %prec UMINUS
58845894
{
58855895
$$ = $1;
58865896
}
5887-
| relation_expr opt_as IDENT
5897+
| relation_expr ColId
5898+
{
5899+
Alias *alias = makeNode(Alias);
5900+
alias->aliasname = $2;
5901+
$1->alias = alias;
5902+
$$ = $1;
5903+
}
5904+
| relation_expr AS ColId
58885905
{
58895906
Alias *alias = makeNode(Alias);
58905907
alias->aliasname = $3;
@@ -6827,7 +6844,7 @@ a_expr: c_expr { $$ = $1; }
68276844
$$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4);
68286845
}
68296846
}
6830-
| a_expr subquery_Op sub_type select_with_parens %prec Op
6847+
| a_expr subquery_Op sub_type select_with_parens %prec Op
68316848
{
68326849
SubLink *n = makeNode(SubLink);
68336850
n->subLinkType = $3;
@@ -6836,14 +6853,14 @@ a_expr: c_expr { $$ = $1; }
68366853
n->subselect = $4;
68376854
$$ = (Node *)n;
68386855
}
6839-
| a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
6856+
| a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
68406857
{
68416858
if ($3 == ANY_SUBLINK)
68426859
$$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5);
68436860
else
68446861
$$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5);
68456862
}
6846-
| UNIQUE select_with_parens %prec Op
6863+
| UNIQUE select_with_parens
68476864
{
68486865
/* Not sure how to get rid of the parentheses
68496866
* but there are lots of shift/reduce errors without them.
@@ -6901,7 +6918,7 @@ b_expr: c_expr
69016918
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
69026919
| b_expr qual_Op %prec POSTFIXOP
69036920
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
6904-
| b_expr IS DISTINCT FROM b_expr %prec IS
6921+
| b_expr IS DISTINCT FROM b_expr %prec IS
69056922
{
69066923
$$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5);
69076924
}
@@ -6910,7 +6927,7 @@ b_expr: c_expr
69106927
$$ = (Node *) makeA_Expr(AEXPR_NOT, NIL,
69116928
NULL, (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $6));
69126929
}
6913-
| b_expr IS OF '(' type_list ')' %prec IS
6930+
| b_expr IS OF '(' type_list ')' %prec IS
69146931
{
69156932
$$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
69166933
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy