From: Tom Lane Date: Tue, 30 Jan 2007 18:02:34 +0000 (+0000) Subject: Add SPI_push/SPI_pop calls so that datatype input and output functions called X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=ea79093dacbc5dba3f5b568237eaf62c5843f5b6;p=users%2Fbernd%2Fpostgres.git Add SPI_push/SPI_pop calls so that datatype input and output functions called by plpgsql can themselves use SPI --- possibly indirectly, as in the case of domain_in() invoking plpgsql functions in a domain check constraint. Per bug #2945 from Sergiy Vyshnevetskiy. Somewhat arbitrarily, I've chosen to back-patch this as far as 8.0. Given the lack of prior complaints, it doesn't seem critical for 7.x. --- diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 5bef1dbf2a..bd841ac34d 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -4086,12 +4086,19 @@ make_tuple_from_row(PLpgSQL_execstate *estate, static char * convert_value_to_string(Datum value, Oid valtype) { + char *str; Oid typoutput; bool typIsVarlena; getTypeOutputInfo(valtype, &typoutput, &typIsVarlena); - return DatumGetCString(OidFunctionCall1(typoutput, value)); + SPI_push(); + + str = DatumGetCString(OidFunctionCall1(typoutput, value)); + + SPI_pop(); + + return str; } /* ---------- @@ -4117,10 +4124,12 @@ exec_cast_value(Datum value, Oid valtype, char *extval; extval = convert_value_to_string(value, valtype); + SPI_push(); value = FunctionCall3(reqinput, CStringGetDatum(extval), ObjectIdGetDatum(reqtypioparam), Int32GetDatum(reqtypmod)); + SPI_pop(); pfree(extval); } }