]> granicus.if.org Git - postgresql/commitdiff
Add some defenses against functions declared to return set that don't
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 9 May 2005 14:28:39 +0000 (14:28 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 9 May 2005 14:28:39 +0000 (14:28 +0000)
actually follow the protocol; per example from Kris Jurka.

src/backend/executor/execQual.c

index 43e0c19d5456639c397ea746dc8eb5d9fdfb7d89..1375db2e0a416b6591fa306c40507b2e155c93d3 100644 (file)
@@ -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;
                        }