1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-28 05:21:27 +03:00

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.
This commit is contained in:
Tom Lane 2007-01-30 18:02:34 +00:00
parent 5e6c06f040
commit 458e9169d6

View File

@ -3,7 +3,7 @@
* procedural language * procedural language
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.154.2.4 2006/03/02 05:34:17 tgl Exp $ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.154.2.5 2007/01/30 18:02:34 tgl Exp $
* *
* This software is copyrighted by Jan Wieck - Hamburg. * This software is copyrighted by Jan Wieck - Hamburg.
* *
@ -4086,12 +4086,19 @@ make_tuple_from_row(PLpgSQL_execstate *estate,
static char * static char *
convert_value_to_string(Datum value, Oid valtype) convert_value_to_string(Datum value, Oid valtype)
{ {
char *str;
Oid typoutput; Oid typoutput;
bool typIsVarlena; bool typIsVarlena;
getTypeOutputInfo(valtype, &typoutput, &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; char *extval;
extval = convert_value_to_string(value, valtype); extval = convert_value_to_string(value, valtype);
SPI_push();
value = FunctionCall3(reqinput, value = FunctionCall3(reqinput,
CStringGetDatum(extval), CStringGetDatum(extval),
ObjectIdGetDatum(reqtypioparam), ObjectIdGetDatum(reqtypioparam),
Int32GetDatum(reqtypmod)); Int32GetDatum(reqtypmod));
SPI_pop();
pfree(extval); pfree(extval);
} }
} }