Re: The statement is re-executed (performed twice) on commit if it isdeclared as "cursor with hold" and the cursor is not closed yet

Поиск
Список
Период
Сортировка
От Rashid Abzalov
Тема Re: The statement is re-executed (performed twice) on commit if it isdeclared as "cursor with hold" and the cursor is not closed yet
Дата
Msg-id CACrSCdE3YYABuVk2kGH+Vv6JL0fvbM6N_r=3h0eYM0MObo9OAQ@mail.gmail.com
обсуждение исходный текст
Ответ на The statement is re-executed (performed twice) on commit if it isdeclared as "cursor with hold" and the cursor is not closed yet  (Rashid Abzalov <rashid.abzalov@gmail.com>)
Список pgsql-bugs
The bug is not reproduced if declare the cursor query as
  select * from do_test()

declare exec_cur binary no scroll cursor with hold for select * from do_test();

пт, 12 июл. 2019 г. в 22:18, Rashid Abzalov <rashid.abzalov@gmail.com>:
The statement is re-executed on commit if it is declared as "cursor with hold" and the cursor is not closed yet.

Tested on 11.2 and 9.6.12.

1) DDL:
create table test(id numeric);
create or replace function do_test() returns void
as $$
begin
  raise notice 'test executed!';
  insert into test(id) values(1);
end;
$$ LANGUAGE plpgsql VOLATILE security definer

DML statements below are executed with autocommit = off (for example in PgAdmin3)

2) DML (cursor is closed after commit):

begin

declare exec_cur binary no scroll cursor with hold for select do_test()

fetch forward 1 from exec_cur

--close exec_cur

commit

close exec_cur

select count(*) from test
---
2


3) DML (cursor is closed before commit):

begin

declare exec_cur binary no scroll cursor with hold for
  select do_test()

fetch forward 1 from exec_cur

close exec_cur

commit

--close exec_cur

select count(*) from test
---
1

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

Предыдущее
От: Rashid Abzalov
Дата:
Сообщение: The statement is re-executed (performed twice) on commit if it isdeclared as "cursor with hold" and the cursor is not closed yet
Следующее
От: Tom Lane
Дата:
Сообщение: Re: ERROR: found unexpected null value in index