aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-03-11 19:40:24 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-03-11 19:40:24 +0000
commit6261c75014c9948837d9d025493ef18b8f833f70 (patch)
treef7d75ca8cfa6a093d0fde2f707ae48e90ced7771 /src/backend/parser
parente4704001ea4c3d63b53e8783859ff598ef2f69e5 (diff)
downloadpostgresql-6261c75014c9948837d9d025493ef18b8f833f70.tar.gz
postgresql-6261c75014c9948837d9d025493ef18b8f833f70.zip
Implement SQL92-compatible FIRST, LAST, ABSOLUTE n, RELATIVE n options
for FETCH and MOVE.
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y205
-rw-r--r--src/backend/parser/keywords.c4
2 files changed, 107 insertions, 102 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 045d3cc2ca2..7b28bdc9150 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.405 2003/03/10 03:53:50 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.406 2003/03/11 19:40:23 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -191,7 +191,7 @@ static void doNegateFloat(Value *v);
%type <range> qualified_name OptConstrFromTable
-%type <str> opt_id all_Op MathOp opt_name SpecialRuleRelation
+%type <str> all_Op MathOp opt_name SpecialRuleRelation
%type <str> iso_level opt_encoding
%type <node> grantee
@@ -248,12 +248,10 @@ static void doNegateFloat(Value *v);
%type <boolean> copy_from
-%type <ival> direction reindex_type drop_type
+%type <ival> reindex_type drop_type fetch_count
opt_column event comment_type cursor_options
-%type <ival> fetch_how_many
-
-%type <node> select_limit_value select_offset_value
+%type <node> fetch_direction select_limit_value select_offset_value
%type <list> OptSeqList
%type <defelt> OptSeqElem
@@ -345,7 +343,7 @@ static void doNegateFloat(Value *v);
EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT
EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
- FALSE_P FETCH FLOAT_P FOR FORCE FOREIGN FORWARD
+ FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
FREEZE FROM FULL FUNCTION
GLOBAL GRANT GROUP_P
@@ -361,7 +359,7 @@ static void doNegateFloat(Value *v);
KEY
- LANCOMPILER LANGUAGE LEADING LEFT LEVEL LIKE LIMIT
+ LANCOMPILER LANGUAGE LAST_P LEADING LEFT LEVEL LIKE LIMIT
LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
LOCK_P
@@ -1239,16 +1237,15 @@ opt_drop_behavior:
;
-
/*****************************************************************************
*
* QUERY :
- * close <optname>
+ * close <portalname>
*
*****************************************************************************/
ClosePortalStmt:
- CLOSE opt_id
+ CLOSE name
{
ClosePortalStmt *n = makeNode(ClosePortalStmt);
n->portalname = $2;
@@ -1256,10 +1253,6 @@ ClosePortalStmt:
}
;
-opt_id: ColId { $$ = $1; }
- | /*EMPTY*/ { $$ = NULL; }
- ;
-
/*****************************************************************************
*
@@ -2583,151 +2576,159 @@ comment_text:
/*****************************************************************************
*
* QUERY:
- * fetch/move [forward | backward] [ # | all ] [ in <portalname> ]
- * fetch [ forward | backward | absolute | relative ]
- * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
+ * fetch/move
*
*****************************************************************************/
-FetchStmt: FETCH direction fetch_how_many from_in name
+FetchStmt: FETCH fetch_direction from_in name
{
- FetchStmt *n = makeNode(FetchStmt);
- if ($3 < 0)
- {
- $3 = -$3;
- $2 = (($2 == FETCH_FORWARD) ? FETCH_BACKWARD : FETCH_FORWARD);
- }
- n->direction = $2;
- n->howMany = $3;
- n->portalname = $5;
+ FetchStmt *n = (FetchStmt *) $2;
+ n->portalname = $4;
n->ismove = FALSE;
$$ = (Node *)n;
}
- | FETCH fetch_how_many from_in name
+ | FETCH name
{
FetchStmt *n = makeNode(FetchStmt);
- if ($2 < 0)
- {
- n->howMany = -$2;
- n->direction = FETCH_BACKWARD;
- }
- else
- {
- n->direction = FETCH_FORWARD;
- n->howMany = $2;
- }
- n->portalname = $4;
+ n->direction = FETCH_FORWARD;
+ n->howMany = 1;
+ n->portalname = $2;
n->ismove = FALSE;
$$ = (Node *)n;
}
- | FETCH direction from_in name
+ | MOVE fetch_direction from_in name
{
- FetchStmt *n = makeNode(FetchStmt);
- n->direction = $2;
- n->howMany = 1;
+ FetchStmt *n = (FetchStmt *) $2;
n->portalname = $4;
- n->ismove = FALSE;
+ n->ismove = TRUE;
$$ = (Node *)n;
}
- | FETCH from_in name
+ | MOVE name
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FETCH_FORWARD;
n->howMany = 1;
- n->portalname = $3;
- n->ismove = FALSE;
+ n->portalname = $2;
+ n->ismove = TRUE;
$$ = (Node *)n;
}
- | FETCH name
+ ;
+
+fetch_direction:
+ /*EMPTY*/
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FETCH_FORWARD;
n->howMany = 1;
- n->portalname = $2;
- n->ismove = FALSE;
$$ = (Node *)n;
}
- | MOVE direction fetch_how_many from_in name
+ | NEXT
{
FetchStmt *n = makeNode(FetchStmt);
- if ($3 < 0)
- {
- $3 = -$3;
- $2 = (($2 == FETCH_FORWARD) ? FETCH_BACKWARD : FETCH_FORWARD);
- }
- n->direction = $2;
- n->howMany = $3;
- n->portalname = $5;
- n->ismove = TRUE;
+ n->direction = FETCH_FORWARD;
+ n->howMany = 1;
$$ = (Node *)n;
}
- | MOVE fetch_how_many from_in name
+ | PRIOR
{
FetchStmt *n = makeNode(FetchStmt);
- if ($2 < 0)
- {
- n->howMany = -$2;
- n->direction = FETCH_BACKWARD;
- }
- else
- {
- n->direction = FETCH_FORWARD;
- n->howMany = $2;
- }
- n->portalname = $4;
- n->ismove = TRUE;
+ n->direction = FETCH_BACKWARD;
+ n->howMany = 1;
$$ = (Node *)n;
}
- | MOVE direction from_in name
+ | FIRST_P
{
FetchStmt *n = makeNode(FetchStmt);
- n->direction = $2;
+ n->direction = FETCH_ABSOLUTE;
n->howMany = 1;
- n->portalname = $4;
- n->ismove = TRUE;
$$ = (Node *)n;
}
- | MOVE from_in name
+ | LAST_P
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_ABSOLUTE;
+ n->howMany = -1;
+ $$ = (Node *)n;
+ }
+ | ABSOLUTE fetch_count
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_ABSOLUTE;
+ n->howMany = $2;
+ $$ = (Node *)n;
+ }
+ | RELATIVE fetch_count
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_RELATIVE;
+ n->howMany = $2;
+ $$ = (Node *)n;
+ }
+ | fetch_count
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_FORWARD;
+ n->howMany = $1;
+ $$ = (Node *)n;
+ }
+ | ALL
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_FORWARD;
+ n->howMany = FETCH_ALL;
+ $$ = (Node *)n;
+ }
+ | FORWARD
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FETCH_FORWARD;
n->howMany = 1;
- n->portalname = $3;
- n->ismove = TRUE;
$$ = (Node *)n;
}
- | MOVE name
+ | FORWARD fetch_count
{
FetchStmt *n = makeNode(FetchStmt);
n->direction = FETCH_FORWARD;
+ n->howMany = $2;
+ $$ = (Node *)n;
+ }
+ | FORWARD ALL
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_FORWARD;
+ n->howMany = FETCH_ALL;
+ $$ = (Node *)n;
+ }
+ | BACKWARD
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_BACKWARD;
n->howMany = 1;
- n->portalname = $2;
- n->ismove = TRUE;
$$ = (Node *)n;
}
- ;
-
-direction: FORWARD { $$ = FETCH_FORWARD; }
- | BACKWARD { $$ = FETCH_BACKWARD; }
- | RELATIVE { $$ = FETCH_FORWARD; }
- | ABSOLUTE
+ | BACKWARD fetch_count
+ {
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_BACKWARD;
+ n->howMany = $2;
+ $$ = (Node *)n;
+ }
+ | BACKWARD ALL
{
- elog(NOTICE,
- "FETCH / ABSOLUTE not supported, using RELATIVE");
- $$ = FETCH_FORWARD;
+ FetchStmt *n = makeNode(FetchStmt);
+ n->direction = FETCH_BACKWARD;
+ n->howMany = FETCH_ALL;
+ $$ = (Node *)n;
}
;
-fetch_how_many:
+fetch_count:
Iconst { $$ = $1; }
| '-' Iconst { $$ = - $2; }
- | ALL { $$ = INT_MAX; }
- | NEXT { $$ = 1; }
- | PRIOR { $$ = -1; }
;
-from_in: IN_P {}
- | FROM {}
+from_in: FROM {}
+ | IN_P {}
;
@@ -7093,6 +7094,7 @@ unreserved_keyword:
| EXPLAIN
| EXTERNAL
| FETCH
+ | FIRST_P
| FORCE
| FORWARD
| FUNCTION
@@ -7115,6 +7117,7 @@ unreserved_keyword:
| KEY
| LANCOMPILER
| LANGUAGE
+ | LAST_P
| LEVEL
| LISTEN
| LOAD
@@ -7170,9 +7173,9 @@ unreserved_keyword:
| SCROLL
| SECOND_P
| SECURITY
- | SESSION
| SEQUENCE
| SERIALIZABLE
+ | SESSION
| SET
| SHARE
| SHOW
@@ -7211,8 +7214,8 @@ unreserved_keyword:
| VOLATILE
| WITH
| WITHOUT
- | WRITE
| WORK
+ | WRITE
| YEAR_P
| ZONE
;
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index 727cff3eaf4..49432cb957a 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.134 2003/02/10 04:44:46 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.135 2003/03/11 19:40:23 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -128,6 +128,7 @@ static const ScanKeyword ScanKeywords[] = {
{"extract", EXTRACT},
{"false", FALSE_P},
{"fetch", FETCH},
+ {"first", FIRST_P},
{"float", FLOAT_P},
{"for", FOR},
{"force", FORCE},
@@ -171,6 +172,7 @@ static const ScanKeyword ScanKeywords[] = {
{"key", KEY},
{"lancompiler", LANCOMPILER},
{"language", LANGUAGE},
+ {"last", LAST_P},
{"leading", LEADING},
{"left", LEFT},
{"level", LEVEL},