mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
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.
This commit is contained in:
parent
63ca96af30
commit
963b87c50b
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.180.2.7 2009/01/07 20:39:15 tgl Exp $
|
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.180.2.8 2009/01/14 09:53:57 heikki Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2425,13 +2425,19 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for error, and set FOUND if appropriate (for historical reasons
|
* Check for error, and set FOUND if appropriate (for historical reasons
|
||||||
* we set FOUND only for certain query types). Also Assert that we
|
* we set FOUND only for certain query types).
|
||||||
* identified the statement type the same as SPI did.
|
*
|
||||||
|
* 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)
|
switch (rc)
|
||||||
{
|
{
|
||||||
case SPI_OK_SELECT:
|
case SPI_OK_SELECT:
|
||||||
Assert(!stmt->mod_stmt);
|
|
||||||
exec_set_found(estate, (SPI_processed != 0));
|
exec_set_found(estate, (SPI_processed != 0));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2441,13 +2447,11 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
|
|||||||
case SPI_OK_INSERT_RETURNING:
|
case SPI_OK_INSERT_RETURNING:
|
||||||
case SPI_OK_UPDATE_RETURNING:
|
case SPI_OK_UPDATE_RETURNING:
|
||||||
case SPI_OK_DELETE_RETURNING:
|
case SPI_OK_DELETE_RETURNING:
|
||||||
Assert(stmt->mod_stmt);
|
|
||||||
exec_set_found(estate, (SPI_processed != 0));
|
exec_set_found(estate, (SPI_processed != 0));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPI_OK_SELINTO:
|
case SPI_OK_SELINTO:
|
||||||
case SPI_OK_UTILITY:
|
case SPI_OK_UTILITY:
|
||||||
Assert(!stmt->mod_stmt);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user