aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/nodeModifyTable.c2
-rw-r--r--src/test/regress/expected/insert_conflict.out59
-rw-r--r--src/test/regress/sql/insert_conflict.sql22
3 files changed, 82 insertions, 1 deletions
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 1ef76d09285..dabaea99109 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 09b67db43c1..1399f3c7962 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 e981e67fd27..efa902ec121 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;