diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index 39927be41e..53ecda3d2e 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -429,7 +429,8 @@ WITH ( MODULUS numeric_literal, REM Although most forms of ADD table_constraint require an ACCESS EXCLUSIVE lock, ADD - FOREIGN KEY requires only a SHARE ROW + CHECK and ADD + FOREIGN KEY require only a SHARE ROW EXCLUSIVE lock. Note that ADD FOREIGN KEY also acquires a SHARE ROW EXCLUSIVE lock on the referenced table, in addition to the lock on the table on which the diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 97cc9fd6ec..6e0ff5c08f 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -4233,6 +4233,15 @@ AlterTableGetLockLevel(List *cmds) */ cmd_lockmode = AccessExclusiveLock; break; + + case CONSTR_CHECK: + + /* + * We prevent other writers from accessing table. + */ + cmd_lockmode = ShareRowExclusiveLock; + break; + case CONSTR_FOREIGN: /* diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index f81bdf513b..8bf6e284bb 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -2729,6 +2729,15 @@ select * from my_locks order by 1; alterlock_pkey | AccessShareLock (4 rows) +rollback; +begin; +alter table alterlock2 add check (f1 > 0) not valid; +select * from my_locks order by 1; + relname | max_lockmode +------------+----------------------- + alterlock2 | ShareRowExclusiveLock +(1 row) + rollback; begin; alter table alterlock2 diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index dc0200adcb..a65c9a7465 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1744,6 +1744,11 @@ alter table alterlock2 add foreign key (f1) references alterlock (f1); select * from my_locks order by 1; rollback; +begin; +alter table alterlock2 add check (f1 > 0) not valid; +select * from my_locks order by 1; +rollback; + begin; alter table alterlock2 add constraint alterlock2nv foreign key (f1) references alterlock (f1) NOT VALID;