aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2002-12-30 15:31:51 +0000
committerBruce Momjian <bruce@momjian.us>2002-12-30 15:31:51 +0000
commit33f0108df8a79cdb6dbf91f7eb4329143c0730d8 (patch)
treea04245944b6e99a5710cca9651893bed47686f3c /src
parenta0fa0117a5ad728b6f85a39cc52006736f54f90e (diff)
downloadpostgresql-33f0108df8a79cdb6dbf91f7eb4329143c0730d8.tar.gz
postgresql-33f0108df8a79cdb6dbf91f7eb4329143c0730d8.zip
Cause FETCH 1 to return the current cursor row, or zero if at
beginning/end of cursor. Have MOVE return 0/1 depending on cursor position. Matches SQL spec. Pass cursor counter from parser as a long rather than int. Doc updates.
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/portalcmds.c46
-rw-r--r--src/backend/parser/gram.y21
-rw-r--r--src/backend/tcop/utility.c4
-rw-r--r--src/include/commands/portalcmds.h4
-rw-r--r--src/include/nodes/parsenodes.h4
5 files changed, 51 insertions, 28 deletions
diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c
index b1799e49f8c..3a670d8f899 100644
--- a/src/backend/commands/portalcmds.c
+++ b/src/backend/commands/portalcmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.6 2002/12/15 16:17:42 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.7 2002/12/30 15:31:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -65,7 +65,7 @@ PortalCleanup(Portal portal)
void
PerformPortalFetch(char *name,
bool forward,
- int count,
+ long count,
CommandDest dest,
char *completionTag)
{
@@ -100,14 +100,48 @@ PerformPortalFetch(char *name,
return;
}
- /* If zero count, we are done */
+ /* If zero count, handle specially */
if (count == 0)
- return;
+ {
+ bool on_row = false;
+
+ /* Are we sitting on a row? */
+ oldcontext = MemoryContextSwitchTo(PortalGetHeapMemory(portal));
+ queryDesc = PortalGetQueryDesc(portal);
+ estate = queryDesc->estate;
+ if (portal->atStart == false && portal->atEnd == false)
+ on_row = true;
+ MemoryContextSwitchTo(oldcontext);
+
+ if (dest == None)
+ {
+ /* MOVE 0 returns 0/1 based on if FETCH 0 would return a row */
+ if (completionTag && on_row)
+ strcpy(completionTag, "MOVE 1");
+ return;
+ }
+ else
+ {
+ /* If we are not on a row, FETCH 0 returns nothing */
+ if (!on_row)
+ return;
+
+ /* Since we are sitting on a row, return the row */
+ /* Back up so we can reread the row */
+ PerformPortalFetch(name, false /* backward */, 1,
+ None, /* throw away output */
+ NULL /* do not modify the command tag */);
+
+ /* Set up to fetch one row */
+ count = 1;
+ forward = true;
+ }
+ }
/* Internally, zero count processes all portal rows */
- if (count == INT_MAX)
+ if (count == LONG_MAX)
count = 0;
-
+
/*
* switch into the portal context
*/
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index bb94d1f8e82..c19673fc422 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.388 2002/12/12 20:35:13 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.389 2002/12/30 15:31:47 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -2591,13 +2591,6 @@ comment_text:
FetchStmt: FETCH direction fetch_how_many from_in name
{
FetchStmt *n = makeNode(FetchStmt);
- if ($2 == RELATIVE)
- {
- if ($3 == 0)
- elog(ERROR,
- "FETCH / RELATIVE at current position is not supported");
- $2 = FORWARD;
- }
if ($3 < 0)
{
$3 = -$3;
@@ -2629,10 +2622,6 @@ FetchStmt: FETCH direction fetch_how_many from_in name
| FETCH direction from_in name
{
FetchStmt *n = makeNode(FetchStmt);
- if ($2 == RELATIVE)
- {
- $2 = FORWARD;
- }
n->direction = $2;
n->howMany = 1;
n->portalname = $4;
@@ -2719,20 +2708,20 @@ FetchStmt: FETCH direction fetch_how_many from_in name
direction: FORWARD { $$ = FORWARD; }
| BACKWARD { $$ = BACKWARD; }
- | RELATIVE { $$ = RELATIVE; }
+ | RELATIVE { $$ = FORWARD; }
| ABSOLUTE
{
elog(NOTICE,
"FETCH / ABSOLUTE not supported, using RELATIVE");
- $$ = RELATIVE;
+ $$ = FORWARD;
}
;
fetch_how_many:
Iconst { $$ = $1; }
| '-' Iconst { $$ = - $2; }
- | ALL { $$ = INT_MAX; }
- | LAST { $$ = INT_MAX; }
+ | ALL { $$ = LONG_MAX; }
+ | LAST { $$ = LONG_MAX; }
| NEXT { $$ = 1; }
| PRIOR { $$ = -1; }
;
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 40228601d72..cc0f139b2db 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.185 2002/12/06 05:00:31 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.186 2002/12/30 15:31:48 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -257,7 +257,7 @@ ProcessUtility(Node *parsetree,
FetchStmt *stmt = (FetchStmt *) parsetree;
char *portalName = stmt->portalname;
bool forward;
- int count;
+ long count;
forward = (bool) (stmt->direction == FORWARD);
diff --git a/src/include/commands/portalcmds.h b/src/include/commands/portalcmds.h
index 5526ac997dc..d143423f6a3 100644
--- a/src/include/commands/portalcmds.h
+++ b/src/include/commands/portalcmds.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: portalcmds.h,v 1.3 2002/11/13 00:44:09 momjian Exp $
+ * $Id: portalcmds.h,v 1.4 2002/12/30 15:31:50 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -25,7 +25,7 @@
* BadArg if forward invalid.
* "ERROR" if portal not found.
*/
-extern void PerformPortalFetch(char *name, bool forward, int count,
+extern void PerformPortalFetch(char *name, bool forward, long count,
CommandDest dest, char *completionTag);
/*
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index c409ec7ea84..0f9b7613a00 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parsenodes.h,v 1.223 2002/12/12 20:35:16 tgl Exp $
+ * $Id: parsenodes.h,v 1.224 2002/12/30 15:31:51 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1198,7 +1198,7 @@ typedef struct FetchStmt
{
NodeTag type;
int direction; /* FORWARD or BACKWARD */
- int howMany; /* amount to fetch */
+ long howMany; /* amount to fetch */
char *portalname; /* name of portal (cursor) */
bool ismove; /* TRUE if MOVE */
} FetchStmt;