Now I can reproduce the problem. Sanity -------- Patch compiles cleanly and make check passes. The tests in file_fdw and postgres_fdw contrib modules pass.
The patch works as expected in the test case reported. I have only one doubt. In EvalPlanQualFetchRowMarks(). tuple->t_self is assigned from td->t_ctid. CTID or even t_self may be valid for foreign tables based on postgres_fdw but may not be valid for other FDWs. So, this assignment might put some garbage in t_self, rather we should set it to invalid as done prior to the patch. I might have missed some previous thread, we decided to go this route, so ignore the comment, in that case. Apart from this, I do not have any comments here. On Mon, Mar 9, 2015 at 4:05 PM, Etsuro Fujita <fujita.ets...@lab.ntt.co.jp> wrote: > On 2015/03/09 16:02, Ashutosh Bapat wrote: > >> I tried reproducing the issue with the steps summarised. >> > > Thanks for the review! > > Here's my setup >> > > Sorry, my explanation was not enough, but such was not my intention. I'll > re-summarize the steps below: > > [Create a test environment] > > $ createdb mydatabase > $ psql mydatabase > mydatabase=# create table mytable (a int); > > $ psql postgres > postgres=# create extension postgres_fdw; > postgres=# create server loopback foreign data wrapper postgres_fdw > options (dbname 'mydatabase'); > postgres=# create user mapping for current_user server loopback; > postgres=# create foreign table ftable (a int) server loopback options > (table_name 'mytable'); > postgres=# insert into ftable values (1); > postgres=# create table ltable (a int, b int); > postgres=# insert into ltable values (1, 1); > > [Run concurrent transactions] > > In terminal1: > $ psql postgres > postgres=# begin; > BEGIN > postgres=# update ltable set b = b * 2; > UPDATE 1 > > In terminal2: > $ psql postgres > postgres=# select tableoid, ctid, * from ftable; > tableoid | ctid | a > ----------+-------+--- > 16394 | (0,1) | 1 > (1 row) > > postgres=# select f.tableoid, f.ctid, f.* from ftable f, ltable l where > f.a = l.a for update; > > In terminal1: > postgres=# commit; > COMMIT > > In terminal2:(When committing the UPDATE query in terminal1, psql in > terminal2 will display the result for the SELECT-FOR-UPDATE query as shown > below.) > tableoid | ctid | a > ----------+----------------+--- > 0 | (4294967295,0) | 1 > (1 row) > > Best regards, > Etsuro Fujita > -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company