Re: [PATCHES] Re: Recursion and SPI - Mailing list pgsql-hackers
From | Bruce Momjian |
---|---|
Subject | Re: [PATCHES] Re: Recursion and SPI |
Date | |
Msg-id | 200101091423.JAA02761@candle.pha.pa.us Whole thread Raw |
In response to | Re: Recursion and SPI (Ian Lance Taylor <ian@airs.com>) |
Responses |
Lock on arbitrary string feature
(Lincoln Yeoh <lyeoh@pop.jaring.my>)
|
List | pgsql-hackers |
Applied. Thanks. > "Mikheev, Vadim" <vmikheev@SECTORBASE.COM> writes: > > > > Does the SPI interface support recursion? That is, can a function > > > use SPI to make a query which involves calling another function which > > > uses SPI? > > > > >From http://www.postgresql.org/docs/programmer/spi.htm : > > > > "SPI procedures are always called by some (upper) Executor and the SPI > > manager > > uses the Executor to run your queries. Other procedures may be called by the > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > Executor running queries from your procedure." > > > > > The documentation suggests not, saying that if a function which uses > > > SPI calls another function which uses SPI, it won't work, and calling > > > that ``bad practice.'' > > > > >From http://www.postgresql.org/docs/programmer/spi-spiconnect.htm : > > > > "You may get SPI_ERROR_CONNECT error if SPI_connect is called from an > > already > > connected procedure - e.g. if you *directly call* one procedure from another > > ^^^^^^^^^^^^^^^ > > connected one. Actually, while the child procedure will be able to use SPI, > > your parent procedure will not be able to continue to use SPI after the > > child > > returns (if SPI_finish is called by the child). It's bad practice." > > > > But you are able to run queries which call SPI functions. > > Thanks for the clarification. > > Approaching the current documentation from a position of ignorance, I > find it ambiguous. I propose something along the lines of the > following patch to clarify it. Thanks. > > (Alternatively, perhaps the code could maintain a count of nested > calls to SPI_connect/SPI_finish. But I didn't try to write that > patch.) > > Ian > > Index: spi.sgml > =================================================================== > RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/spi.sgml,v > retrieving revision 1.8 > diff -u -r1.8 spi.sgml > --- spi.sgml 2000/12/22 18:57:50 1.8 > +++ spi.sgml 2001/01/05 22:10:13 > @@ -34,10 +34,11 @@ > </Para> > > <Para> > -<Acronym>SPI</Acronym> procedures are always called by some (upper) > -Executor and the <Acronym>SPI</Acronym> > -manager uses the Executor to run your queries. Other procedures may be > -called by the Executor running queries from your procedure. > +Procedures which use <Acronym>SPI</Acronym> are called by the > +Executor. The <Acronym>SPI</Acronym> calls recursively invoke the > +Executor in turn to run queries. When the Executor is invoked > +recursively, it may itself call procedures which may make > +<Acronym>SPI</Acronym> calls. > </Para> > > <Para> > @@ -146,12 +147,17 @@ > utility SPI functions may be called from un-connected procedures. > </PARA> > <PARA> > - You may get <ReturnValue>SPI_ERROR_CONNECT</ReturnValue> error if <Function>SPI_connect</Function> is > - called from an already connected procedure - e.g. if you directly call one > - procedure from another connected one. Actually, while the child procedure > - will be able to use SPI, your parent procedure will not be able to continue > - to use SPI after the child returns (if <Function>SPI_finish</Function> is called by the child). > - It's bad practice. > + If your procedure is already connected, > + <Function>SPI_connect</Function> will return an > + <ReturnValue>SPI_ERROR_CONNECT</ReturnValue> error. Note that this > + may happen if a procedure which has called > + <Function>SPI_connect</Function> directly calls another procedure > + which itself calls <Function>SPI_connect</Function>. While > + recursive calls to the <Acronym>SPI</Acronym> manager are permitted > + when an <Acronym>SPI</Acronym> query invokes another function which > + uses <Acronym>SPI</Acronym>, directly nested calls to > + <Function>SPI_connect</Function> and > + <Function>SPI_finish</Function> are forbidden. > </PARA> > </REFSECT1> > <REFSECT1 ID="R1-SPI-SPICONNECT-2"> > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
pgsql-hackers by date: