From 745e6edaaeaccb92a2a5efe44b49c8bcc7d0ce01 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 12 Feb 2008 04:09:44 +0000 Subject: Fix SPI_cursor_open() and SPI_is_cursor_plan() to push the SPI stack before doing anything interesting, such as calling RevalidateCachedPlan(). The necessity of this is demonstrated by an example from Willem Buitendyk: during a replan, the planner might try to evaluate SPI-using functions, and so we'd better be in a clean SPI context. A small downside of this fix is that these two functions will now fail outright if called when not inside a SPI-using procedure (ie, a SPI_connect/SPI_finish pair). The documentation never promised or suggested that that would work, though; and they are normally used in concert with other functions, mainly SPI_prepare, that always have failed in such a case. So the odds of breaking something seem pretty low. In passing, make SPI_is_cursor_plan's error handling convention clearer, and fix documentation's erroneous claim that SPI_cursor_open would return NULL on error. Before 8.3 these functions could not invoke replanning, so there is probably no need for back-patching. --- doc/src/sgml/spi.sgml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'doc/src') diff --git a/doc/src/sgml/spi.sgml b/doc/src/sgml/spi.sgml index fca48caec0..d488c203d3 100644 --- a/doc/src/sgml/spi.sgml +++ b/doc/src/sgml/spi.sgml @@ -1,4 +1,4 @@ - + Server Programming Interface @@ -1077,9 +1077,12 @@ bool SPI_is_cursor_plan(SPIPlanPtr plan) Return Value true or false to indicate if the - plan can produce a cursor or not. - If the plan is NULL or invalid, - SPI_result is set to SPI_ERROR_ARGUMENT + plan can produce a cursor or not, with + SPI_result set to zero. + If it is not possible to determine the answer (for example, + if the plan is NULL or invalid, + or if called when not connected to SPI), then + SPI_result is set to a suitable error code and false is returned. @@ -1442,8 +1445,8 @@ Portal SPI_cursor_open(const char * name, SPIPlanPtr Return Value - pointer to portal containing the cursor, or NULL - on error + Pointer to portal containing the cursor. Note there is no error + return convention; any error will be reported via elog. -- cgit v1.2.3