From 1198d6339781e656e0f4f53959b119d5fe0eb898 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 9 May 2005 14:28:39 +0000
Subject: [PATCH] Add some defenses against functions declared to return set
 that don't actually follow the protocol; per example from Kris Jurka.

---
 src/backend/executor/execQual.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 43e0c19d545..1375db2e0a4 100644
--- a/src/backend/executor/execQual.c
+++ b/src/backend/executor/execQual.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.177 2005/05/06 17:24:53 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.178 2005/05/09 14:28:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -948,7 +948,7 @@ ExecMakeFunctionResult(FuncExprState *fcache,
 				 * returns set, save the current argument values to re-use
 				 * on the next call.
 				 */
-				if (fcache->func.fn_retset)
+				if (fcache->func.fn_retset && *isDone == ExprMultipleResult)
 				{
 					memcpy(&fcache->setArgs, &fcinfo, sizeof(fcinfo));
 					fcache->setHasSetArg = hasSetArg;
@@ -967,7 +967,8 @@ ExecMakeFunctionResult(FuncExprState *fcache,
 				 * Make sure we say we are returning a set, even if the
 				 * function itself doesn't return sets.
 				 */
-				*isDone = ExprMultipleResult;
+				if (hasSetArg)
+					*isDone = ExprMultipleResult;
 				break;
 			}
 
-- 
GitLab