with hold cursor, cause function execute twice and wrong result
От | wcting163 |
---|---|
Тема | with hold cursor, cause function execute twice and wrong result |
Дата | |
Msg-id | 684bfc49.10560.134826dcb72.Coremail.wcting163@163.com обсуждение исходный текст |
Ответы |
Re: with hold cursor, cause function execute twice and wrong result
|
Список | pgsql-bugs |
postgres=# select version(); version ------------------------------------------------------------------------------------------------------------------------ --- PostgreSQL 9.0alpha5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Asianux 3.0 4.1.2-44), 64-b it create table test_execute(id int,name varchar(40)); insert into test_execute values(1,'jack'); create or replace function p_test_execute() returns void as $$ begin raise notice 'hello world'; update test_execute set id=id*2; end; $$ LANGUAGE plpgsql; begin; declare JDBC_CURS_1 cursor with hold for select p_test_execute() from test_execute; fetch 50 from JDBC_CURS_1; NOTICE: hello world end; NOTICE: hello world COMMIT select * from test_execute; id | name ----+------ 4 | jack I expect id = 2, but it is **4** instead, The reason is that the function p_test_execute is executed twice, when *fetch*, it is first executed, and when transactioncommit, because the cursor is a *holdable* cursor, it is executed again. I read the code, for holdable cursor, when commit, following call will execute: CommitHoldablePortals-->PersistHoldablePortal-->ExecutorRewind. Is *ExecutorRewind* necessary, is it the root of this bug? Does *ExecutorRewind* cause plan re-execute?
В списке pgsql-bugs по дате отправления: