]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Add SPI_push/SPI_pop calls so that datatype input and output functions called
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 30 Jan 2007 18:02:40 +0000 (18:02 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 30 Jan 2007 18:02:40 +0000 (18:02 +0000)
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.

src/pl/plpgsql/src/pl_exec.c

index d1a3a098dc208af4d5b21888be773b03157360f1..1071521d23beb9b50313c8e555b8156f0211d4d5 100644 (file)
@@ -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);
                }
        }