Обсуждение: Savepoints and SPI

Поиск
Список
Период
Сортировка

Savepoints and SPI

От
Thomas Hallgren
Дата:
I have some test code that utilize SPI and does the following:

1. SPI_connect
2. set a savepoint (using BeginInternalSubTransaction)
3. execute a statement that contains a syntax error (within PG_TRY/PG_CATCH)
4. rollback to the savepoint (RollbackAndReleaseCurrentSubTransaction)
5. execute some other statement.

it errors out in step 5 with SPI_ERROR_UNCONNECTED. It seems that step 
3, when it encounters an error, automatically executes a SPI_finish. Is 
that the desired behavior?

Should I assume that _all_ errors will act this way, i.e. should I 
assume that if I end up in a PG_CATCH() that my SPI has been 
disconnected always?

Regards,
Thomas Hallgren


Re: Savepoints and SPI

От
Alvaro Herrera
Дата:
On Wed, Mar 16, 2005 at 07:35:57PM +0100, Thomas Hallgren wrote:
> I have some test code that utilize SPI and does the following:
> 
> 1. SPI_connect
> 2. set a savepoint (using BeginInternalSubTransaction)
> 3. execute a statement that contains a syntax error (within PG_TRY/PG_CATCH)
> 4. rollback to the savepoint (RollbackAndReleaseCurrentSubTransaction)
> 5. execute some other statement.
> 
> it errors out in step 5 with SPI_ERROR_UNCONNECTED. It seems that step 
> 3, when it encounters an error, automatically executes a SPI_finish. Is 
> that the desired behavior?

I'd expect the code to close an SPI connection that is opened inside the
savepoint, but if you open it before setting the savepoint then it
should remain open.

-- 
Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
"Endurecerse, pero jamás perder la ternura" (E. Guevara)


Re: Savepoints and SPI

От
Thomas Hallgren
Дата:
Alvaro Herrera wrote:

>On Wed, Mar 16, 2005 at 07:35:57PM +0100, Thomas Hallgren wrote:
>  
>
>>I have some test code that utilize SPI and does the following:
>>
>>1. SPI_connect
>>2. set a savepoint (using BeginInternalSubTransaction)
>>3. execute a statement that contains a syntax error (within PG_TRY/PG_CATCH)
>>4. rollback to the savepoint (RollbackAndReleaseCurrentSubTransaction)
>>5. execute some other statement.
>>
>>it errors out in step 5 with SPI_ERROR_UNCONNECTED. It seems that step 
>>3, when it encounters an error, automatically executes a SPI_finish. Is 
>>that the desired behavior?
>>    
>>
>
>I'd expect the code to close an SPI connection that is opened inside the
>savepoint, but if you open it before setting the savepoint then it
>should remain open.
>  
>
That doesn't seem to be what happens. ISTM that the AtEOSubXact_SPI will 
do this always:
       _SPI_connected--;       _SPI_curid = _SPI_connected;

which in essence puts SPI in an unconnected state regardless of what the 
values where before on the _SPI_connected and _SPI_curid.

Regards,
Thomas Hallgren