Thread: PG_TRY(), PG_CATCH()....

PG_TRY(), PG_CATCH()....

From
Alex Vinogradovs
Date:
Guys,


I've got a C-implemented function which performs number
of SPI_exec()'s in a loop, where each of them may fail,
thus I wrapped them into the PG_TRY()/PG_CATCH() inside
the loop. Something like this :

for(i = 0; i < query_count; i++) {

  PG_TRY();
  {

    SPI_exec(query[i], 1);

  }

  PG_CATCH();
  {

    FlushErrorState();

  }
  PG_END_TRY();

}

Which works fine with successful queries, but for each
unsuccessful query it complains about reference leaks
and not properly closed relations.
 Later on I've solved that with use of subtransactions, which
provide some proper cleanup mechanisms, but I was wondering
if it is possible to bypass that layer, and make the code
above work fine just by doing some cleanup within the catch
block.

Thanks!


Best regards,
Alex Vinogradovs

Re: PG_TRY(), PG_CATCH()....

From
Alvaro Herrera
Date:
Alex Vinogradovs wrote:

> Which works fine with successful queries, but for each
> unsuccessful query it complains about reference leaks
> and not properly closed relations.
>  Later on I've solved that with use of subtransactions, which
> provide some proper cleanup mechanisms, but I was wondering
> if it is possible to bypass that layer, and make the code
> above work fine just by doing some cleanup within the catch
> block.

The only code that knows how to cleanup completely after transaction
failure is the subtransaction code.  If you need to do something that
may cause a transaction abort, then you must use subtransactions.

(You could of course write "your own layer" but it would duplicate
subtransaction start/abort so there wouldn't be any point.)

It's expensive, yes, but there are good reasons for that.  If you are
worried about that, I'm sure there are optimizations possible.

--
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Re: PG_TRY(), PG_CATCH()....

From
Alex Vinogradovs
Date:
No, I'm not worried about them failing. My code isn't transactional...
I'm just worried about getting whole bunch of warnings about reference
leaks.


On Tue, 2007-10-09 at 09:59 -0400, Alvaro Herrera wrote:

> The only code that knows how to cleanup completely after transaction
> failure is the subtransaction code.  If you need to do something that
> may cause a transaction abort, then you must use subtransactions.
>
> (You could of course write "your own layer" but it would duplicate
> subtransaction start/abort so there wouldn't be any point.)
>
> It's expensive, yes, but there are good reasons for that.  If you are
> worried about that, I'm sure there are optimizations possible.
>