diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2009-01-14 09:53:51 +0000 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2009-01-14 09:53:51 +0000 |
commit | f2248478c1dca544b2310073cd99df7cde2800d5 (patch) | |
tree | 7c7d15f2148ba361ec888a3d142797efcb4d87f4 | |
parent | 03b4fc72407f0535782de16b41ad5c818d749a49 (diff) | |
download | postgresql-f2248478c1dca544b2310073cd99df7cde2800d5.tar.gz postgresql-f2248478c1dca544b2310073cd99df7cde2800d5.zip |
Remove broken Assertions that failed if a statement executed in PL/pgSQL is
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.
-rw-r--r-- | src/pl/plpgsql/src/pl_exec.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 4dab908a16a..fd7cce3aedd 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -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: |