]> granicus.if.org Git - postgresql/commitdiff
Clean up some unnecessary fragility in EXECUTE command.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 4 Jan 2001 02:38:02 +0000 (02:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 4 Jan 2001 02:38:02 +0000 (02:38 +0000)
src/pl/plpgsql/src/pl_exec.c

index 5bf76a9d94133ddf937aa313ef1bd05c08a99831..174dc92f3d000a6a331ecf646d4533cf6e98f644 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.33 2000/12/01 20:43:59 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.34 2001/01/04 02:38:02 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -1951,6 +1951,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
        HeapTuple       typetup;
        Form_pg_type typeStruct;
        FmgrInfo        finfo_output;
+       int                     exec_res;
 
        /* ----------
         * First we evaluate the string expression after the
@@ -1960,7 +1961,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
         */
        query = exec_eval_expr(estate, stmt->query, &isnull, &restype);
        if (isnull)
-               elog(ERROR, "cannot EXECUTE NULL-query");
+               elog(ERROR, "cannot EXECUTE NULL query");
 
        /* ----------
         * Get the C-String representation.
@@ -1986,26 +1987,30 @@ exec_stmt_dynexecute(PLpgSQL_execstate * estate,
 
        /* ----------
         * Call SPI_exec() without preparing a saved plan. 
-        * The returncode can be any OK except for OK_SELECT.
+        * The returncode can be any standard OK.  Note that
+        * while a SELECT is allowed, its results will be discarded.
         * ----------
         */
-       switch(SPI_exec(querystr, 0))
+       exec_res = SPI_exec(querystr, 0);
+       switch (exec_res)
        {
-               case SPI_OK_UTILITY:
+               case SPI_OK_SELECT:
                case SPI_OK_SELINTO:
                case SPI_OK_INSERT:
                case SPI_OK_UPDATE:
                case SPI_OK_DELETE:
+               case SPI_OK_UTILITY:
                        break;
 
-               case SPI_OK_SELECT:
-                       elog(ERROR, "unexpected SELECT operation in EXECUTE of query '%s'",
-                                               querystr);
+               case 0:
+                       /* Also allow a zero return, which implies the querystring
+                        * contained no commands.
+                        */
                        break;
 
                default:
-                       elog(ERROR, "unexpected error in EXECUTE for query '%s'",
-                                               querystr);
+                       elog(ERROR, "unexpected error %d in EXECUTE of query '%s'",
+                                exec_res, querystr);
                        break;
        }
 
@@ -2095,7 +2100,7 @@ exec_stmt_dynfors(PLpgSQL_execstate * estate, PLpgSQL_stmt_dynfors * stmt)
         * ----------
         */
        if (SPI_exec(querystr, 0) != SPI_OK_SELECT)
-               elog(ERROR, "FOR ... EXECUTE query '%s' was no SELECT", querystr);
+               elog(ERROR, "FOR ... EXECUTE query '%s' was not SELECT", querystr);
        pfree(querystr);
 
        n = SPI_processed;