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;