Ensure that an Execute operation can't send tuples in cases where
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 May 2003 21:01:04 +0000 (21:01 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 6 May 2003 21:01:04 +0000 (21:01 +0000)
Describe would claim that no tuples will be returned.  Only affects
SELECTs added to non-SELECT base queries by rewrite rules.  If you
want to see the output of such a select, you gotta use 'simple Query'
protocol.

src/backend/tcop/pquery.c

index 0cb7865a9f66b8276cf660ae037bc5d69fc5ed4c..e3a37b7310e2f532f088f48929a309ad46052924 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.62 2003/05/06 20:26:27 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.63 2003/05/06 21:01:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -727,6 +727,23 @@ PortalRunMulti(Portal portal,
    List       *plantree_list = portal->planTrees;
    List       *querylist_item;
 
+   /*
+    * If the destination is RemoteExecute, change to None.  The reason
+    * is that the client won't be expecting any tuples, and indeed has no
+    * way to know what they are, since there is no provision for Describe
+    * to send a RowDescription message when this portal execution strategy
+    * is in effect.  This presently will only affect SELECT commands added
+    * to non-SELECT queries by rewrite rules: such commands will be executed,
+    * but the results will be discarded unless you use "simple Query"
+    * protocol.
+    */
+   if (dest->mydest == RemoteExecute ||
+       dest->mydest == RemoteExecuteInternal)
+       dest = None_Receiver;
+   if (altdest->mydest == RemoteExecute ||
+       altdest->mydest == RemoteExecuteInternal)
+       altdest = None_Receiver;
+
    /*
     * Loop to handle the individual queries generated from a
     * single parsetree by analysis and rewrite.