| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> | 
|---|---|
| To: | Leif Jensen <leif(at)crysberg(dot)dk> | 
| Cc: | pgsql-general(at)postgresql(dot)org | 
| Subject: | Re: Recursive stored procedure in C. | 
| Date: | 2005-07-14 13:41:29 | 
| Message-ID: | 14295.1121348489@sss.pgh.pa.us | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
Leif Jensen <leif(at)crysberg(dot)dk> writes:
>    I am trying to make a stored procedure in C that is used as a trigger
> on before/after insert/update on a certain table. This procedure might do
> inserts/updates on the same table (recursively triggering itself). I have
> made (pretty) sure that I'm not using 'global' variables in this module
> and that I do an SPI_connect() the very first time I enter and an
> SPI_finish() at the last exit.
If you want the trigger levels to be independent (which I think you do)
then you need a SPI_connect and a SPI_finish in *each* trigger call.
Whatever magic you are doing to special-case recursion is all wrong and
should be ripped out, root and branch.
The bit you may be missing is that you need to do SPI_push and SPI_pop
around anything that might possibly call another function using SPI (eg,
your own recursive instance, but also anything else that might use SPI).
SPI_execute() and friends do this for you, but if the recursion is not
via a SPI-executed query then you need to do it explicitly.
regards, tom lane
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Leif Jensen | 2005-07-14 13:54:30 | Re: Recursive stored procedure in C. | 
| Previous Message | Tom Lane | 2005-07-14 12:57:59 | Re: ERROR: could not open relation |