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.
This commit is contained in:
Bruce Momjian 2002-12-30 15:31:51 +00:00
parent a0fa0117a5
commit 33f0108df8
7 changed files with 56 additions and 57 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/fetch.sgml,v 1.21 2002/04/21 19:02:39 thomas Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/fetch.sgml,v 1.22 2002/12/30 15:31:47 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -89,7 +89,7 @@ FETCH [ FORWARD | BACKWARD | RELATIVE ] [ <replaceable class="PARAMETER">#</repl
<para> <para>
A signed integer that specifies how many rows to fetch. A signed integer that specifies how many rows to fetch.
Note that a negative integer is equivalent to changing the sense of Note that a negative integer is equivalent to changing the sense of
FORWARD and BACKWARD. FORWARD and BACKWARD. Zero re-fetches the current row.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -180,30 +180,6 @@ WARNING: FETCH/ABSOLUTE not supported, using RELATIVE
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><computeroutput>
ERROR: FETCH/RELATIVE at current position is not supported
</computeroutput></term>
<listitem>
<para>
<acronym>SQL92</acronym> allows one to repetitively retrieve the cursor
at its <quote>current position</quote> using the syntax
<synopsis>
FETCH RELATIVE 0 FROM <replaceable class="PARAMETER">cursor</replaceable>.
</synopsis>
</para>
<para>
<productname>PostgreSQL</productname> does not currently support
this notion; in fact the value zero is reserved to indicate that
all rows should be retrieved and is equivalent to specifying the ALL keyword.
If the RELATIVE keyword has been used, <productname>PostgreSQL</productname>
assumes that the user intended <acronym>SQL92</acronym> behavior
and returns this error message.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
</para> </para>
</refsect2> </refsect2>

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/move.sgml,v 1.14 2002/11/13 00:44:08 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/move.sgml,v 1.15 2002/12/30 15:31:47 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -35,8 +35,8 @@ MOVE [ <replaceable class="PARAMETER">direction</replaceable> ]
Description Description
</title> </title>
<para> <para>
<command>MOVE</command> allows a user to move cursor position a specified <command>MOVE</command> allows a user to move the cursor position a
number of rows. specified number of rows.
<command>MOVE</command> works like the <command>FETCH</command> command, <command>MOVE</command> works like the <command>FETCH</command> command,
but only positions the cursor and does not return rows. but only positions the cursor and does not return rows.
<replaceable class="PARAMETER">LAST</replaceable> moves to the end <replaceable class="PARAMETER">LAST</replaceable> moves to the end

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 void
PerformPortalFetch(char *name, PerformPortalFetch(char *name,
bool forward, bool forward,
int count, long count,
CommandDest dest, CommandDest dest,
char *completionTag) char *completionTag)
{ {
@ -100,12 +100,46 @@ PerformPortalFetch(char *name,
return; return;
} }
/* If zero count, we are done */ /* If zero count, handle specially */
if (count == 0) if (count == 0)
{
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; 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 */ /* Internally, zero count processes all portal rows */
if (count == INT_MAX) if (count == LONG_MAX)
count = 0; count = 0;
/* /*

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -2591,13 +2591,6 @@ comment_text:
FetchStmt: FETCH direction fetch_how_many from_in name FetchStmt: FETCH direction fetch_how_many from_in name
{ {
FetchStmt *n = makeNode(FetchStmt); 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) if ($3 < 0)
{ {
$3 = -$3; $3 = -$3;
@ -2629,10 +2622,6 @@ FetchStmt: FETCH direction fetch_how_many from_in name
| FETCH direction from_in name | FETCH direction from_in name
{ {
FetchStmt *n = makeNode(FetchStmt); FetchStmt *n = makeNode(FetchStmt);
if ($2 == RELATIVE)
{
$2 = FORWARD;
}
n->direction = $2; n->direction = $2;
n->howMany = 1; n->howMany = 1;
n->portalname = $4; n->portalname = $4;
@ -2719,20 +2708,20 @@ FetchStmt: FETCH direction fetch_how_many from_in name
direction: FORWARD { $$ = FORWARD; } direction: FORWARD { $$ = FORWARD; }
| BACKWARD { $$ = BACKWARD; } | BACKWARD { $$ = BACKWARD; }
| RELATIVE { $$ = RELATIVE; } | RELATIVE { $$ = FORWARD; }
| ABSOLUTE | ABSOLUTE
{ {
elog(NOTICE, elog(NOTICE,
"FETCH / ABSOLUTE not supported, using RELATIVE"); "FETCH / ABSOLUTE not supported, using RELATIVE");
$$ = RELATIVE; $$ = FORWARD;
} }
; ;
fetch_how_many: fetch_how_many:
Iconst { $$ = $1; } Iconst { $$ = $1; }
| '-' Iconst { $$ = - $2; } | '-' Iconst { $$ = - $2; }
| ALL { $$ = INT_MAX; } | ALL { $$ = LONG_MAX; }
| LAST { $$ = INT_MAX; } | LAST { $$ = LONG_MAX; }
| NEXT { $$ = 1; } | NEXT { $$ = 1; }
| PRIOR { $$ = -1; } | PRIOR { $$ = -1; }
; ;

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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; FetchStmt *stmt = (FetchStmt *) parsetree;
char *portalName = stmt->portalname; char *portalName = stmt->portalname;
bool forward; bool forward;
int count; long count;
forward = (bool) (stmt->direction == FORWARD); forward = (bool) (stmt->direction == FORWARD);

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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. * BadArg if forward invalid.
* "ERROR" if portal not found. * "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); CommandDest dest, char *completionTag);
/* /*

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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; NodeTag type;
int direction; /* FORWARD or BACKWARD */ int direction; /* FORWARD or BACKWARD */
int howMany; /* amount to fetch */ long howMany; /* amount to fetch */
char *portalname; /* name of portal (cursor) */ char *portalname; /* name of portal (cursor) */
bool ismove; /* TRUE if MOVE */ bool ismove; /* TRUE if MOVE */
} FetchStmt; } FetchStmt;