OSDN Git Service

Since this patch is not big I send it here instead. I do not have the
authorBruce Momjian <bruce@momjian.us>
Tue, 18 Jan 2000 19:08:13 +0000 (19:08 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 18 Jan 2000 19:08:13 +0000 (19:08 +0000)
complete source checked out so I cannot commit it myself.

Michael

src/backend/parser/gram.y

index a0e53e6..a17fadc 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.129 2000/01/18 06:12:03 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.130 2000/01/18 19:08:13 momjian Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -156,7 +156,7 @@ static Node *doNegate(Node *n);
                database_name, access_method_clause, access_method, attr_name,
                class, index_name, name, func_name, file_name, aggr_argtype
 
-%type <str>            opt_id, opt_portal_name,
+%type <str>            opt_id,
                all_Op, MathOp, opt_name, opt_unique,
                OptUseOp, opt_class, SpecialRuleRelation
 
@@ -199,7 +199,7 @@ static Node *doNegate(Node *n);
                                opt_with_copy, index_opt_unique, opt_verbose, opt_analyze
 %type <boolean> opt_cursor
 
-%type <ival>   copy_dirn, def_type, opt_direction, remove_type,
+%type <ival>   copy_dirn, def_type, direction, remove_type,
                opt_column, event, comment_type, comment_cl,
                comment_ag, comment_fn, comment_op, comment_tg
 
@@ -1861,7 +1861,7 @@ comment_text:     Sconst { $$ = $1; }
  *
  *****************************************************************************/
 
-FetchStmt:     FETCH opt_direction fetch_how_many opt_portal_name
+FetchStmt:     FETCH direction fetch_how_many from_in name
                                {
                                        FetchStmt *n = makeNode(FetchStmt);
                                        if ($2 == RELATIVE)
@@ -1877,11 +1877,60 @@ FetchStmt:      FETCH opt_direction fetch_how_many opt_portal_name
                                        }
                                        n->direction = $2;
                                        n->howMany = $3;
+                                       n->portalname = $5;
+                                       n->ismove = false;
+                                       $$ = (Node *)n;
+                               }
+               |       FETCH fetch_how_many from_in name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       if ($2 < 0)
+                                       {
+                                               n->howMany = -$2;
+                                               n->direction = BACKWARD;
+                                       }
+                                       else
+                                       {
+                                               n->direction = FORWARD;
+                                               n->howMany = $2;
+                                       }
+                                       n->portalname = $4;
+                                       n->ismove = false;
+                                       $$ = (Node *)n;
+                               }
+               |       FETCH direction from_in name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       if ($2 == RELATIVE)
+                                       {
+                                               $2 = FORWARD;
+                                       }
+                                       n->direction = $2;
+                                       n->howMany = 1;
                                        n->portalname = $4;
                                        n->ismove = false;
                                        $$ = (Node *)n;
                                }
-               |       MOVE opt_direction fetch_how_many opt_portal_name
+               |       FETCH from_in name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       n->direction = FORWARD;
+                                       n->howMany = 1;
+                                       n->portalname = $3;
+                                       n->ismove = false;
+                                       $$ = (Node *)n;
+                               }
+               |       FETCH name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       n->direction = FORWARD;
+                                       n->howMany = 1;
+                                       n->portalname = $2;
+                                       n->ismove = false;
+                                       $$ = (Node *)n;
+                               }
+
+               |       MOVE direction fetch_how_many from_in name
                                {
                                        FetchStmt *n = makeNode(FetchStmt);
                                        if ($3 < 0)
@@ -1891,13 +1940,57 @@ FetchStmt:      FETCH opt_direction fetch_how_many opt_portal_name
                                        }
                                        n->direction = $2;
                                        n->howMany = $3;
+                                       n->portalname = $5;
+                                       n->ismove = TRUE;
+                                       $$ = (Node *)n;
+                               }
+               |       MOVE fetch_how_many from_in name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       if ($2 < 0)
+                                       {
+                                               n->howMany = -$2;
+                                               n->direction = BACKWARD;
+                                       }
+                                       else
+                                       {
+                                               n->direction = FORWARD;
+                                               n->howMany = $2;
+                                       }
                                        n->portalname = $4;
                                        n->ismove = TRUE;
                                        $$ = (Node *)n;
                                }
+               |       MOVE direction from_in name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       n->direction = $2;
+                                       n->howMany = 1;
+                                       n->portalname = $4;
+                                       n->ismove = TRUE;
+                                       $$ = (Node *)n;
+                               }
+               |       MOVE from_in name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       n->direction = FORWARD;
+                                       n->howMany = 1;
+                                       n->portalname = $3;
+                                       n->ismove = TRUE;
+                                       $$ = (Node *)n;
+                               }
+               |       MOVE name
+                               {
+                                       FetchStmt *n = makeNode(FetchStmt);
+                                       n->direction = FORWARD;
+                                       n->howMany = 1;
+                                       n->portalname = $2;
+                                       n->ismove = TRUE;
+                                       $$ = (Node *)n;
+                               }
                ;
 
-opt_direction: FORWARD                                 { $$ = FORWARD; }
+direction:     FORWARD                                 { $$ = FORWARD; }
                | BACKWARD                                              { $$ = BACKWARD; }
                | RELATIVE                                              { $$ = RELATIVE; }
                | ABSOLUTE
@@ -1905,7 +1998,6 @@ opt_direction:    FORWARD                                 { $$ = FORWARD; }
                                elog(NOTICE,"FETCH/ABSOLUTE not supported, using RELATIVE");
                                $$ = RELATIVE;
                        }
-               | /*EMPTY*/                                             { $$ = FORWARD; /* default */ }
                ;
 
 fetch_how_many:  Iconst                                        { $$ = $1; }
@@ -1913,13 +2005,11 @@ fetch_how_many:  Iconst                                 { $$ = $1; }
                | ALL                                                   { $$ = 0; /* 0 means fetch all tuples*/ }
                | NEXT                                                  { $$ = 1; }
                | PRIOR                                                 { $$ = -1; }
-               | /*EMPTY*/                                             { $$ = 1; /*default*/ }
                ;
 
-opt_portal_name:  IN name                              { $$ = $2; }
-               | FROM name                                             { $$ = $2; }
-               | /*EMPTY*/                                             { $$ = NULL; }
-               ;
+from_in:  IN 
+       | FROM
+       ;
 
 
 /*****************************************************************************