<refnamediv>
   <refname>LOCK</refname>
-  <refpurpose>lock a table</refpurpose>
+  <refpurpose>lock a named relation (table, etc)</refpurpose>
  </refnamediv>
 
  <refsynopsisdiv>
   <title>Description</title>
 
   <para>
-   <command>LOCK TABLE</command> obtains a table-level lock, waiting
+   <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
    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
     <term><replaceable class="parameter">name</replaceable></term>
     <listitem>
      <para>
-      The name (optionally schema-qualified) of an existing table to
-      lock. If <literal>ONLY</literal> is specified before the table name, only that
+      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>
       can be specified after the table name to explicitly indicate that
-      descendant tables are included.
+      descendant tables are included.  When locking a view, all relations appearing
+      in the view definition are locked, regardless of <literal>ONLY</literal>.
      </para>
 
      <para>
       The command <literal>LOCK TABLE a, b;</literal> is equivalent to
-      <literal>LOCK TABLE a; LOCK TABLE b;</literal>. The tables are locked
+      <literal>LOCK TABLE a; LOCK TABLE b;</literal>. The relations are locked
       one-by-one in the order specified in the <command>LOCK
       TABLE</command> command.
      </para>
 
        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 a view",
-                       rv->relname)));
-
    /*
     * Make note if a temporary relation has been accessed in this
     * transaction.
        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
                (!strcmp(rte->eref->aliasname, "old") || !strcmp(rte->eref->aliasname, "new")))
                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,
            /* 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)
                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, context->viewowner);
 
 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;
 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;
 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
 
 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;
 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;
 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;