Re: "A transaction cannot be ended inside a block with exception handlers."

Поиск
Список
Период
Сортировка
От David G. Johnston
Тема Re: "A transaction cannot be ended inside a block with exception handlers."
Дата
Msg-id CAKFQuwYPOAZPs9Kzsm-EBn-DBC3Ep-6LRkkQLJj+k9-GQRgXvw@mail.gmail.com
обсуждение исходный текст
Ответ на Re: "A transaction cannot be ended inside a block with exception handlers."  (Bryn Llewellyn <bryn@yugabyte.com>)
Ответы Re: "A transaction cannot be ended inside a block with exception handlers."  (Bryn Llewellyn <bryn@yugabyte.com>)
Список pgsql-general
I do understand better now and indeed the current limitation has no workaround that I can come up with.  I was hoping maybe subblocks would work but its pretty clear cut that to catch an error at the commit command you must catch it within a block and the commit error will be raised first.

On Fri, May 6, 2022 at 9:23 PM Bryn Llewellyn <bryn@yugabyte.com> wrote:

I'll take this to mean that there is no plan for PG ever to allow txn control in a PL/pgSQL block that has an exception handler. Please tell me if I misunderstood.

You misunderstand how the development of PostgreSQL works generally.  But, I suppose as a practical matter if you aren't going to spearhead the change you might as well assume it will not be possible until it is.
 
Is there really no sympathy for what I want to achieve?

I personally have sympathy, and if you submitted a patch to improve matters here I don't see anyone saying that it would be unwanted.
As for the circular dependency breaking use of deferred constraints (or your explicitly deferred triggers), you have the SET CONSTRAINTS ALL IMMEDIATE command:

postgres=# call do_insert(false);
ERROR:  tigger trg caused exception
CONTEXT:  PL/pgSQL function trg_fn() line 9 at ASSERT
SQL statement "SET CONSTRAINTS ALL IMMEDIATE"
PL/pgSQL function do_insert(boolean) line 12 at SQL statement
postgres=# create or replace procedure do_insert(good in boolean)
  language plpgsql
as $body$
begin
begin
  case good
    when true then
      for j in 10..20 loop
        insert into t(k) values(j);
      end loop;
    when false then
      insert into t(k) values(42);
  end case;
SET CONSTRAINTS ALL IMMEDIATE;
commit;
end;
exception
when invalid_transaction_termination then
raise exception 'caught invalid';
when OTHERS then
raise notice 'others - ok';
commit;
end;

David J.

В списке pgsql-general по дате отправления:

Предыдущее
От: Bryn Llewellyn
Дата:
Сообщение: Re: "A transaction cannot be ended inside a block with exception handlers."
Следующее
От: Guillaume Lelarge
Дата:
Сообщение: Re: pg_dump: VACUUM and REINDEXING