1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-18 12:22:09 +03:00

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

@@ -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
*/