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 $*/
2
2
3
3
/* Copyright comment*/
4
4
%{
@@ -621,8 +621,8 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
621
621
%type <str> handler_name any_name_list any_name opt_as insert_column_list
622
622
%type <str> columnref values_clause AllConstVar prep_type_clause ExecuteStmt
623
623
%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
626
626
%type <str> DropUserStmt copy_from copy_opt_list copy_opt_item
627
627
%type <str> opt_oids TableLikeClause key_action opt_definition
628
628
%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
632
632
%type <str> ConstBit GenericType TableFuncElementList opt_analyze
633
633
%type <str> opt_sort_clause subquery_Op transaction_mode_item
634
634
%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
636
636
%type <str> storage_declaration storage_clause opt_initializer c_anything
637
637
%type <str> variable_list variable c_thing c_term ECPGKeywords_vanames
638
638
%type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
@@ -2099,7 +2099,7 @@ DefineStmt: CREATE AGGREGATE func_name aggr_args definition
2099
2099
{$$ = cat_str(4 , make_str(" create aggregate" ),$3 ,$4 ,$5 ); }
2100
2100
| CREATE AGGREGATE func_name old_aggr_definition
2101
2101
{$$ = cat_str(3 , make_str(" create aggregate" ),$3 ,$4 ); }
2102
- | CREATE OPERATOR all_Op definition
2102
+ | CREATE OPERATOR any_operator definition
2103
2103
{$$ = cat_str(3 , make_str(" create operator" ),$3 ,$4 ); }
2104
2104
| CREATE TYPE_P any_name definition
2105
2105
{$$ = cat_str(3 , make_str(" create type" ),$3 ,$4 ); }
@@ -2169,8 +2169,8 @@ opclass_item_list:opclass_item{ $$ = $1; }
2169
2169
2170
2170
opclass_item :OPERATOR PosIntConst any_operator opt_recheck
2171
2171
{$$ = 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 ); }
2174
2174
| FUNCTION PosIntConst func_name func_args
2175
2175
{$$ = cat_str(4 , make_str(" function" ),$2 ,$3 ,$4 ); }
2176
2176
| FUNCTION PosIntConst ' (' type_list ' )' func_name func_args
@@ -2397,8 +2397,8 @@ CommentStmt: COMMENT ON comment_type name IS comment_text
2397
2397
{$$ = cat_str(5 , make_str(" comment on aggregate" ),$4 ,$5 , make_str(" is" ),$7 ); }
2398
2398
| COMMENT ON FUNCTION func_name func_args IS comment_text
2399
2399
{$$ = 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 ); }
2402
2402
| COMMENT ON TRIGGER name ON any_name IS comment_text
2403
2403
{$$ = cat_str(6 , make_str(" comment on trigger" ),$4 , make_str(" on" ),$6 , make_str(" is" ),$8 ); }
2404
2404
| COMMENT ON RULE name ON any_name IS comment_text
@@ -2761,23 +2761,23 @@ RemoveAggrStmt: DROP AGGREGATE func_name aggr_args opt_drop_behavior
2761
2761
{$$ = cat_str(4 , make_str(" drop aggregate if exists" ),$5 ,$6 ,$7 ); }
2762
2762
;
2763
2763
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 ); }
2768
2768
;
2769
2769
2770
- oper_argtypes :Typename
2770
+ oper_argtypes :' ( ' Typename ' ) '
2771
2771
{
2772
2772
mmerror (PARSE_ERROR, ET_ERROR," parser: argument type missing (use NONE for unary operators)" );
2773
2773
$$ = make_str(" none" );
2774
2774
}
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) " )); }
2781
2781
;
2782
2782
2783
2783
any_operator :
@@ -2930,8 +2930,8 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
2930
2930
{$$ = cat_str(4 , make_str(" alter function" ),$3 , make_str(" owner to" ),$6 ); }
2931
2931
| ALTER opt_procedural LANGUAGE name OWNER TO RoleId
2932
2932
{$$ = 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 ); }
2935
2935
| ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
2936
2936
{$$ = cat_str(6 , make_str(" alter operator class" ),$4 , make_str(" using" ),$6 , make_str(" owner to" ),$9 ); }
2937
2937
| ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId
@@ -3162,6 +3162,14 @@ createdb_opt_item:TABLESPACE opt_equal name
3162
3162
{$$ = cat_str(3 , make_str(" encoding" ),$2 ,$3 ); }
3163
3163
| ENCODING opt_equal DEFAULT
3164
3164
{$$ = 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" )); }
3165
3173
| CONNECTION LIMIT opt_equal PosIntConst
3166
3174
{$$ = cat_str(3 , make_str(" connection limit" ),$3 ,$4 ); }
3167
3175
| OWNER opt_equal name
@@ -3598,6 +3606,14 @@ select_no_parens: simple_select
3598
3606
{$$ = cat_str(4 ,$1 ,$2 ,$3 ,$4 ); }
3599
3607
| select_clause opt_sort_clause select_limit opt_for_locking_clause
3600
3608
{$$ = 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 ); }
3601
3617
;
3602
3618
3603
3619
select_clause :simple_select {$$ =$1 ; }
@@ -3618,6 +3634,21 @@ simple_select:SELECT opt_distinct target_list
3618
3634
{$$ = cat_str(4 ,$1 , make_str(" except" ),$3 ,$4 ); }
3619
3635
;
3620
3636
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
+
3621
3652
into_clause :INTO OptTempTableName
3622
3653
{
3623
3654
FoundInto =1 ;
@@ -3756,7 +3787,7 @@ for_locking_item:
3756
3787
;
3757
3788
3758
3789
locked_rels_list :
3759
- OF name_list {$$ = cat2_str(make_str(" of" ),$2 ); }
3790
+ OF qualified_name_list {$$ = cat2_str(make_str(" of" ),$2 ); }
3760
3791
| /* EMPTY*/ {$$ = EMPTY; }
3761
3792
;
3762
3793
@@ -4123,22 +4154,26 @@ opt_timezone: WITH TIME ZONE
4123
4154
{$$ = EMPTY; }
4124
4155
;
4125
4156
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 ; }
4132
4163
| YEAR_P TO MONTH_P {$$ = make_str(" year to month" ); }
4133
4164
| DAY_P TO HOUR_P {$$ = make_str(" day to hour" ); }
4134
4165
| 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; }
4140
4171
;
4141
4172
4173
+ interval_second :
4174
+ SECOND_P {$$ = make_str(" second" ); }
4175
+ | SECOND_P ' (' PosIntConst ' )' {$$ = cat_str(3 , make_str(" second(" ),$3 , make_str(" )" )); }
4176
+ ;
4142
4177
4143
4178
/* ****************************************************************************
4144
4179
*
@@ -6518,6 +6553,7 @@ ECPGunreserved_con: ABORT_P{ $$ = make_str("abort"); }
6518
6553
| CREATEROLE {$$ = make_str(" createrole" ); }
6519
6554
| CREATEUSER {$$ = make_str(" createuser" ); }
6520
6555
| CSV {$$ = make_str(" csv" ); }
6556
+ | CTYPE {$$ = make_str(" ctype" ); }
6521
6557
| CURSOR {$$ = make_str(" cursor" ); }
6522
6558
| CYCLE {$$ = make_str(" cycle" ); }
6523
6559
| DATABASE {$$ = make_str(" database" ); }
@@ -6630,6 +6666,7 @@ ECPGunreserved_con: ABORT_P{ $$ = make_str("abort"); }
6630
6666
| READ {$$ = make_str(" read" ); }
6631
6667
| REASSIGN {$$ = make_str(" reassign" ); }
6632
6668
| RECHECK {$$ = make_str(" recheck" ); }
6669
+ | RECURSIVE {$$ = make_str(" recursive" ); }
6633
6670
| REINDEX {$$ = make_str(" reindex" ); }
6634
6671
| RELATIVE_P {$$ = make_str(" relative" ); }
6635
6672
| RELEASE {$$ = make_str(" release" ); }
@@ -6696,7 +6733,6 @@ ECPGunreserved_con: ABORT_P{ $$ = make_str("abort"); }
6696
6733
| VIEW {$$ = make_str(" view" ); }
6697
6734
| VOLATILE {$$ = make_str(" volatile" ); }
6698
6735
| WHITESPACE_P {$$ = make_str(" whitespace" ); }
6699
- | WITH {$$ = make_str(" with" ); }
6700
6736
| WITHOUT {$$ = make_str(" without" ); }
6701
6737
| WORK {$$ = make_str(" work" ); }
6702
6738
| WRITE {$$ = make_str(" write" ); }
@@ -6885,6 +6921,7 @@ reserved_keyword:
6885
6921
| VARIADIC {$$ = make_str(" variadic" ); }
6886
6922
| WHEN {$$ = make_str(" when" ); }
6887
6923
| WHERE {$$ = make_str(" where" ); }
6924
+ | WITH {$$ = make_str(" with" ); }
6888
6925
;
6889
6926
6890
6927