Commit 4e5a947d authored by Bruce Momjian's avatar Bruce Momjian

Make MOVE/FETCH 0 actually move/fetch 0. Add MOVE LAST to move to end

of cursor.
parent 9b12ab6d
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/move.sgml,v 1.13 2002/04/21 19:02:39 thomas Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/move.sgml,v 1.14 2002/11/13 00:44:08 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -21,7 +21,8 @@ PostgreSQL documentation ...@@ -21,7 +21,8 @@ PostgreSQL documentation
<date>1999-07-20</date> <date>1999-07-20</date>
</refsynopsisdivinfo> </refsynopsisdivinfo>
<synopsis> <synopsis>
MOVE [ <replaceable class="PARAMETER">direction</replaceable> ] [ <replaceable class="PARAMETER">count</replaceable> ] MOVE [ <replaceable class="PARAMETER">direction</replaceable> ]
{<replaceable class="PARAMETER">count</replaceable> | LAST }
{ IN | FROM } <replaceable class="PARAMETER">cursor</replaceable> { IN | FROM } <replaceable class="PARAMETER">cursor</replaceable>
</synopsis> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -37,8 +38,9 @@ MOVE [ <replaceable class="PARAMETER">direction</replaceable> ] [ <replaceable c ...@@ -37,8 +38,9 @@ MOVE [ <replaceable class="PARAMETER">direction</replaceable> ] [ <replaceable c
<command>MOVE</command> allows a user to move cursor position a specified <command>MOVE</command> allows a user to move cursor position a specified
number of rows. 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 but only positions the cursor and does not return rows.
not return rows. <replaceable class="PARAMETER">LAST</replaceable> moves to the end
of the cursor.
</para> </para>
<para> <para>
Refer to Refer to
......
...@@ -8,13 +8,15 @@ ...@@ -8,13 +8,15 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.3 2002/09/04 20:31:15 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.4 2002/11/13 00:44:08 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres.h" #include "postgres.h"
#include <limits.h>
#include "commands/portalcmds.h" #include "commands/portalcmds.h"
#include "executor/executor.h" #include "executor/executor.h"
...@@ -55,7 +57,7 @@ PortalCleanup(Portal portal) ...@@ -55,7 +57,7 @@ PortalCleanup(Portal portal)
* *
* name: name of portal * name: name of portal
* forward: forward or backward fetch? * forward: forward or backward fetch?
* count: # of tuples to fetch (0 implies all) * count: # of tuples to fetch
* dest: where to send results * dest: where to send results
* completionTag: points to a buffer of size COMPLETION_TAG_BUFSIZE * completionTag: points to a buffer of size COMPLETION_TAG_BUFSIZE
* in which to store a command completion status string. * in which to store a command completion status string.
...@@ -100,6 +102,14 @@ PerformPortalFetch(char *name, ...@@ -100,6 +102,14 @@ PerformPortalFetch(char *name,
return; return;
} }
/* If zero count, we are done */
if (count == 0)
return;
/* Internally, zero count processes all portal rows */
if (count == INT_MAX)
count = 0;
/* /*
* switch into the portal context * switch into the portal context
*/ */
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.185 2002/11/13 00:39:46 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.186 2002/11/13 00:44:08 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1116,7 +1116,8 @@ lnext: ; ...@@ -1116,7 +1116,8 @@ lnext: ;
/* /*
* check our tuple count.. if we've processed the proper number * check our tuple count.. if we've processed the proper number
* then quit, else loop again and process more tuples.. * then quit, else loop again and process more tuples. Zero
* number_tuples means no limit.
*/ */
current_tuple_count++; current_tuple_count++;
if (numberTuples == current_tuple_count) if (numberTuples == current_tuple_count)
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.376 2002/11/11 22:19:23 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.377 2002/11/13 00:44:08 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include "postgres.h" #include "postgres.h"
#include <ctype.h> #include <ctype.h>
#include <limits.h>
#include "access/htup.h" #include "access/htup.h"
#include "catalog/index.h" #include "catalog/index.h"
...@@ -358,7 +359,7 @@ static void doNegateFloat(Value *v); ...@@ -358,7 +359,7 @@ static void doNegateFloat(Value *v);
KEY KEY
LANCOMPILER LANGUAGE LEADING LEFT LEVEL LIKE LIMIT LANCOMPILER LANGUAGE LAST LEADING LEFT LEVEL LIKE LIMIT
LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
LOCK_P LOCK_P
...@@ -2661,7 +2662,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name ...@@ -2661,7 +2662,7 @@ FetchStmt: FETCH direction fetch_how_many from_in name
if ($3 < 0) if ($3 < 0)
{ {
$3 = -$3; $3 = -$3;
$2 = (($2 == FORWARD)? BACKWARD: FORWARD); $2 = (($2 == FORWARD) ? BACKWARD: FORWARD);
} }
n->direction = $2; n->direction = $2;
n->howMany = $3; n->howMany = $3;
...@@ -2729,8 +2730,8 @@ direction: FORWARD { $$ = FORWARD; } ...@@ -2729,8 +2730,8 @@ direction: FORWARD { $$ = FORWARD; }
fetch_how_many: fetch_how_many:
Iconst { $$ = $1; } Iconst { $$ = $1; }
| '-' Iconst { $$ = - $2; } | '-' Iconst { $$ = - $2; }
/* 0 means fetch all tuples*/ | ALL { $$ = INT_MAX; }
| ALL { $$ = 0; } | LAST { $$ = INT_MAX; }
| NEXT { $$ = 1; } | NEXT { $$ = 1; }
| PRIOR { $$ = -1; } | PRIOR { $$ = -1; }
; ;
...@@ -7060,6 +7061,7 @@ unreserved_keyword: ...@@ -7060,6 +7061,7 @@ unreserved_keyword:
| KEY | KEY
| LANGUAGE | LANGUAGE
| LANCOMPILER | LANCOMPILER
| LAST
| LEVEL | LEVEL
| LISTEN | LISTEN
| LOAD | LOAD
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.129 2002/11/11 22:19:23 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.130 2002/11/13 00:44:09 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -172,6 +172,7 @@ static const ScanKeyword ScanKeywords[] = { ...@@ -172,6 +172,7 @@ static const ScanKeyword ScanKeywords[] = {
{"key", KEY}, {"key", KEY},
{"lancompiler", LANCOMPILER}, {"lancompiler", LANCOMPILER},
{"language", LANGUAGE}, {"language", LANGUAGE},
{"last", LAST},
{"leading", LEADING}, {"leading", LEADING},
{"left", LEFT}, {"left", LEFT},
{"level", LEVEL}, {"level", LEVEL},
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.180 2002/10/21 20:31:52 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.181 2002/11/13 00:44:09 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -262,9 +262,8 @@ ProcessUtility(Node *parsetree, ...@@ -262,9 +262,8 @@ ProcessUtility(Node *parsetree,
forward = (bool) (stmt->direction == FORWARD); forward = (bool) (stmt->direction == FORWARD);
/* /*
* parser ensures that count is >= 0 and 'fetch ALL' -> 0 * parser ensures that count is >= 0
*/ */
count = stmt->howMany; count = stmt->howMany;
PerformPortalFetch(portalName, forward, count, PerformPortalFetch(portalName, forward, count,
(stmt->ismove) ? None : dest, (stmt->ismove) ? None : dest,
......
...@@ -7,7 +7,7 @@ ...@@ -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.2 2002/09/04 20:31:42 momjian Exp $ * $Id: portalcmds.h,v 1.3 2002/11/13 00:44:09 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
/* /*
* PerformPortalFetch * PerformPortalFetch
* Performs the POSTQUEL function FETCH. Fetches count (or all if 0) * Performs the POSTQUEL function FETCH. Fetches count
* tuples in portal with name in the forward direction iff goForward. * tuples in portal with name in the forward direction iff goForward.
* *
* Exceptions: * Exceptions:
......
...@@ -7,7 +7,7 @@ ...@@ -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.212 2002/11/11 22:19:24 tgl Exp $ * $Id: parsenodes.h,v 1.213 2002/11/13 00:44:09 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1277,7 +1277,7 @@ typedef struct FetchStmt ...@@ -1277,7 +1277,7 @@ typedef struct FetchStmt
{ {
NodeTag type; NodeTag type;
int direction; /* FORWARD or BACKWARD */ int direction; /* FORWARD or BACKWARD */
int howMany; /* amount to fetch ("ALL" --> 0) */ int 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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment