|
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_declaration storage_clause opt_initializer c_anything
|
546 | 546 | %type <str> variable_list variable c_thing c_term ECPGKeywords_vanames
|
547 | 547 | %type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
|
548 |
| -%type <str> execstring server_name ECPGVarDeclaration |
| 548 | +%type <str> execstring server_name ECPGVarDeclaration func_expr |
549 | 549 | %type <str> connection_object opt_server opt_port c_stuff c_stuff_item
|
550 | 550 | %type <str> user_name opt_user char_variable ora_user ident opt_reference
|
551 | 551 | %type <str> var_type_declarations quoted_ident_stringvar ECPGKeywords_rest
|
@@ -2210,8 +2210,8 @@ index_params: index_elem { $$ = $1; }
|
2210 | 2210 |
|
2211 | 2211 | index_elem: ColId opt_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_expr opt_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: WHERE a_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 %prec UMINUS |
| 3772 | + { $$ = $1; } |
| 3773 | + | EXISTS select_with_parens |
| 3774 | + { $$ = cat2_str(make_str("exists"), $2); } |
| 3775 | + | ARRAY select_with_parens |
| 3776 | + { $$ = cat2_str(make_str("array"), $2); } |
| 3777 | + | ARRAY array_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 %prec UMINUS |
3824 |
| - { $$ = $1; } |
3825 |
| - | EXISTS select_with_parens |
3826 |
| - { $$ = cat2_str(make_str("exists"), $2); } |
3827 |
| - | ARRAY select_with_parens |
3828 |
| - { $$ = cat2_str(make_str("array"), $2); } |
3829 |
| - | ARRAY array_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: CASE case_arg when_clause_list case_default END_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_list when_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"); }
|
|
0 commit comments