[Terminal 1] postgres=# create table t (a int, b int); CREATE TABLE postgres=# insert into t values (1, 1); INSERT 0 1 postgres=# begin; BEGIN postgres=# update t set b = b * 2; UPDATE 1
[Terminal 2] postgres=# create foreign table ft (a int) server loopback options (table_name 'lbt');
There isn't any table "lbt" mentioned here. Do you mean "t" here?
CREATE FOREIGN TABLE postgres=# insert into ft values (1); INSERT 0 1 postgres=# select tableoid, ctid, * from ft; tableoid | ctid | a ----------+-------+--- 25092 | (0,1) | 1 (1 row)
Shouldn't we see two values here one inserted in 't' and one in "ft"
postgres=# select ft.tableoid, ft.ctid, ft.* from t, ft where t.a = ft.a for update;
[Terminal 1] postgres=# commit; COMMIT
[Terminal 2] postgres=# select ft.tableoid, ft.ctid, ft.* from t, ft where t.a = ft.a for update; tableoid | ctid | a ----------+----------------+--- 0 | (4294967295,0) | 1 (1 row)
Instead of this result, I got following error ERROR: could not serialize access due to concurrent update CONTEXT: Remote SQL command: SELECT a, ctid FROM public.t FOR UPDATE
Am I missing something while reproducing the problem?
Note that tableoid and ctid have been changed!
I think the reason for that is because EvalPlanQualFetchRowMarks doesn't properly set tableoid and ctid for foreign tables, IIUC. I think this should be fixed. Please find attached a patch. The patch slightly relates to [1], so if it is reasonable, I'll update [1] on top of this.