|
1 |
| -/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.297 2004/09/27 09:59:17 meskes Exp $*/ |
| 1 | +/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.298 2004/10/18 13:36:23 meskes Exp $*/ |
2 | 2 |
|
3 | 3 | /* Copyright comment*/
|
4 | 4 | %{
|
@@ -545,7 +545,7 @@ add_additional_variables(char *name, bool insert)
|
545 | 545 | %type<str>storage_declarationstorage_clauseopt_initializerc_anything
|
546 | 546 | %type<str>variable_listvariablec_thingc_termECPGKeywords_vanames
|
547 | 547 | %type<str>opt_pointerECPGDisconnectdis_namestorage_modifier
|
548 |
| -%type<str>execstringserver_nameECPGVarDeclaration |
| 548 | +%type<str>execstringserver_nameECPGVarDeclarationfunc_expr |
549 | 549 | %type<str>connection_objectopt_serveropt_portc_stuffc_stuff_item
|
550 | 550 | %type<str>user_nameopt_userchar_variableora_useridentopt_reference
|
551 | 551 | %type<str>var_type_declarationsquoted_ident_stringvarECPGKeywords_rest
|
@@ -2210,8 +2210,8 @@ index_params: index_elem{ $$ = $1; }
|
2210 | 2210 |
|
2211 | 2211 | index_elem:ColIdopt_class
|
2212 | 2212 | {$$ = cat2_str($1,$2); }
|
2213 |
| -|func_name'('expr_list')'opt_class |
2214 |
| -{$$ =cat_str(5,$1,make_str("("),$3,")",$5); } |
| 2213 | +|func_expropt_class |
| 2214 | +{$$ =cat2_str($1,$2); } |
2215 | 2215 | |'('a_expr')'opt_class
|
2216 | 2216 | {$$ = cat_str(4, make_str("("),$2, make_str(")"),$4); }
|
2217 | 2217 | ;
|
@@ -3291,10 +3291,7 @@ relation_expr:qualified_name
|
3291 | 3291 | {/* inheritance query*/$$ = cat_str(3, make_str("only ("),$3, make_str(")")); }
|
3292 | 3292 | ;
|
3293 | 3293 |
|
3294 |
| -func_table:func_name'('')' |
3295 |
| -{$$ = cat2_str($1, make_str("()")); } |
3296 |
| -|func_name'('expr_list')' |
3297 |
| -{$$ = cat_str(4,$1, make_str("("),$3, make_str(")")); } |
| 3294 | +func_table:func_expr {$$ =$1; } |
3298 | 3295 | ;
|
3299 | 3296 |
|
3300 | 3297 | where_clause:WHEREa_expr{$$ = cat2_str(make_str("where"),$2); }
|
@@ -3769,7 +3766,29 @@ c_expr: columnref
|
3769 | 3766 | {$$ = cat_str(4, make_str("("),$2, make_str(")"),$4); }
|
3770 | 3767 | |case_expr
|
3771 | 3768 | {$$ =$1; }
|
3772 |
| -|func_name'('')' |
| 3769 | +|func_expr |
| 3770 | +{$$ =$1; } |
| 3771 | +|select_with_parens%precUMINUS |
| 3772 | +{$$ =$1; } |
| 3773 | +|EXISTSselect_with_parens |
| 3774 | +{$$ = cat2_str(make_str("exists"),$2); } |
| 3775 | +|ARRAYselect_with_parens |
| 3776 | +{$$ = cat2_str(make_str("array"),$2); } |
| 3777 | +|ARRAYarray_expr |
| 3778 | +{$$ = cat2_str(make_str("array"),$2); } |
| 3779 | +|row |
| 3780 | +{$$ =$1; } |
| 3781 | +; |
| 3782 | + |
| 3783 | +/* |
| 3784 | + * func_expr is split out from c_expr just so that we have a classification |
| 3785 | + * for "everything that is a function call or looks like one". This isn't |
| 3786 | + * very important, but it saves us having to document which variants are |
| 3787 | + * legal in the backwards-compatible functional-index syntax for CREATE INDEX. |
| 3788 | + * (Note that many of the special SQL functions wouldn't actually make any |
| 3789 | + * sense as functional index entries, but we ignore that consideration here.) |
| 3790 | +*/ |
| 3791 | +func_expr:func_name'('')' |
3773 | 3792 | {$$ = cat2_str($1, make_str("()"));}
|
3774 | 3793 | |func_name'('expr_list')'
|
3775 | 3794 | {$$ = cat_str(4,$1, make_str("("),$3, make_str(")"));}
|
@@ -3820,18 +3839,13 @@ c_expr: columnref
|
3820 | 3839 | {$$ = cat_str(5, make_str("convert("),$3, make_str("using"),$5, make_str(")"));}
|
3821 | 3840 | |CONVERT'('expr_list')'
|
3822 | 3841 | {$$ = cat_str(3, make_str("convert("),$3, make_str(")")); }
|
3823 |
| -|select_with_parens%precUMINUS |
3824 |
| -{$$ =$1; } |
3825 |
| -|EXISTSselect_with_parens |
3826 |
| -{$$ = cat2_str(make_str("exists"),$2); } |
3827 |
| -|ARRAYselect_with_parens |
3828 |
| -{$$ = cat2_str(make_str("array"),$2); } |
3829 |
| -|ARRAYarray_expr |
3830 |
| -{$$ = cat2_str(make_str("array"),$2); } |
3831 |
| -|row |
3832 |
| -{$$ =$1; } |
| 3842 | +|NULLIF'('a_expr','a_expr')' |
| 3843 | + {$$ = cat_str(5, make_str("nullif("),$3, make_str(","),$5, make_str(")")); } |
| 3844 | +|COALESCE'('expr_list')' |
| 3845 | +{$$ = cat_str(3, make_str("coalesce("),$3, make_str(")")); } |
3833 | 3846 | ;
|
3834 | 3847 |
|
| 3848 | + |
3835 | 3849 | row:ROW'('expr_list')'
|
3836 | 3850 | {$$ = cat_str(3, make_str("row ("),$3, make_str(")")); }
|
3837 | 3851 | |ROW'('')'
|
@@ -3972,25 +3986,9 @@ in_expr: select_with_parens
|
3972 | 3986 |
|
3973 | 3987 | /* Case clause
|
3974 | 3988 | * Define SQL92-style case clause.
|
3975 |
| - * Allow all four forms described in the standard: |
3976 |
| - * - Full specification |
3977 |
| - *CASE WHEN a = b THEN c ... ELSE d END |
3978 |
| - * - Implicit argument |
3979 |
| - *CASE a WHEN b THEN c ... ELSE d END |
3980 |
| - * - Conditional NULL |
3981 |
| - *NULLIF(x,y) |
3982 |
| - *same as CASE WHEN x = y THEN NULL ELSE x END |
3983 |
| - * - Conditional substitution from list, use first non-null argument |
3984 |
| - *COALESCE(a,b,...) |
3985 |
| - * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END |
3986 |
| - * - thomas 1998-11-09 |
3987 | 3989 | */
|
3988 | 3990 | case_expr:CASEcase_argwhen_clause_listcase_defaultEND_P
|
3989 | 3991 | {$$ = cat_str(5, make_str("case"),$2,$3,$4, make_str("end")); }
|
3990 |
| -|NULLIF'('a_expr','a_expr')' |
3991 |
| -{$$ = cat_str(5, make_str("nullif("),$3, make_str(","),$5, make_str(")")); } |
3992 |
| -|COALESCE'('expr_list')' |
3993 |
| -{$$ = cat_str(3, make_str("coalesce("),$3, make_str(")")); } |
3994 | 3992 | ;
|
3995 | 3993 |
|
3996 | 3994 | when_clause_list:when_clause_listwhen_clause
|
@@ -5981,6 +5979,7 @@ ECPGunreserved: ABORT_P{ $$ = make_str("abort"); }
|
5981 | 5979 | |NOCREATEUSER{$$ = make_str("nocreateuser"); }
|
5982 | 5980 | |NOTHING{$$ = make_str("nothing"); }
|
5983 | 5981 | |NOTIFY{$$ = make_str("notify"); }
|
| 5982 | +|NOWAIT{$$ = make_str("nowait"); } |
5984 | 5983 | |OBJECT_P{$$ = make_str("object"); }
|
5985 | 5984 | |OF{$$ = make_str("of"); }
|
5986 | 5985 | |OIDS{$$ = make_str("oids"); }
|
@@ -6196,7 +6195,6 @@ reserved_keyword:
|
6196 | 6195 | |LIMIT{$$ = make_str("limit"); }
|
6197 | 6196 | |NEW{$$ = make_str("new"); }
|
6198 | 6197 | |NOT{$$ = make_str("not"); }
|
6199 |
| -|NOWAIT{$$ = make_str("nowait"); } |
6200 | 6198 | |NULL_P{$$ = make_str("null"); }
|
6201 | 6199 | |OFF{$$ = make_str("off"); }
|
6202 | 6200 | |OFFSET{$$ = make_str("offset"); }
|
|