From 110ba08a12fc1b3db38864ebd4b0feae5b3657a7 Mon Sep 17 00:00:00 2001
From: "Vadim B. Mikheev" <vadim4o@yahoo.com>
Date: Mon, 27 Oct 1997 08:55:16 +0000
Subject: [PATCH] Fix binary cursors broken by MOVE implementation. (Thanks to
 Bruce for finding what caused problem).

---
 src/backend/commands/command.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c
index e259cb141ee..1f80e9e2e0d 100644
--- a/src/backend/commands/command.c
+++ b/src/backend/commands/command.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.19 1997/09/29 05:56:10 vadim Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.20 1997/10/27 08:55:16 vadim Exp $
  *
  * NOTES
  *	  The PortalExecutorHeapMemory crap needs to be eliminated
@@ -97,10 +97,10 @@ PerformPortalFetch(char *name,
 				   char *tag,
 				   CommandDest dest)
 {
-	Portal		portal;
-	int			feature;
-	QueryDesc	queryDesc;
-	MemoryContext context;
+	Portal			portal;
+	int				feature;
+	QueryDesc	   *queryDesc;
+	MemoryContext	context;
 
 	/* ----------------
 	 *	sanity checks
@@ -147,11 +147,19 @@ PerformPortalFetch(char *name,
 	 *	tell the destination to prepare to recieve some tuples
 	 * ----------------
 	 */
-	memcpy (&queryDesc, PortalGetQueryDesc(portal), sizeof (queryDesc));
-	queryDesc.dest = dest;
+	queryDesc = PortalGetQueryDesc(portal);
+	
+	if ( dest == None )		/* MOVE */
+	{
+		QueryDesc	*qdesc = (QueryDesc *) palloc (sizeof (QueryDesc));
+		
+		memcpy (qdesc, queryDesc, sizeof (QueryDesc));
+		qdesc->dest = dest;
+		queryDesc = qdesc;
+	}
 	
 	BeginCommand(name,
-				 queryDesc.operation,
+				 queryDesc->operation,
 				 portal->attinfo,		/* QueryDescGetTypeInfo(queryDesc),
 										 * */
 				 false,			/* portal fetches don't end up in
@@ -168,8 +176,11 @@ PerformPortalFetch(char *name,
 	PortalExecutorHeapMemory = (MemoryContext)
 		PortalGetHeapMemory(portal);
 
-	ExecutorRun(&queryDesc, PortalGetState(portal), feature, count);
+	ExecutorRun(queryDesc, PortalGetState(portal), feature, count);
 
+	if ( dest == None )		/* MOVE */
+		pfree (queryDesc);
+	
 	/* ----------------
 	 * Note: the "end-of-command" tag is returned by higher-level
 	 *		 utility code
-- 
GitLab