1- /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.373 2008/10/04 21:56 :55tgl Exp $*/
1+ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.374 2008/10/07 12:43 :55meskes Exp $*/
22
33/* Copyright comment*/
44%{
@@ -621,8 +621,8 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
621621%type <str> handler_name any_name_list any_name opt_as insert_column_list
622622%type <str> columnref values_clause AllConstVar prep_type_clause ExecuteStmt
623623%type <str> insert_column_item DropRuleStmt ctext_expr execute_param_clause
624- %type <str> createfunc_opt_item set_rest
625- %type <str> CreateFunctionStmt createfunc_opt_list func_table
624+ %type <str> createfunc_opt_item set_rest with_clause common_table_expr
625+ %type <str> CreateFunctionStmt createfunc_opt_list func_table cte_list
626626%type <str> DropUserStmt copy_from copy_opt_list copy_opt_item
627627%type <str> opt_oids TableLikeClause key_action opt_definition
628628%type <str> cast_context row qual_Op qual_all_Op opt_default
@@ -632,7 +632,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
632632%type <str> ConstBit GenericType TableFuncElementList opt_analyze
633633%type <str> opt_sort_clause subquery_Op transaction_mode_item
634634%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
635- %type <str> indicator ecpg_using ecpg_into DeallocateStmt
635+ %type <str> indicator ecpg_using ecpg_into DeallocateStmt interval_second
636636%type <str> storage_declaration storage_clause opt_initializer c_anything
637637%type <str> variable_list variable c_thing c_term ECPGKeywords_vanames
638638%type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
@@ -2099,7 +2099,7 @@ DefineStmt: CREATE AGGREGATE func_name aggr_args definition
20992099{$$ = cat_str(4 , make_str(" create aggregate" ),$3 ,$4 ,$5 ); }
21002100| CREATE AGGREGATE func_name old_aggr_definition
21012101{$$ = cat_str(3 , make_str(" create aggregate" ),$3 ,$4 ); }
2102- | CREATE OPERATOR all_Op definition
2102+ | CREATE OPERATOR any_operator definition
21032103{$$ = cat_str(3 , make_str(" create operator" ),$3 ,$4 ); }
21042104| CREATE TYPE_P any_name definition
21052105{$$ = cat_str(3 , make_str(" create type" ),$3 ,$4 ); }
@@ -2169,8 +2169,8 @@ opclass_item_list:opclass_item{ $$ = $1; }
21692169
21702170opclass_item :OPERATOR PosIntConst any_operator opt_recheck
21712171{$$ = cat_str(4 , make_str(" operator" ),$2 ,$3 ,$4 ); }
2172- | OPERATOR PosIntConst any_operator ' ( ' oper_argtypes ' ) ' opt_recheck
2173- {$$ = cat_str(7 , make_str(" operator" ),$2 ,$3 ,make_str( " ( " ), $5 , make_str( " ) " ), $7 ); }
2172+ | OPERATOR PosIntConst any_operator oper_argtypes opt_recheck
2173+ {$$ = cat_str(5 , make_str(" operator" ),$2 ,$3 ,$4 , $5 ); }
21742174| FUNCTION PosIntConst func_name func_args
21752175{$$ = cat_str(4 , make_str(" function" ),$2 ,$3 ,$4 ); }
21762176| FUNCTION PosIntConst ' (' type_list ' )' func_name func_args
@@ -2397,8 +2397,8 @@ CommentStmt: COMMENT ON comment_type name IS comment_text
23972397{$$ = cat_str(5 , make_str(" comment on aggregate" ),$4 ,$5 , make_str(" is" ),$7 ); }
23982398| COMMENT ON FUNCTION func_name func_args IS comment_text
23992399{$$ = cat_str(5 , make_str(" comment on function" ),$4 ,$5 , make_str(" is" ),$7 ); }
2400- | COMMENT ON OPERATOR all_Op ' ( ' oper_argtypes ' ) ' IS comment_text
2401- {$$ = cat_str(6 , make_str(" comment on operator" ),$4 ,make_str( " ( " ), $6 , make_str(" ) is" ),$9 ); }
2400+ | COMMENT ON OPERATOR any_operator oper_argtypes IS comment_text
2401+ {$$ = cat_str(5 , make_str(" comment on operator" ),$4 ,$5 , make_str(" is" ),$7 ); }
24022402| COMMENT ON TRIGGER name ON any_name IS comment_text
24032403{$$ = cat_str(6 , make_str(" comment on trigger" ),$4 , make_str(" on" ),$6 , make_str(" is" ),$8 ); }
24042404| COMMENT ON RULE name ON any_name IS comment_text
@@ -2761,23 +2761,23 @@ RemoveAggrStmt: DROP AGGREGATE func_name aggr_args opt_drop_behavior
27612761{$$ = cat_str(4 , make_str(" drop aggregate if exists" ),$5 ,$6 ,$7 ); }
27622762;
27632763
2764- RemoveOperStmt :DROP OPERATOR all_Op ' ( ' oper_argtypes ' ) ' opt_drop_behavior
2765- {$$ = cat_str(6 , make_str(" drop operator" ),$3 ,make_str( " ( " ), $5 , make_str( " ) " ), $7 ); }
2766- | DROP OPERATOR IF_P EXISTS any_operator ' ( ' oper_argtypes ' ) ' opt_drop_behavior
2767- {$$ = cat_str(6 , make_str(" drop operator if exists" ),$5 ,make_str( " ( " ), $7 , make_str( " ) " ), $9 ); }
2764+ RemoveOperStmt :DROP OPERATOR any_operator oper_argtypes opt_drop_behavior
2765+ {$$ = cat_str(4 , make_str(" drop operator" ),$3 ,$4 , $5 ); }
2766+ | DROP OPERATOR IF_P EXISTS any_operator oper_argtypes opt_drop_behavior
2767+ {$$ = cat_str(4 , make_str(" drop operator if exists" ),$5 ,$6 , $7 ); }
27682768;
27692769
2770- oper_argtypes :Typename
2770+ oper_argtypes :' ( ' Typename ' ) '
27712771{
27722772mmerror (PARSE_ERROR, ET_ERROR," parser: argument type missing (use NONE for unary operators)" );
27732773$$ = make_str(" none" );
27742774}
2775- | Typename ' ,' Typename
2776- {$$ = cat_str(3 , $1 , make_str(" ," ),$3 ); }
2777- | NONE ' ,' Typename /* left unary*/
2778- {$$ =cat2_str( make_str(" none," ),$3 ); }
2779- | Typename ' ,' NONE /* right unary*/
2780- {$$ =cat2_str( $1 , make_str(" , none" )); }
2775+ | ' ( ' Typename ' ,' Typename ' ) '
2776+ {$$ = cat_str(5 , make_str( " ( " ), $2 , make_str(" ," ),$4 , make_str( " ) " ) ); }
2777+ | ' ( ' NONE ' ,' Typename ' ) ' /* left unary*/
2778+ {$$ =cat_str( 3 , make_str(" ( none," ),$4 , make_str( " ) " ) ); }
2779+ | ' ( ' Typename ' ,' NONE ' ) ' /* right unary*/
2780+ {$$ =cat_str( 3 , make_str( " ( " ), $2 , make_str(" , none) " )); }
27812781;
27822782
27832783any_operator :
@@ -2930,8 +2930,8 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
29302930{$$ = cat_str(4 , make_str(" alter function" ),$3 , make_str(" owner to" ),$6 ); }
29312931| ALTER opt_procedural LANGUAGE name OWNER TO RoleId
29322932{$$ = cat_str(6 , make_str(" alter" ),$2 , make_str(" language" ),$4 , make_str(" owner to" ),$7 ); }
2933- | ALTER OPERATOR any_operator ' ( ' oper_argtypes ' ) ' OWNER TO RoleId
2934- {$$ = cat_str(6 , make_str(" alter operator" ),$3 ,make_str( " ( " ), $5 , make_str(" ) owner to" ),$9 ); }
2933+ | ALTER OPERATOR any_operator oper_argtypes OWNER TO RoleId
2934+ {$$ = cat_str(5 , make_str(" alter operator" ),$3 ,$4 , make_str(" owner to" ),$7 ); }
29352935| ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
29362936{$$ = cat_str(6 , make_str(" alter operator class" ),$4 , make_str(" using" ),$6 , make_str(" owner to" ),$9 ); }
29372937| ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId
@@ -3162,6 +3162,14 @@ createdb_opt_item:TABLESPACE opt_equal name
31623162{$$ = cat_str(3 , make_str(" encoding" ),$2 ,$3 ); }
31633163| ENCODING opt_equal DEFAULT
31643164{$$ = cat_str(3 , make_str(" encoding" ),$2 , make_str(" default" )); }
3165+ | COLLATE opt_equal StringConst
3166+ {$$ = cat_str(3 , make_str(" collate" ),$2 ,$3 ); }
3167+ | COLLATE opt_equal DEFAULT
3168+ {$$ = cat_str(3 , make_str(" collate" ),$2 , make_str(" default" )); }
3169+ | CTYPE opt_equal StringConst
3170+ {$$ = cat_str(3 , make_str(" ctype" ),$2 ,$3 ); }
3171+ | CTYPE opt_equal DEFAULT
3172+ {$$ = cat_str(3 , make_str(" ctype" ),$2 , make_str(" default" )); }
31653173| CONNECTION LIMIT opt_equal PosIntConst
31663174{$$ = cat_str(3 , make_str(" connection limit" ),$3 ,$4 ); }
31673175| OWNER opt_equal name
@@ -3598,6 +3606,14 @@ select_no_parens: simple_select
35983606{$$ = cat_str(4 ,$1 ,$2 ,$3 ,$4 ); }
35993607| select_clause opt_sort_clause select_limit opt_for_locking_clause
36003608{$$ = cat_str(4 ,$1 ,$2 ,$3 ,$4 ); }
3609+ | with_clause simple_select
3610+ {$$ = cat2_str($1 ,$2 ); }
3611+ | with_clause select_clause sort_clause
3612+ {$$ = cat_str(3 ,$1 ,$2 ,$3 ); }
3613+ | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
3614+ {$$ = cat_str(5 ,$1 ,$2 ,$3 ,$4 ,$5 ); }
3615+ | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
3616+ {$$ = cat_str(5 ,$1 ,$2 ,$3 ,$4 ,$5 ); }
36013617;
36023618
36033619select_clause :simple_select {$$ =$1 ; }
@@ -3618,6 +3634,21 @@ simple_select:SELECT opt_distinct target_list
36183634{$$ = cat_str(4 ,$1 , make_str(" except" ),$3 ,$4 ); }
36193635;
36203636
3637+ with_clause :
3638+ WITH cte_list {$$ = cat2_str(make_str(" with" ),$2 ); }
3639+ | WITH RECURSIVE cte_list {$$ = cat2_str(make_str(" with recursive" ),$3 ); }
3640+ ;
3641+
3642+ cte_list :
3643+ common_table_expr {$$ =$1 ; }
3644+ | cte_list ' ,' common_table_expr {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
3645+ ;
3646+
3647+
3648+ common_table_expr :name opt_name_list AS select_with_parens
3649+ {$$ = cat_str(4 ,$1 ,$2 , make_str(" as" ),$4 ); }
3650+ ;
3651+
36213652into_clause :INTO OptTempTableName
36223653{
36233654FoundInto =1 ;
@@ -3756,7 +3787,7 @@ for_locking_item:
37563787;
37573788
37583789locked_rels_list :
3759- OF name_list {$$ = cat2_str(make_str(" of" ),$2 ); }
3790+ OF qualified_name_list {$$ = cat2_str(make_str(" of" ),$2 ); }
37603791| /* EMPTY*/ {$$ = EMPTY; }
37613792;
37623793
@@ -4123,22 +4154,26 @@ opt_timezone: WITH TIME ZONE
41234154{$$ = EMPTY; }
41244155;
41254156
4126- opt_interval :YEAR_P {$$ = make_str(" year" ); }
4127- | MONTH_P {$$ = make_str(" month" ); }
4128- | DAY_P {$$ = make_str(" day" ); }
4129- | HOUR_P {$$ = make_str(" hour" ); }
4130- | MINUTE_P {$$ = make_str(" minute" ); }
4131- | SECOND_P {$$ =make_str( " second " ) ; }
4157+ opt_interval :YEAR_P {$$ = make_str(" year" ); }
4158+ | MONTH_P {$$ = make_str(" month" ); }
4159+ | DAY_P {$$ = make_str(" day" ); }
4160+ | HOUR_P {$$ = make_str(" hour" ); }
4161+ | MINUTE_P {$$ = make_str(" minute" ); }
4162+ | interval_second {$$ =$1 ; }
41324163| YEAR_P TO MONTH_P {$$ = make_str(" year to month" ); }
41334164| DAY_P TO HOUR_P {$$ = make_str(" day to hour" ); }
41344165| DAY_P TO MINUTE_P {$$ = make_str(" day to minute" ); }
4135- | DAY_P TO SECOND_P {$$ = make_str(" day to second" ); }
4136- | HOUR_P TO MINUTE_P {$$ = make_str(" hour to minute" ); }
4137- | MINUTE_P TO SECOND_P {$$ = make_str(" minute to second" ); }
4138- | HOUR_P TO SECOND_P {$$ = make_str(" hour to second" ); }
4139- | /* EMPTY*/ {$$ = EMPTY; }
4166+ | DAY_P TO interval_second {$$ = make_str(" day to second" ); }
4167+ | HOUR_P TO MINUTE_P {$$ = make_str(" hour to minute" ); }
4168+ | MINUTE_P TO interval_second {$$ = make_str(" minute to second" ); }
4169+ | HOUR_P TO interval_second {$$ = make_str(" hour to second" ); }
4170+ | /* EMPTY*/ {$$ = EMPTY; }
41404171;
41414172
4173+ interval_second :
4174+ SECOND_P {$$ = make_str(" second" ); }
4175+ | SECOND_P ' (' PosIntConst ' )' {$$ = cat_str(3 , make_str(" second(" ),$3 , make_str(" )" )); }
4176+ ;
41424177
41434178/* ****************************************************************************
41444179 *
@@ -6518,6 +6553,7 @@ ECPGunreserved_con: ABORT_P{ $$ = make_str("abort"); }
65186553| CREATEROLE {$$ = make_str(" createrole" ); }
65196554| CREATEUSER {$$ = make_str(" createuser" ); }
65206555| CSV {$$ = make_str(" csv" ); }
6556+ | CTYPE {$$ = make_str(" ctype" ); }
65216557| CURSOR {$$ = make_str(" cursor" ); }
65226558| CYCLE {$$ = make_str(" cycle" ); }
65236559| DATABASE {$$ = make_str(" database" ); }
@@ -6630,6 +6666,7 @@ ECPGunreserved_con: ABORT_P{ $$ = make_str("abort"); }
66306666| READ {$$ = make_str(" read" ); }
66316667| REASSIGN {$$ = make_str(" reassign" ); }
66326668| RECHECK {$$ = make_str(" recheck" ); }
6669+ | RECURSIVE {$$ = make_str(" recursive" ); }
66336670| REINDEX {$$ = make_str(" reindex" ); }
66346671| RELATIVE_P {$$ = make_str(" relative" ); }
66356672| RELEASE {$$ = make_str(" release" ); }
@@ -6696,7 +6733,6 @@ ECPGunreserved_con: ABORT_P{ $$ = make_str("abort"); }
66966733| VIEW {$$ = make_str(" view" ); }
66976734| VOLATILE {$$ = make_str(" volatile" ); }
66986735| WHITESPACE_P {$$ = make_str(" whitespace" ); }
6699- | WITH {$$ = make_str(" with" ); }
67006736| WITHOUT {$$ = make_str(" without" ); }
67016737| WORK {$$ = make_str(" work" ); }
67026738| WRITE {$$ = make_str(" write" ); }
@@ -6885,6 +6921,7 @@ reserved_keyword:
68856921| VARIADIC {$$ = make_str(" variadic" ); }
68866922| WHEN {$$ = make_str(" when" ); }
68876923| WHERE {$$ = make_str(" where" ); }
6924+ | WITH {$$ = make_str(" with" ); }
68886925;
68896926
68906927