From: | Michael Paquier <michael(dot)paquier(at)gmail(dot)com> |
---|---|
To: | dandl <david(at)andl(dot)org> |
Cc: | PostgreSQL mailing lists <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: SPI returns error for SAVEPOINT |
Date: | 2016-05-25 05:22:01 |
Message-ID: | CAB7nPqQDo15NQuKRj91b=ciN72KS63+tRMQHvHX_yasCPB++Ag@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Tue, May 24, 2016 at 9:55 PM, dandl <david(at)andl(dot)org> wrote:
> A plandl (language handler for Andl) function is called as follows:
>
> BEGIN;
> SELECT plandl_compile($1); // argument is Andl code
> COMMIT;
>
> Inside:
>
>>SPI_exec("BEGIN",...) returns error SPI_ERROR_TRANSACTION. As expected.
>>SPI_exec("SAVEPOINT xyz",...) returns error SPI_ERROR_TRANSACTION. Not
> expected.
The docs say that this is expected:
https://www.postgresql.org/docs/devel/static/spi-spi-execute.html
SPI_ERROR_TRANSACTION
if a transaction manipulation command was attempted (BEGIN, COMMIT,
ROLLBACK, SAVEPOINT, PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK
PREPARED, or any variant thereof)
> Is it not possible to set a SAVEPOINT inside a function? Or am I missing
> something?
A function using a given procedural language is itself running a
transaction, so you cannot use DefineSavepoint directly. Have a look
at src/backend/access/transam/README, particularly Subtransaction
Handling", instead for more details regarding the routines that can be
used for sub-transaction handling in prodedural languages. What I
think you are looking for is BeginInternalSubTransaction(),
ReleaseCurrentSubTransaction() and
RollbackAndReleaseCurrentSubTransaction() to be able to handle
exceptions.
--
Michael
From | Date | Subject | |
---|---|---|---|
Next Message | dandl | 2016-05-25 05:46:39 | Re: SPI returns error for SAVEPOINT |
Previous Message | dandl | 2016-05-25 04:55:02 | SPI returns error for SAVEPOINT |