diff options
Diffstat (limited to 'src/backend/commands/portalcmds.c')
-rw-r--r-- | src/backend/commands/portalcmds.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index 78d1f7c20bb..f1f0831882d 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.38.4.1 2005/04/11 15:59:47 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.38.4.2 2007/02/06 22:49:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -389,15 +389,30 @@ PersistHoldablePortal(Portal portal) /* we do not need AfterTriggerEndQuery() here */ /* - * Reset the position in the result set: ideally, this could be - * implemented by just skipping straight to the tuple # that we - * need to be at, but the tuplestore API doesn't support that. So - * we start at the beginning of the tuplestore and iterate through - * it until we reach where we need to be. FIXME someday? + * Set the position in the result set: ideally, this could be + * implemented by just skipping straight to the tuple # that we need + * to be at, but the tuplestore API doesn't support that. So we start + * at the beginning of the tuplestore and iterate through it until we + * reach where we need to be. FIXME someday? (Fortunately, the + * typical case is that we're supposed to be at or near the start + * of the result set, so this isn't as bad as it sounds.) */ MemoryContextSwitchTo(portal->holdContext); - if (!portal->atEnd) + if (portal->atEnd) + { + /* we can handle this case even if posOverflow */ + HeapTuple tup; + bool should_free; + + while ((tup = tuplestore_gettuple(portal->holdStore, true, + &should_free)) != NULL) + { + if (should_free) + pfree(tup); + } + } + else { long store_pos; |