@@ -24,8 +24,7 @@ charerrortext[128];
2424char *connection =NULL ;
2525char *input_filename =NULL ;
2626
27- static int QueryIsRule =0 , ForUpdateNotAllowed =0 , FoundInto =0 ;
28- static int FoundSort =0 ;
27+ static int QueryIsRule =0 , FoundInto =0 ;
2928static int initializer =0 ;
3029static struct this_type actual_type[STRUCT_DEPTH];
3130static char *actual_storage[STRUCT_DEPTH];
@@ -300,7 +299,7 @@ make_name(void)
300299%type <str> opt_decimal Character character opt_varying opt_charset
301300%type <str> opt_collate datetime opt_timezone opt_interval table_ref
302301%type <str> row_expr row_descriptor row_list ConstDatetime opt_chain
303- %type <str> SelectStmt SubSelect result OptTemp ConstraintAttributeSpec
302+ %type <str> SelectStmt select_subclause result OptTemp ConstraintAttributeSpec
304303%type <str> opt_table opt_all sort_clause sortby_list ConstraintAttr
305304%type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
306305%type <str> group_clause having_clause from_clause opt_distinct
@@ -1972,33 +1971,15 @@ func_args_list: func_arg{ $$ = $1; }
19721971{$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
19731972;
19741973
1975- /* Would be nice to use the full Typename production for these fields,
1976- * but that one sometimes dives into the catalogs looking for valid types.
1977- * Arguments like "opaque" are valid when defining functions,
1978- * so that won't work here. The only thing we give up is array notation,
1979- * which isn't meaningful in this context anyway.
1980- * - thomas 2000-03-25
1981- * The following productions are difficult, since it is difficult to
1982- * distinguish between TokenId and SimpleTypename:
1983- opt_arg TokenId SimpleTypename
1984- {
1985- $$ = $3;
1986- }
1987- | TokenId SimpleTypename
1988- {
1989- $$ = $2;
1990- }
1991- */
1992-
1993- func_arg :opt_arg SimpleTypename
1974+ func_arg :opt_arg Typename
19941975 {
19951976/* We can catch over-specified arguments here if we want to,
19961977 * but for now better to silently swallow typmod, etc.
19971978 * - thomas 2000-03-22
19981979*/
19991980$$ = cat2_str($1 ,$2 );
20001981 }
2001- | SimpleTypename
1982+ | Typename
20021983{
20031984$$ =$1 ;
20041985}
@@ -2020,19 +2001,14 @@ opt_arg: IN { $$ = make_str("in"); }
20202001func_as :Sconst {$$ =$1 ; }
20212002| Sconst ' ,' Sconst {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
20222003
2023- func_return :SimpleTypename
2004+ func_return :Typename
20242005{
20252006/* We can catch over-specified arguments here if we want to,
20262007 * but for now better to silently swallow typmod, etc.
20272008 * - thomas 2000-03-22
20282009*/
20292010$$ =$1 ;
20302011 }
2031- | SETOF SimpleTypename
2032- {
2033-
2034- $$ = cat2_str(make_str(" setof" ),$2 );
2035- }
20362012;
20372013
20382014/* ****************************************************************************
@@ -2071,7 +2047,7 @@ RemoveAggrStmt: DROP AGGREGATE name aggr_argtype
20712047}
20722048;
20732049
2074- aggr_argtype :name {$$ =$1 ; }
2050+ aggr_argtype :Typename {$$ =$1 ; }
20752051| ' *' {$$ = make_str(" *" ); }
20762052;
20772053
@@ -2089,15 +2065,15 @@ RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')'
20892065}
20902066;
20912067
2092- oper_argtypes :name
2068+ oper_argtypes :Typename
20932069{
20942070mmerror (ET_ERROR," parser: argument type missing (use NONE for unary operators)" );
20952071}
2096- | name ' ,' name
2072+ | Typename ' ,' Typename
20972073{$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
2098- | NONE ' ,' name /* left unary*/
2074+ | NONE ' ,' Typename /* left unary*/
20992075{$$ = cat2_str(make_str(" none," ),$3 ); }
2100- | name ' ,' NONE /* right unary*/
2076+ | Typename ' ,' NONE /* right unary*/
21012077{$$ = cat2_str($1 , make_str(" , none" )); }
21022078;
21032079
@@ -2471,14 +2447,8 @@ insert_rest: VALUES '(' target_list ')'
24712447{
24722448$$ = make_str(" default values" );
24732449}
2474- /* We want the full power of SelectStatements including INTERSECT and EXCEPT
2475- * for insertion. However, we can't support sort or limit clauses.
2476- */
24772450| SelectStmt
24782451{
2479- if (FoundSort !=0 )
2480- mmerror (ET_ERROR," ORDER BY is not allowed in INSERT/SELECT" );
2481-
24822452$$ =$1 ;
24832453}
24842454| ' (' columnList ' )' VALUES ' (' target_list ' )'
@@ -2487,9 +2457,6 @@ insert_rest: VALUES '(' target_list ')'
24872457}
24882458| ' (' columnList ' )' SelectStmt
24892459{
2490- if (FoundSort !=0 )
2491- mmerror (ET_ERROR," ORDER BY is not all owed in INSERT/SELECT" );
2492-
24932460$$ = cat_str(4 , make_str(" (" ),$2 , make_str(" )" ),$4 );
24942461}
24952462;
@@ -2568,9 +2535,7 @@ UpdateStmt: UPDATE opt_only relation_name
25682535 *CURSOR STATEMENTS
25692536 *
25702537 *****************************************************************************/
2571- CursorStmt :DECLARE name opt_cursor CURSOR FOR
2572- { ForUpdateNotAllowed =1 ; }
2573- SelectStmt
2538+ CursorStmt :DECLARE name opt_cursor CURSOR FOR SelectStmt
25742539{
25752540struct cursor *ptr, *this ;
25762541
@@ -2590,7 +2555,7 @@ CursorStmt: DECLARE name opt_cursor CURSOR FOR
25902555this ->next = cur;
25912556this ->name =$2 ;
25922557this ->connection = connection;
2593- this ->command = cat_str(5 , make_str(" declare" ), mm_strdup($2 ),$3 , make_str(" cursor for" ),$7 );
2558+ this ->command = cat_str(5 , make_str(" declare" ), mm_strdup($2 ),$3 , make_str(" cursor for" ),$6 );
25942559this ->argsinsert = argsinsert;
25952560this ->argsresult = argsresult;
25962561argsinsert = argsresult =NULL ;
@@ -2615,70 +2580,55 @@ opt_cursor: BINARY { $$ = make_str("binary"); }
26152580 *
26162581 *****************************************************************************/
26172582
2618- /* The new 'SelectStmt' rule adapted for the optional use of INTERSECT EXCEPT a nd UNION
2619- * accepts the use of '(' and ')' to select an order of set operations.
2620- * The rule returns a SelectStmt Node having the set operations attached to
2621- * unionClause and intersectClause (NIL if no set operations were present)
2622- */
2623-
2624- SelectStmt :select_clause
2625- { FoundSort =0 ; }
2626- sort_clause for_update_clause opt_select_limit
2583+ SelectStmt :select_clause sort_clause for_update_clause opt_select_limit
26272584{
2628- if (strlen($4 ) >0 && ForUpdateNotAllowed !=0 )
2629- mmerror (ET_ERROR," FOR UPDATE is not allowed in this context" );
2630-
2631- ForUpdateNotAllowed =0 ;
2632- $$ = cat_str(4 ,$1 ,$3 ,$4 ,$5 );
2585+ $$ = cat_str(4 ,$1 ,$2 ,$3 ,$4 );
26332586}
26342587
26352588/* This rule parses Select statements including UNION INTERSECT and EXCEPT.
26362589 * '(' and ')' can be used to specify the order of the operations
26372590 * (UNION EXCEPT INTERSECT). Without the use of '(' and ')' we want the
26382591 * operations to be ordered per the precedence specs at the head of this file.
26392592 *
2640- * The sort_clause is not handled here!
2593+ * Since parentheses around SELECTs also appear in the expression grammar,
2594+ * there is a parse ambiguity if parentheses are allowed at the top level of a
2595+ * select_clause: are the parens part of the expression or part of the select?
2596+ * We separate select_clause into two levels to resolve this: select_clause
2597+ * can have top-level parentheses, select_subclause cannot.
2598+ * Note that sort clauses cannot be included at this level --- a sort clau
2599+ * can only appear at the end of the complete Select, and it will be handl
2600+ * by the topmost SelectStmt rule. Likewise FOR UPDATE and LIMIT.
26412601*/
2642- select_clause :' (' select_clause ' )'
2602+
2603+ select_clause :' (' select_subclause ' )'
26432604 {
26442605$$ = cat_str(3 , make_str(" (" ),$2 , make_str(" )" ));
26452606 }
2646- | SubSelect
2607+ | select_subclause
26472608 {
2648- FoundInto =0 ;
2609+ FoundInto =0 ;
26492610$$ =$1 ;
26502611 }
2651- | select_clause EXCEPT opt_all select_clause
2652- {
2653- if (strlen($3 ) !=0 )
2654- mmerror (ET_WARN," EXCEPT ALL is not implemented yet." );
2655-
2656- $$ = cat_str(4 ,$1 , make_str(" except" ),$3 ,$4 );
2657- ForUpdateNotAllowed =1 ;
2658- }
2659- | select_clause UNION opt_all select_clause
2660- {
2661- $$ = cat_str(4 ,$1 , make_str(" union" ),$3 ,$4 );
2662- ForUpdateNotAllowed =1 ;
2663- }
2664- | select_clause INTERSECT opt_all select_clause
2665- {
2666- if (strlen($3 ) !=0 )
2667- mmerror (ET_WARN," INTERSECT ALL is not implemented yet." );
2668-
2669- $$ = cat_str(4 ,$1 , make_str(" intersect" ),$3 ,$4 );
2670- ForUpdateNotAllowed =1 ;
2671- }
26722612;
26732613
2674- SubSelect :SELECT opt_distinct target_list
2614+ select_subclause :SELECT opt_distinct target_list
26752615result from_clause where_clause
26762616group_clause having_clause
26772617{
2678- if (strlen($7 ) >0 || strlen($8 ) >0 )
2679- ForUpdateNotAllowed =1 ;
26802618$$ = cat_str(8 , make_str(" select" ),$2 ,$3 ,$4 ,$5 ,$6 ,$7 ,$8 );
26812619}
2620+ | select_clause UNION opt_all select_clause
2621+ {
2622+ $$ = cat_str(4 ,$1 , make_str(" union" ),$3 ,$4 );
2623+ }
2624+ | select_clause INTERSECT opt_all select_clause
2625+ {
2626+ $$ = cat_str(4 ,$1 , make_str(" intersect" ),$3 ,$4 );
2627+ }
2628+ | select_clause EXCEPT opt_all select_clause
2629+ {
2630+ $$ = cat_str(4 ,$1 , make_str(" except" ),$3 ,$4 );
2631+ }
26822632;
26832633
26842634result :INTO OptTempTableName {
@@ -2747,7 +2697,6 @@ opt_distinct: DISTINCT{ $$ = make_str("distinct"); }
27472697;
27482698
27492699sort_clause :ORDER BY sortby_list {
2750- FoundSort =1 ;
27512700$$ = cat2_str(make_str(" order by" ),$3 );
27522701}
27532702| /* EMPTY*/ {$$ = EMPTY; }
@@ -2880,7 +2829,7 @@ table_ref: relation_expr
28802829{
28812830cat2_str ($1 , $2 );
28822831}
2883- | ' (' select_clause ' )' alias_clause
2832+ | ' (' select_subclause ' )' alias_clause
28842833{
28852834cat_str (4 , make_str(" (" ), $2, make_str(" )" ), $4);
28862835}
@@ -3299,19 +3248,19 @@ opt_interval: datetime{ $$ = $1; }
32993248 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
33003249 * with singleton expressions.
33013250*/
3302- row_expr :' (' row_descriptor ' )' IN ' (' SubSelect ' )'
3251+ row_expr :' (' row_descriptor ' )' IN ' (' select_subclause ' )'
33033252{
33043253$$ = cat_str(5 , make_str(" (" ),$2 , make_str(" ) in (" ),$6 , make_str(" )" ));
33053254}
3306- | ' (' row_descriptor ' )' NOT IN ' (' SubSelect ' )'
3255+ | ' (' row_descriptor ' )' NOT IN ' (' select_subclause ' )'
33073256{
33083257$$ = cat_str(5 , make_str(" (" ),$2 , make_str(" ) not in (" ),$7 , make_str(" )" ));
33093258}
3310- | ' (' row_descriptor ' )' all_Op sub_type ' (' SubSelect ' )'
3259+ | ' (' row_descriptor ' )' all_Op sub_type ' (' select_subclause ' )'
33113260{
33123261$$ = cat_str(8 , make_str(" (" ),$2 , make_str(" )" ),$4 ,$5 , make_str(" (" ),$7 , make_str(" )" ));
33133262}
3314- | ' (' row_descriptor ' )' all_Op ' (' SubSelect ' )'
3263+ | ' (' row_descriptor ' )' all_Op ' (' select_subclause ' )'
33153264{
33163265$$ = cat_str(7 , make_str(" (" ),$2 , make_str(" )" ),$4 , make_str(" (" ),$6 , make_str(" )" ));
33173266}
@@ -3491,7 +3440,7 @@ a_expr: c_expr
34913440{
34923441$$ = cat_str(4 ,$1 , make_str(" not in (" ),$5 , make_str(" )" ));
34933442}
3494- | a_expr all_Op sub_type ' (' SubSelect ' )'
3443+ | a_expr all_Op sub_type ' (' select_subclause ' )'
34953444{
34963445$$ = cat_str(6 ,$1 ,$2 ,$3 , make_str(" (" ),$5 , make_str(" )" ));
34973446}
@@ -3638,9 +3587,9 @@ c_expr: attr
36383587{$$ = cat_str(3 , make_str(" trim(trailing" ),$4 , make_str(" )" )); }
36393588| TRIM ' (' trim_list ' )'
36403589{$$ = cat_str(3 , make_str(" trim(" ),$3 , make_str(" )" )); }
3641- | ' (' SubSelect ' )'
3590+ | ' (' select_subclause ' )'
36423591{$$ = cat_str(3 , make_str(" (" ),$2 , make_str(" )" )); }
3643- | EXISTS ' (' SubSelect ' )'
3592+ | EXISTS ' (' select_subclause ' )'
36443593{$$ = cat_str(3 , make_str(" exists(" ),$3 , make_str(" )" )); }
36453594;
36463595/*
@@ -3719,7 +3668,7 @@ trim_list: a_expr FROM expr_list
37193668{$$ =$1 ; }
37203669;
37213670
3722- in_expr :SubSelect
3671+ in_expr :select_subclause
37233672{
37243673$$ =$1 ;
37253674}
@@ -5164,6 +5113,7 @@ ECPGColId: ident{ $$ = $1; }
51645113| TokenId {$$ =$1 ; }
51655114| INTERVAL {$$ = make_str(" interval" ); }
51665115| NATIONAL {$$ = make_str(" national" ); }
5116+ | NONE {$$ = make_str(" none" ); }
51675117| PATH_P {$$ = make_str(" path_p" ); }
51685118| SERIAL {$$ = make_str(" serial" ); }
51695119| TIME {$$ = make_str(" time" ); }
@@ -5177,7 +5127,7 @@ ECPGColLabel: ECPGColId{ $$ = $1; }
51775127| ANALYZE {$$ = make_str(" analyze" ); }
51785128| ANY {$$ = make_str(" any" ); }
51795129| ASC {$$ = make_str(" asc" ); }
5180- | BETWEEN {$$ = make_str(" between" ); }
5130+ | BETWEEN {$$ = make_str(" between" ); }
51815131| BINARY {$$ = make_str(" binary" ); }
51825132| BIT {$$ = make_str(" bit" ); }
51835133| BOTH {$$ = make_str(" both" ); }
@@ -5236,7 +5186,6 @@ ECPGColLabel: ECPGColId{ $$ = $1; }
52365186| NATURAL {$$ = make_str(" natural" ); }
52375187| NCHAR {$$ = make_str(" nchar" ); }
52385188| NEW {$$ = make_str(" new" ); }
5239- | NONE {$$ = make_str(" none" ); }
52405189| NOT {$$ = make_str(" not" ); }
52415190| NOTNULL {$$ = make_str(" notnull" ); }
52425191| NULLIF {$$ = make_str(" nullif" ); }