aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-01-30 18:02:40 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-01-30 18:02:40 +0000
commit052e884e8ba716b82429e6f24d1b136fb4594a1f (patch)
tree928507a7e3878415ce539cdd1c1d0994d309bd4d
parentf109cb128553162fef3e8f945ef5a4d8f4698269 (diff)
downloadpostgresql-052e884e8ba716b82429e6f24d1b136fb4594a1f.tar.gz
postgresql-052e884e8ba716b82429e6f24d1b136fb4594a1f.zip
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.
-rw-r--r--src/pl/plpgsql/src/pl_exec.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index d1a3a098dc2..1071521d23b 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.127.4.5 2006/01/17 17:33:36 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.127.4.6 2007/01/30 18:02:40 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -3930,16 +3930,23 @@ make_tuple_from_row(PLpgSQL_execstate *estate,
static char *
convert_value_to_string(Datum value, Oid valtype)
{
+ char *str;
Oid typoutput;
Oid typioparam;
bool typIsVarlena;
getTypeOutputInfo(valtype, &typoutput, &typioparam, &typIsVarlena);
- return DatumGetCString(OidFunctionCall3(typoutput,
- value,
- ObjectIdGetDatum(typioparam),
- Int32GetDatum(-1)));
+ SPI_push();
+
+ str = DatumGetCString(OidFunctionCall3(typoutput,
+ value,
+ ObjectIdGetDatum(typioparam),
+ Int32GetDatum(-1)));
+
+ SPI_pop();
+
+ return str;
}
/* ----------
@@ -3965,10 +3972,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);
}
}