The following bug has been logged on the website: Bug reference: 6360 Logged by: ctwang Email address: wcting...@163.com PostgreSQL version: 9.0.5 Operating system: linux 2.6.18-128.7AXS3 Description:
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 transaction commit, 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? -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs