aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/lockcmds.c28
-rw-r--r--src/test/regress/expected/lock.out11
-rw-r--r--src/test/regress/sql/lock.sql13
3 files changed, 33 insertions, 19 deletions
diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c
index d8cafc42bb5..f64246dba39 100644
--- a/src/backend/commands/lockcmds.c
+++ b/src/backend/commands/lockcmds.c
@@ -83,14 +83,6 @@ RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid,
return; /* woops, concurrently dropped; no permissions
* check */
- /* Currently, we only allow plain tables or views to be locked */
- if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE &&
- relkind != RELKIND_VIEW)
- ereport(ERROR,
- (errcode(ERRCODE_WRONG_OBJECT_TYPE),
- errmsg("\"%s\" is not a table or view",
- rv->relname)));
-
/*
* Make note if a temporary relation has been accessed in this
* transaction.
@@ -186,11 +178,13 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context)
foreach(rtable, query->rtable)
{
RangeTblEntry *rte = lfirst(rtable);
+ Oid relid;
AclResult aclresult;
- Oid relid = rte->relid;
- char relkind = rte->relkind;
- char *relname = get_rel_name(relid);
+ /* ignore all non-relation RTEs */
+ if (rte->rtekind != RTE_RELATION)
+ continue;
+ relid = rte->relid;
/*
* The OLD and NEW placeholder entries in the view's rtable are
@@ -201,11 +195,6 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context)
strcmp(rte->eref->aliasname, "new") == 0))
continue;
- /* Currently, we only allow plain tables or views to be locked. */
- if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE &&
- relkind != RELKIND_VIEW)
- continue;
-
/* Check infinite recursion in the view definition. */
if (list_member_oid(context->ancestor_views, relid))
ereport(ERROR,
@@ -216,7 +205,8 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context)
/* Check permissions with the view owner's privilege. */
aclresult = LockTableAclCheck(relid, context->lockmode, context->viewowner);
if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, get_relkind_objtype(relkind), relname);
+ aclcheck_error(aclresult, get_relkind_objtype(rte->relkind),
+ get_rel_name(relid));
/* We have enough rights to lock the relation; do so. */
if (!context->nowait)
@@ -225,9 +215,9 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context)
ereport(ERROR,
(errcode(ERRCODE_LOCK_NOT_AVAILABLE),
errmsg("could not obtain lock on relation \"%s\"",
- relname)));
+ get_rel_name(relid))));
- if (relkind == RELKIND_VIEW)
+ if (rte->relkind == RELKIND_VIEW)
LockViewRecurse(relid, context->lockmode, context->nowait, context->ancestor_views);
else if (rte->inh)
LockTableRecurse(relid, context->lockmode, context->nowait);
diff --git a/src/test/regress/expected/lock.out b/src/test/regress/expected/lock.out
index 2e54688dffe..1d6a4e9f1e0 100644
--- a/src/test/regress/expected/lock.out
+++ b/src/test/regress/expected/lock.out
@@ -12,6 +12,9 @@ CREATE VIEW lock_view3 AS SELECT * from lock_view2;
CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1;
CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a);
CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub;
+CREATE MATERIALIZED VIEW lock_mv1 AS SELECT * FROM lock_view6;
+CREATE INDEX lock_mvi1 ON lock_mv1 (a);
+CREATE SEQUENCE lock_seq;
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;
@@ -154,9 +157,16 @@ 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_view7;
DROP VIEW lock_view6;
DROP VIEW lock_view5;
@@ -168,6 +178,7 @@ DROP TABLE lock_tbl3;
DROP TABLE lock_tbl2;
DROP TABLE lock_tbl1;
DROP TABLE lock_tbl1a;
+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 e50cb6f0642..98d13fc8e1e 100644
--- a/src/test/regress/sql/lock.sql
+++ b/src/test/regress/sql/lock.sql
@@ -13,6 +13,9 @@ CREATE VIEW lock_view3 AS SELECT * from lock_view2;
CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1;
CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a);
CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub;
+CREATE MATERIALIZED VIEW lock_mv1 AS SELECT * FROM lock_view6;
+CREATE INDEX lock_mvi1 ON lock_mv1 (a);
+CREATE SEQUENCE lock_seq;
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;
@@ -117,9 +120,18 @@ 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_view7;
DROP VIEW lock_view6;
DROP VIEW lock_view5;
@@ -130,6 +142,7 @@ DROP TABLE lock_tbl3;
DROP TABLE lock_tbl2;
DROP TABLE lock_tbl1;
DROP TABLE lock_tbl1a;
+DROP SEQUENCE lock_seq;
DROP SCHEMA lock_schema1 CASCADE;
DROP ROLE regress_rol_lock1;