aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/ref/lock.sgml24
-rw-r--r--src/backend/commands/lockcmds.c7
-rw-r--r--src/test/regress/expected/lock.out16
-rw-r--r--src/test/regress/sql/lock.sql17
4 files changed, 20 insertions, 44 deletions
diff --git a/doc/src/sgml/ref/lock.sgml b/doc/src/sgml/ref/lock.sgml
index 9b33ddc637c..b946eab3039 100644
--- a/doc/src/sgml/ref/lock.sgml
+++ b/doc/src/sgml/ref/lock.sgml
@@ -16,7 +16,7 @@ PostgreSQL documentation
<refnamediv>
<refname>LOCK</refname>
- <refpurpose>lock a named relation (table, etc)</refpurpose>
+ <refpurpose>lock a table</refpurpose>
</refnamediv>
<refsynopsisdiv>
@@ -34,9 +34,7 @@ LOCK [ TABLE ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ]
<title>Description</title>
<para>
- <command>LOCK TABLE</command> obtains a table-level lock on a
- relation (table, partitioned table, foreign table, view,
- materialized view, index, composite type, sequence), waiting
+ <command>LOCK TABLE</command> obtains a table-level lock, waiting
if necessary for any conflicting locks to be released. If
<literal>NOWAIT</literal> is specified, <command>LOCK
TABLE</command> does not wait to acquire the desired lock: if it
@@ -112,23 +110,17 @@ LOCK [ TABLE ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ]
<term><replaceable class="PARAMETER">name</replaceable></term>
<listitem>
<para>
- The name (optionally schema-qualified) of an existing relation to
- lock. If <literal>ONLY</literal> is specified before a table name, only that
- table is locked. If <literal>ONLY</literal> is not specified, the table and all
- its descendant tables (if any) are locked. Optionally, <literal>*</literal>
+ The name (optionally schema-qualified) of an existing table to
+ lock. If <literal>ONLY</> is specified before the table name, only that
+ table is locked. If <literal>ONLY</> is not specified, the table and all
+ its descendant tables (if any) are locked. Optionally, <literal>*</>
can be specified after the table name to explicitly indicate that
descendant tables are included.
</para>
<para>
- Locking a view locks only the view object itself, not any referenced
- relations. (Note that this behavior is different
- in <productname>PostgreSQL</productname> v11 and later.)
- </para>
-
- <para>
- The command <literal>LOCK TABLE a, b;</literal> is equivalent to
- <literal>LOCK TABLE a; LOCK TABLE b;</literal>. The relations are locked
+ The command <literal>LOCK TABLE a, b;</> is equivalent to
+ <literal>LOCK TABLE a; LOCK TABLE b;</>. The tables are locked
one-by-one in the order specified in the <command>LOCK
TABLE</command> command.
</para>
diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c
index d48a15984f3..bb7d9e8239e 100644
--- a/src/backend/commands/lockcmds.c
+++ b/src/backend/commands/lockcmds.c
@@ -88,6 +88,13 @@ RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid,
return; /* woops, concurrently dropped; no permissions
* check */
+ /* Currently, we only allow plain tables to be locked */
+ if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s\" is not a table",
+ rv->relname)));
+
/*
* Make note if a temporary relation has been accessed in this
* transaction.
diff --git a/src/test/regress/expected/lock.out b/src/test/regress/expected/lock.out
index fec1c379833..fd273445030 100644
--- a/src/test/regress/expected/lock.out
+++ b/src/test/regress/expected/lock.out
@@ -5,10 +5,7 @@
CREATE SCHEMA lock_schema1;
SET search_path = lock_schema1;
CREATE TABLE lock_tbl1 (a BIGINT);
-CREATE VIEW lock_view1 AS SELECT 1 AS a;
-CREATE MATERIALIZED VIEW lock_mv1 AS SELECT * FROM lock_view1;
-CREATE INDEX lock_mvi1 ON lock_mv1 (a);
-CREATE SEQUENCE lock_seq;
+CREATE VIEW lock_view1 AS SELECT 1;
CREATE ROLE regress_rol_lock1;
ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
@@ -33,7 +30,8 @@ LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
-LOCK TABLE lock_view1 IN EXCLUSIVE MODE;
+LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table
+ERROR: "lock_view1" is not a table
ROLLBACK;
-- Verify that we can lock a table with inheritance children.
CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1);
@@ -53,21 +51,13 @@ BEGIN;
LOCK TABLE ONLY lock_tbl1;
ROLLBACK;
RESET ROLE;
--- Lock other relations
-BEGIN TRANSACTION;
-LOCK TABLE lock_mv1;
-LOCK TABLE lock_mvi1;
-LOCK TABLE lock_seq;
-ROLLBACK;
--
-- Clean up
--
-DROP MATERIALIZED VIEW lock_mv1;
DROP VIEW lock_view1;
DROP TABLE lock_tbl3;
DROP TABLE lock_tbl2;
DROP TABLE lock_tbl1;
-DROP SEQUENCE lock_seq;
DROP SCHEMA lock_schema1 CASCADE;
DROP ROLE regress_rol_lock1;
-- atomic ops tests
diff --git a/src/test/regress/sql/lock.sql b/src/test/regress/sql/lock.sql
index 81af5d08fc8..567e8bccf1b 100644
--- a/src/test/regress/sql/lock.sql
+++ b/src/test/regress/sql/lock.sql
@@ -6,10 +6,7 @@
CREATE SCHEMA lock_schema1;
SET search_path = lock_schema1;
CREATE TABLE lock_tbl1 (a BIGINT);
-CREATE VIEW lock_view1 AS SELECT 1 AS a;
-CREATE MATERIALIZED VIEW lock_mv1 AS SELECT * FROM lock_view1;
-CREATE INDEX lock_mvi1 ON lock_mv1 (a);
-CREATE SEQUENCE lock_seq;
+CREATE VIEW lock_view1 AS SELECT 1;
CREATE ROLE regress_rol_lock1;
ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
@@ -36,7 +33,7 @@ LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
-LOCK TABLE lock_view1 IN EXCLUSIVE MODE;
+LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table
ROLLBACK;
-- Verify that we can lock a table with inheritance children.
@@ -58,23 +55,13 @@ LOCK TABLE ONLY lock_tbl1;
ROLLBACK;
RESET ROLE;
--- Lock other relations
-BEGIN TRANSACTION;
-LOCK TABLE lock_mv1;
-LOCK TABLE lock_mvi1;
-LOCK TABLE lock_seq;
-ROLLBACK;
-
-
--
-- Clean up
--
-DROP MATERIALIZED VIEW lock_mv1;
DROP VIEW lock_view1;
DROP TABLE lock_tbl3;
DROP TABLE lock_tbl2;
DROP TABLE lock_tbl1;
-DROP SEQUENCE lock_seq;
DROP SCHEMA lock_schema1 CASCADE;
DROP ROLE regress_rol_lock1;