mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Allow ON CONFLICT .. DO NOTHING on a partitioned table.
ON CONFLICT .. DO UPDATE still doesn't work, for lack of a way of enforcing uniqueness across partitions, but we can still allow this case. Amit Langote, per discussion with Peter Geoghegan. Additional wordsmithing by me. Discussion: http://postgr.es/m/CAA-aLv7Z4uygtq-Q5CvDi9Y=VZxUyEnuWjL=EwCfOof=L04hgg@mail.gmail.com
This commit is contained in:
parent
3371e4d9b1
commit
8355a011a0
@ -3854,8 +3854,12 @@ ANALYZE measurement;
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<command>INSERT</command> statements with <literal>ON CONFLICT</>
|
||||
clause are currently not allowed on partitioned tables.
|
||||
Using the <literal>ON CONFLICT</literal> clause with partitioned tables
|
||||
will cause an error if <literal>DO UPDATE</literal> is specified as the
|
||||
alternative action, because unique or exclusion constraints can only be
|
||||
created on individual partitions. There is no support for enforcing
|
||||
uniqueness (or an exclusion constraint) across an entire partitioning
|
||||
hierarchy.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
|
@ -842,16 +842,8 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
|
||||
|
||||
/* Process ON CONFLICT, if any. */
|
||||
if (stmt->onConflictClause)
|
||||
{
|
||||
/* Bail out if target relation is partitioned table */
|
||||
if (pstate->p_target_rangetblentry->relkind == RELKIND_PARTITIONED_TABLE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("ON CONFLICT clause is not supported with partitioned tables")));
|
||||
|
||||
qry->onConflict = transformOnConflictClause(pstate,
|
||||
stmt->onConflictClause);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have a RETURNING clause, we need to add the target relation to
|
||||
|
@ -786,3 +786,13 @@ select * from selfconflict;
|
||||
(3 rows)
|
||||
|
||||
drop table selfconflict;
|
||||
-- check that the following works:
|
||||
-- insert into partitioned_table on conflict do nothing
|
||||
create table parted_conflict_test (a int, b char) partition by list (a);
|
||||
create table parted_conflict_test_1 partition of parted_conflict_test for values in (1);
|
||||
insert into parted_conflict_test values (1, 'a') on conflict do nothing;
|
||||
insert into parted_conflict_test values (1, 'a') on conflict do nothing;
|
||||
-- however, on conflict do update not supported yet
|
||||
insert into parted_conflict_test values (1) on conflict (a) do update set b = excluded.b where excluded.a = 1;
|
||||
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
|
||||
drop table parted_conflict_test, parted_conflict_test_1;
|
||||
|
@ -471,3 +471,13 @@ commit;
|
||||
select * from selfconflict;
|
||||
|
||||
drop table selfconflict;
|
||||
|
||||
-- check that the following works:
|
||||
-- insert into partitioned_table on conflict do nothing
|
||||
create table parted_conflict_test (a int, b char) partition by list (a);
|
||||
create table parted_conflict_test_1 partition of parted_conflict_test for values in (1);
|
||||
insert into parted_conflict_test values (1, 'a') on conflict do nothing;
|
||||
insert into parted_conflict_test values (1, 'a') on conflict do nothing;
|
||||
-- however, on conflict do update not supported yet
|
||||
insert into parted_conflict_test values (1) on conflict (a) do update set b = excluded.b where excluded.a = 1;
|
||||
drop table parted_conflict_test, parted_conflict_test_1;
|
||||
|
Loading…
Reference in New Issue
Block a user