|
11 | 11 | *
|
12 | 12 | *
|
13 | 13 | * IDENTIFICATION
|
14 |
| - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.475 2004/08/2904:12:35 momjian Exp $ |
| 14 | + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.476 2004/09/2923:39:20 tgl Exp $ |
15 | 15 | *
|
16 | 16 | * HISTORY
|
17 | 17 | * AUTHORDATEMAJOR EVENT
|
@@ -272,8 +272,8 @@ static void doNegateFloat(Value *v);
|
272 | 272 | %type<node>columnDef
|
273 | 273 | %type<defelt>def_elem
|
274 | 274 | %type<node>def_argcolumnElemwhere_clause
|
275 |
| -a_exprb_exprc_exprAexprConstindirection_elcolumnref |
276 |
| -in_exprhaving_clausefunc_tablearray_expr |
| 275 | +a_exprb_exprc_exprfunc_exprAexprConstindirection_el |
| 276 | +columnrefin_exprhaving_clausefunc_tablearray_expr |
277 | 277 | %type<list>rowtype_listarray_expr_list
|
278 | 278 | %type<node>case_exprcase_argwhen_clausecase_default
|
279 | 279 | %type<list>when_clause_list
|
@@ -3238,18 +3238,12 @@ index_elem:ColId opt_class
|
3238 | 3238 | $$->expr =NULL;
|
3239 | 3239 | $$->opclass =$2;
|
3240 | 3240 | }
|
3241 |
| -|func_name'(' expr_list')' opt_class |
| 3241 | +|func_expr opt_class |
3242 | 3242 | {
|
3243 |
| -FuncCall *n = makeNode(FuncCall); |
3244 |
| -n->funcname =$1; |
3245 |
| -n->args =$3; |
3246 |
| -n->agg_star =FALSE; |
3247 |
| -n->agg_distinct =FALSE; |
3248 |
| - |
3249 | 3243 | $$ = makeNode(IndexElem);
|
3250 | 3244 | $$->name =NULL;
|
3251 |
| -$$->expr =(Node *)n; |
3252 |
| -$$->opclass =$5; |
| 3245 | +$$->expr =$1; |
| 3246 | +$$->opclass =$2; |
3253 | 3247 | }
|
3254 | 3248 | |'(' a_expr')' opt_class
|
3255 | 3249 | {
|
@@ -6479,7 +6473,55 @@ c_expr:columnref{ $$ = $1; }
|
6479 | 6473 | }
|
6480 | 6474 | | case_expr
|
6481 | 6475 | {$$ =$1; }
|
6482 |
| -| func_name'('')' |
| 6476 | +| func_expr |
| 6477 | +{$$ =$1; } |
| 6478 | +| select_with_parens%prec UMINUS |
| 6479 | +{ |
| 6480 | +SubLink *n = makeNode(SubLink); |
| 6481 | +n->subLinkType = EXPR_SUBLINK; |
| 6482 | +n->lefthand = NIL; |
| 6483 | +n->operName = NIL; |
| 6484 | +n->subselect =$1; |
| 6485 | +$$ = (Node *)n; |
| 6486 | +} |
| 6487 | +| EXISTS select_with_parens |
| 6488 | +{ |
| 6489 | +SubLink *n = makeNode(SubLink); |
| 6490 | +n->subLinkType = EXISTS_SUBLINK; |
| 6491 | +n->lefthand = NIL; |
| 6492 | +n->operName = NIL; |
| 6493 | +n->subselect =$2; |
| 6494 | +$$ = (Node *)n; |
| 6495 | +} |
| 6496 | +| ARRAY select_with_parens |
| 6497 | +{ |
| 6498 | +SubLink *n = makeNode(SubLink); |
| 6499 | +n->subLinkType = ARRAY_SUBLINK; |
| 6500 | +n->lefthand = NIL; |
| 6501 | +n->operName = NIL; |
| 6502 | +n->subselect =$2; |
| 6503 | +$$ = (Node *)n; |
| 6504 | +} |
| 6505 | +| ARRAY array_expr |
| 6506 | +{$$ =$2;} |
| 6507 | +| row |
| 6508 | +{ |
| 6509 | +RowExpr *r = makeNode(RowExpr); |
| 6510 | +r->args =$1; |
| 6511 | +r->row_typeid = InvalidOid;/* not analyzed yet*/ |
| 6512 | +$$ = (Node *)r; |
| 6513 | +} |
| 6514 | +; |
| 6515 | + |
| 6516 | +/* |
| 6517 | + * func_expr is split out from c_expr just so that we have a classification |
| 6518 | + * for "everything that is a function call or looks like one". This isn't |
| 6519 | + * very important, but it saves us having to document which variants are |
| 6520 | + * legal in the backwards-compatible functional-index syntax for CREATE INDEX. |
| 6521 | + * (Note that many of the special SQL functions wouldn't actually make any |
| 6522 | + * sense as functional index entries, but we ignore that consideration here.) |
| 6523 | +*/ |
| 6524 | +func_expr:func_name'('')' |
6483 | 6525 | {
|
6484 | 6526 | FuncCall *n = makeNode(FuncCall);
|
6485 | 6527 | n->funcname =$1;
|
@@ -6936,42 +6978,6 @@ c_expr:columnref{ $$ = $1; }
|
6936 | 6978 | n->agg_distinct =FALSE;
|
6937 | 6979 | $$ = (Node *)n;
|
6938 | 6980 | }
|
6939 |
| -| select_with_parens%prec UMINUS |
6940 |
| -{ |
6941 |
| -SubLink *n = makeNode(SubLink); |
6942 |
| -n->subLinkType = EXPR_SUBLINK; |
6943 |
| -n->lefthand = NIL; |
6944 |
| -n->operName = NIL; |
6945 |
| -n->subselect =$1; |
6946 |
| -$$ = (Node *)n; |
6947 |
| -} |
6948 |
| -| EXISTS select_with_parens |
6949 |
| -{ |
6950 |
| -SubLink *n = makeNode(SubLink); |
6951 |
| -n->subLinkType = EXISTS_SUBLINK; |
6952 |
| -n->lefthand = NIL; |
6953 |
| -n->operName = NIL; |
6954 |
| -n->subselect =$2; |
6955 |
| -$$ = (Node *)n; |
6956 |
| -} |
6957 |
| -| ARRAY select_with_parens |
6958 |
| -{ |
6959 |
| -SubLink *n = makeNode(SubLink); |
6960 |
| -n->subLinkType = ARRAY_SUBLINK; |
6961 |
| -n->lefthand = NIL; |
6962 |
| -n->operName = NIL; |
6963 |
| -n->subselect =$2; |
6964 |
| -$$ = (Node *)n; |
6965 |
| -} |
6966 |
| -| ARRAY array_expr |
6967 |
| -{$$ =$2;} |
6968 |
| -| row |
6969 |
| -{ |
6970 |
| -RowExpr *r = makeNode(RowExpr); |
6971 |
| -r->args =$1; |
6972 |
| -r->row_typeid = InvalidOid;/* not analyzed yet*/ |
6973 |
| -$$ = (Node *)r; |
6974 |
| -} |
6975 | 6981 | ;
|
6976 | 6982 |
|
6977 | 6983 | /*
|
|