mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
ATPrepAddPrimaryKey: ignore non-PK constraints
Because of lack of test coverage, this function added by b0e96f311985 wasn't ignoring constraint types other than primary keys, which it should have. Add some lines to a test for it. Reported-by: Richard Guo <guofenglinux@gmail.com> Discussion: https://postgr.es/m/CAMbWs48bc-k_-1fh0dZpAhp_LiR5MfEX9haystmoBboR_4czCQ@mail.gmail.com
This commit is contained in:
parent
e8d74ad625
commit
e09d763e25
@ -8907,7 +8907,14 @@ ATPrepAddPrimaryKey(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
|||||||
List *children;
|
List *children;
|
||||||
List *newconstrs = NIL;
|
List *newconstrs = NIL;
|
||||||
ListCell *lc;
|
ListCell *lc;
|
||||||
IndexStmt *stmt;
|
IndexStmt *indexstmt;
|
||||||
|
|
||||||
|
/* No work if not creating a primary key */
|
||||||
|
if (!IsA(cmd->def, IndexStmt))
|
||||||
|
return;
|
||||||
|
indexstmt = castNode(IndexStmt, cmd->def);
|
||||||
|
if (!indexstmt->primary)
|
||||||
|
return;
|
||||||
|
|
||||||
/* No work if no legacy inheritance children are present */
|
/* No work if no legacy inheritance children are present */
|
||||||
if (rel->rd_rel->relkind != RELKIND_RELATION ||
|
if (rel->rd_rel->relkind != RELKIND_RELATION ||
|
||||||
@ -8916,8 +8923,7 @@ ATPrepAddPrimaryKey(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
|||||||
|
|
||||||
children = find_inheritance_children(RelationGetRelid(rel), lockmode);
|
children = find_inheritance_children(RelationGetRelid(rel), lockmode);
|
||||||
|
|
||||||
stmt = castNode(IndexStmt, cmd->def);
|
foreach(lc, indexstmt->indexParams)
|
||||||
foreach(lc, stmt->indexParams)
|
|
||||||
{
|
{
|
||||||
IndexElem *elem = lfirst_node(IndexElem, lc);
|
IndexElem *elem = lfirst_node(IndexElem, lc);
|
||||||
Constraint *nnconstr;
|
Constraint *nnconstr;
|
||||||
|
@ -2309,7 +2309,30 @@ alter table inh_child inherit inh_parent; -- nope
|
|||||||
ERROR: column "a" in child table must be marked NOT NULL
|
ERROR: column "a" in child table must be marked NOT NULL
|
||||||
alter table inh_child alter a set not null;
|
alter table inh_child alter a set not null;
|
||||||
alter table inh_child inherit inh_parent; -- now it works
|
alter table inh_child inherit inh_parent; -- now it works
|
||||||
drop table inh_parent, inh_child;
|
-- don't interfere with other types of constraints
|
||||||
|
alter table inh_parent add constraint inh_parent_excl exclude ((1) with =);
|
||||||
|
alter table inh_parent add constraint inh_parent_uq unique (a);
|
||||||
|
alter table inh_parent add constraint inh_parent_fk foreign key (a) references inh_parent (a);
|
||||||
|
create table inh_child2 () inherits (inh_parent);
|
||||||
|
create table inh_child3 (like inh_parent);
|
||||||
|
alter table inh_child3 inherit inh_parent;
|
||||||
|
select conrelid::regclass, conname, contype, coninhcount, conislocal
|
||||||
|
from pg_constraint
|
||||||
|
where conrelid::regclass::text in ('inh_parent', 'inh_child', 'inh_child2', 'inh_child3')
|
||||||
|
order by 2, 1;
|
||||||
|
conrelid | conname | contype | coninhcount | conislocal
|
||||||
|
------------+-----------------------+---------+-------------+------------
|
||||||
|
inh_child2 | inh_child2_a_not_null | n | 1 | f
|
||||||
|
inh_child3 | inh_child3_a_not_null | n | 1 | t
|
||||||
|
inh_child | inh_child_a_not_null | n | 1 | t
|
||||||
|
inh_child | inh_child_pkey | p | 0 | t
|
||||||
|
inh_parent | inh_parent_excl | x | 0 | t
|
||||||
|
inh_parent | inh_parent_fk | f | 0 | t
|
||||||
|
inh_parent | inh_parent_pkey | p | 0 | t
|
||||||
|
inh_parent | inh_parent_uq | u | 0 | t
|
||||||
|
(8 rows)
|
||||||
|
|
||||||
|
drop table inh_parent, inh_child, inh_child2, inh_child3;
|
||||||
--
|
--
|
||||||
-- test multi inheritance tree
|
-- test multi inheritance tree
|
||||||
--
|
--
|
||||||
|
@ -846,7 +846,20 @@ create table inh_child (a int primary key);
|
|||||||
alter table inh_child inherit inh_parent; -- nope
|
alter table inh_child inherit inh_parent; -- nope
|
||||||
alter table inh_child alter a set not null;
|
alter table inh_child alter a set not null;
|
||||||
alter table inh_child inherit inh_parent; -- now it works
|
alter table inh_child inherit inh_parent; -- now it works
|
||||||
drop table inh_parent, inh_child;
|
|
||||||
|
-- don't interfere with other types of constraints
|
||||||
|
alter table inh_parent add constraint inh_parent_excl exclude ((1) with =);
|
||||||
|
alter table inh_parent add constraint inh_parent_uq unique (a);
|
||||||
|
alter table inh_parent add constraint inh_parent_fk foreign key (a) references inh_parent (a);
|
||||||
|
create table inh_child2 () inherits (inh_parent);
|
||||||
|
create table inh_child3 (like inh_parent);
|
||||||
|
alter table inh_child3 inherit inh_parent;
|
||||||
|
select conrelid::regclass, conname, contype, coninhcount, conislocal
|
||||||
|
from pg_constraint
|
||||||
|
where conrelid::regclass::text in ('inh_parent', 'inh_child', 'inh_child2', 'inh_child3')
|
||||||
|
order by 2, 1;
|
||||||
|
|
||||||
|
drop table inh_parent, inh_child, inh_child2, inh_child3;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- test multi inheritance tree
|
-- test multi inheritance tree
|
||||||
|
Loading…
x
Reference in New Issue
Block a user