Remove broken Assertions that failed if a statement executed in PL/pgSQL is
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 14 Jan 2009 09:53:51 +0000 (09:53 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 14 Jan 2009 09:53:51 +0000 (09:53 +0000)
rewritten into another kind of statement, for example if an INSERT is
rewritten into an UPDATE.

Back-patch to 8.3 and 8.2. For HEAD, Tom suggested inventing a new
SPI_OK_REWRITTEN return code, but that's not a backportable solution. I'll
do that as a separate patch, this patch will do as a stopgap measure for HEAD
too in the meanwhile.

src/pl/plpgsql/src/pl_exec.c

index 4dab908a16ae3c75681e5d73aad1b058ee383c7c..fd7cce3aeddbcc3169fa053e3323eb839523eb4b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.228 2009/01/07 20:38:56 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.229 2009/01/14 09:53:51 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2782,13 +2782,19 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
 
        /*
         * Check for error, and set FOUND if appropriate (for historical reasons
-        * we set FOUND only for certain query types).  Also Assert that we
-        * identified the statement type the same as SPI did.
+        * we set FOUND only for certain query types).
+        *
+        * Note: the command type indicated by return code might not match
+        * mod_stmt, if there is an INSTEAD OF rule rewriting an UPDATE into an
+        * INSERT, for example. In that case, the INSERT doesn't have canSetTag
+        * set, mod_stmt is false, and SPI_execute_plan sets SPI_processed to
+        * zero. We'll set FOUND to false here in that case. If the statement is
+        * rewritten into a utility statement, however, FOUND is left unchanged.
+        * Arguably that's a bug, but changing it now could break applications.
         */
        switch (rc)
        {
                case SPI_OK_SELECT:
-                       Assert(!stmt->mod_stmt);
                        exec_set_found(estate, (SPI_processed != 0));
                        break;
 
@@ -2798,13 +2804,11 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
                case SPI_OK_INSERT_RETURNING:
                case SPI_OK_UPDATE_RETURNING:
                case SPI_OK_DELETE_RETURNING:
-                       Assert(stmt->mod_stmt);
                        exec_set_found(estate, (SPI_processed != 0));
                        break;
 
                case SPI_OK_SELINTO:
                case SPI_OK_UTILITY:
-                       Assert(!stmt->mod_stmt);
                        break;
 
                default: