diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-08-27 23:47:58 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-08-27 23:47:58 +0000 |
commit | ea2e263539df6a7df33e58e44236c504eb268e68 (patch) | |
tree | 7eaf045b3e96f2cd97bfa7910309e5b891159a55 /src/backend/executor/spi.c | |
parent | 7a2fe85b03b31f748614cae7a7b3808dba4f65ce (diff) | |
download | postgresql-ea2e263539df6a7df33e58e44236c504eb268e68.tar.gz postgresql-ea2e263539df6a7df33e58e44236c504eb268e68.zip |
Add new return codes SPI_OK_INSERT_RETURNING etc to the SPI API.
Fix all the standard PLs to be able to return tuples from FOO_RETURNING
statements as well as utility statements that return tuples. Also,
fix oversight that SPI_processed wasn't set for a utility statement
returning tuples. Per recent discussion.
Diffstat (limited to 'src/backend/executor/spi.c')
-rw-r--r-- | src/backend/executor/spi.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 183969f1b85..dd22a2dd5f2 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.157 2006/08/14 22:57:15 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.158 2006/08/27 23:47:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1136,6 +1136,12 @@ SPI_result_code_string(int code) return "SPI_OK_UPDATE"; case SPI_OK_CURSOR: return "SPI_OK_CURSOR"; + case SPI_OK_INSERT_RETURNING: + return "SPI_OK_INSERT_RETURNING"; + case SPI_OK_DELETE_RETURNING: + return "SPI_OK_DELETE_RETURNING"; + case SPI_OK_UPDATE_RETURNING: + return "SPI_OK_UPDATE_RETURNING"; } /* Unrecognized code ... return something useful ... */ sprintf(buf, "Unrecognized SPI code %d", code); @@ -1454,6 +1460,9 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls, { ProcessUtility(queryTree->utilityStmt, paramLI, dest, NULL); + /* Update "processed" if stmt returned tuples */ + if (_SPI_current->tuptable) + _SPI_current->processed = _SPI_current->tuptable->alloced - _SPI_current->tuptable->free; res = SPI_OK_UTILITY; } else @@ -1542,13 +1551,22 @@ _SPI_pquery(QueryDesc *queryDesc, long tcount) res = SPI_OK_SELECT; break; case CMD_INSERT: - res = SPI_OK_INSERT; + if (queryDesc->parsetree->returningList) + res = SPI_OK_INSERT_RETURNING; + else + res = SPI_OK_INSERT; break; case CMD_DELETE: - res = SPI_OK_DELETE; + if (queryDesc->parsetree->returningList) + res = SPI_OK_DELETE_RETURNING; + else + res = SPI_OK_DELETE; break; case CMD_UPDATE: - res = SPI_OK_UPDATE; + if (queryDesc->parsetree->returningList) + res = SPI_OK_UPDATE_RETURNING; + else + res = SPI_OK_UPDATE; break; default: return SPI_ERROR_OPUNKNOWN; @@ -1568,7 +1586,8 @@ _SPI_pquery(QueryDesc *queryDesc, long tcount) _SPI_current->processed = queryDesc->estate->es_processed; _SPI_current->lastoid = queryDesc->estate->es_lastoid; - if (operation == CMD_SELECT && queryDesc->dest->mydest == DestSPI) + if ((res == SPI_OK_SELECT || queryDesc->parsetree->returningList) && + queryDesc->dest->mydest == DestSPI) { if (_SPI_checktuples()) elog(ERROR, "consistency check on SPI tuple count failed"); |