diff options
author | Bruce Momjian <bruce@momjian.us> | 2002-12-30 15:31:51 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2002-12-30 15:31:51 +0000 |
commit | 33f0108df8a79cdb6dbf91f7eb4329143c0730d8 (patch) | |
tree | a04245944b6e99a5710cca9651893bed47686f3c /src/backend/commands/portalcmds.c | |
parent | a0fa0117a5ad728b6f85a39cc52006736f54f90e (diff) | |
download | postgresql-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/backend/commands/portalcmds.c')
-rw-r--r-- | src/backend/commands/portalcmds.c | 46 |
1 files changed, 40 insertions, 6 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 */ |