diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 1ef76d092859311abdc28afe7992e6783e25e72a..dabaea991096998c78d61653569c59c30546bd24 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1678,7 +1678,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* create target slot for UPDATE SET projection */ tupDesc = ExecTypeFromTL((List *) node->onConflictSet, - false); + resultRelInfo->ri_RelationDesc->rd_rel->relhasoids); mtstate->mt_conflproj = ExecInitExtraTupleSlot(mtstate->ps.state); ExecSetSlotDescriptor(mtstate->mt_conflproj, tupDesc); diff --git a/src/test/regress/expected/insert_conflict.out b/src/test/regress/expected/insert_conflict.out index 09b67db43c186ead376ee49c46007d251bc66129..1399f3c796224da54962189dc24d075e4a62e1ac 100644 --- a/src/test/regress/expected/insert_conflict.out +++ b/src/test/regress/expected/insert_conflict.out @@ -507,3 +507,62 @@ insert into excluded values(1, '2') on conflict (key) do update set data = 3 RET -- clean up drop table excluded; +-- Check tables w/o oids are handled correctly +create table testoids(key int primary key, data text) without oids; +-- first without oids +insert into testoids values(1, '1') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 1 | 1 +(1 row) + +insert into testoids values(1, '2') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 1 | 2 +(1 row) + +-- add oids +alter table testoids set with oids; +-- update existing row, that didn't have an oid +insert into testoids values(1, '3') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 1 | 3 +(1 row) + +-- insert a new row +insert into testoids values(2, '1') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 2 | 1 +(1 row) + +-- and update it +insert into testoids values(2, '2') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 2 | 2 +(1 row) + +-- remove oids again, test +alter table testoids set without oids; +insert into testoids values(1, '4') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 1 | 4 +(1 row) + +insert into testoids values(3, '1') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 3 | 1 +(1 row) + +insert into testoids values(3, '2') on conflict (key) do update set data = excluded.data RETURNING *; + key | data +-----+------ + 3 | 2 +(1 row) + +DROP TABLE testoids; diff --git a/src/test/regress/sql/insert_conflict.sql b/src/test/regress/sql/insert_conflict.sql index e981e67fd27b922a572b04ed238e279918048799..efa902ec121c5483a417a020c7717ff865b5ac75 100644 --- a/src/test/regress/sql/insert_conflict.sql +++ b/src/test/regress/sql/insert_conflict.sql @@ -295,3 +295,25 @@ insert into excluded values(1, '2') on conflict (key) do update set data = 3 RET -- clean up drop table excluded; + + +-- Check tables w/o oids are handled correctly +create table testoids(key int primary key, data text) without oids; +-- first without oids +insert into testoids values(1, '1') on conflict (key) do update set data = excluded.data RETURNING *; +insert into testoids values(1, '2') on conflict (key) do update set data = excluded.data RETURNING *; +-- add oids +alter table testoids set with oids; +-- update existing row, that didn't have an oid +insert into testoids values(1, '3') on conflict (key) do update set data = excluded.data RETURNING *; +-- insert a new row +insert into testoids values(2, '1') on conflict (key) do update set data = excluded.data RETURNING *; +-- and update it +insert into testoids values(2, '2') on conflict (key) do update set data = excluded.data RETURNING *; +-- remove oids again, test +alter table testoids set without oids; +insert into testoids values(1, '4') on conflict (key) do update set data = excluded.data RETURNING *; +insert into testoids values(3, '1') on conflict (key) do update set data = excluded.data RETURNING *; +insert into testoids values(3, '2') on conflict (key) do update set data = excluded.data RETURNING *; + +DROP TABLE testoids;