From 6918df16a5483600fb0466b96f813ed5b6927fd8 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 24 Jun 2002 23:12:06 +0000
Subject: [PATCH] plpgsql's PERFORM statement now sets FOUND depending on
 whether any rows were returned by the performed query.  Per recent
 pgsql-general discussion.

---
 doc/src/sgml/plsql.sgml      | 12 +++++-------
 src/pl/plpgsql/src/pl_exec.c | 12 ++++++++----
 2 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/doc/src/sgml/plsql.sgml b/doc/src/sgml/plsql.sgml
index 91e96c77f06..082b77fc5b2 100644
--- a/doc/src/sgml/plsql.sgml
+++ b/doc/src/sgml/plsql.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/Attic/plsql.sgml,v 2.59 2002/06/15 19:34:51 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/Attic/plsql.sgml,v 2.60 2002/06/24 23:12:06 tgl Exp $
 -->
 
 <chapter id="plpgsql"> 
@@ -903,7 +903,9 @@ PERFORM <replaceable>query</replaceable>;
      This executes a <literal>SELECT</literal>
      <replaceable>query</replaceable> and discards the
      result. <application>PL/pgSQL</application> variables are substituted
-     in the query as usual.
+     in the query as usual.  Also, the special variable FOUND is set to
+     true if the query produced at least one row, or false if it produced
+     no rows.
     </para>
 
     <note>
@@ -916,11 +918,7 @@ PERFORM <replaceable>query</replaceable>;
     <para>
      An example:
 <programlisting>
-PERFORM create_mv(''cs_session_page_requests_mv'',''
-     SELECT   session_id, page_id, count(*) AS n_hits,
-              sum(dwell_time) AS dwell_time, count(dwell_time) AS dwell_count
-     FROM     cs_fact_table
-     GROUP BY session_id, page_id '');
+PERFORM create_mv(''cs_session_page_requests_mv'', my_query);
 </programlisting>
     </para>
    </sect2>
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index ab539dc928a..abfce9b8bd2 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.55 2002/03/25 07:41:10 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.56 2002/06/24 23:12:06 tgl Exp $
  *
  *	  This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -969,9 +969,11 @@ exec_stmt_assign(PLpgSQL_execstate * estate, PLpgSQL_stmt_assign * stmt)
 	else
 	{
 		/*
-		 * PERFORM: evaluate query and discard result.	This cannot share
-		 * code with the assignment case since we do not wish to
-		 * constraint the discarded result to be only one row/column.
+		 * PERFORM: evaluate query and discard result (but set FOUND
+		 * depending on whether at least one row was returned).
+		 *
+		 * This cannot share code with the assignment case since we do not
+		 * wish to constrain the discarded result to be only one row/column.
 		 */
 		int			rc;
 
@@ -985,6 +987,8 @@ exec_stmt_assign(PLpgSQL_execstate * estate, PLpgSQL_stmt_assign * stmt)
 		if (rc != SPI_OK_SELECT)
 			elog(ERROR, "query \"%s\" didn't return data", expr->query);
 
+		exec_set_found(estate, (estate->eval_processed != 0));
+
 		exec_eval_cleanup(estate);
 	}
 
-- 
GitLab