1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-14 18:42:34 +03:00

Patch to LOCK multiple tables in one LOCK command.

Neil Padgett
This commit is contained in:
Bruce Momjian
2001-08-10 14:30:15 +00:00
parent 49eb4f47c7
commit 77a69a2ed1
7 changed files with 53 additions and 34 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/lock.sgml,v 1.26 2001/08/04 22:01:38 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/lock.sgml,v 1.27 2001/08/10 14:30:14 momjian Exp $
Postgres documentation Postgres documentation
--> -->
@ -15,7 +15,7 @@ Postgres documentation
LOCK LOCK
</refname> </refname>
<refpurpose> <refpurpose>
Explicitly lock a table inside a transaction Explicitly lock a table / tables inside a transaction
</refpurpose> </refpurpose>
</refnamediv> </refnamediv>
<refsynopsisdiv> <refsynopsisdiv>
@ -23,8 +23,8 @@ Postgres documentation
<date>2001-07-09</date> <date>2001-07-09</date>
</refsynopsisdivinfo> </refsynopsisdivinfo>
<synopsis> <synopsis>
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> [, ...]
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN <replaceable class="PARAMETER">lockmode</replaceable> MODE LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> [, ...] IN <replaceable class="PARAMETER">lockmode</replaceable> MODE
where <replaceable class="PARAMETER">lockmode</replaceable> is one of: where <replaceable class="PARAMETER">lockmode</replaceable> is one of:
@ -373,6 +373,7 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
An example for this rule was given previously when discussing the An example for this rule was given previously when discussing the
use of SHARE ROW EXCLUSIVE mode rather than SHARE mode. use of SHARE ROW EXCLUSIVE mode rather than SHARE mode.
</para> </para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
@ -383,6 +384,12 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
</para> </para>
</note> </note>
<para>
When locking multiple tables, the command LOCK a, b; is equivalent to LOCK
a; LOCK b;. The tables are locked one-by-one in the order specified in the
<command>LOCK</command> command.
</para>
<refsect2 id="R2-SQL-LOCK-3"> <refsect2 id="R2-SQL-LOCK-3">
<refsect2info> <refsect2info>
<date>1999-06-08</date> <date>1999-06-08</date>
@ -406,6 +413,7 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
<para> <para>
<command>LOCK</command> works only inside transactions. <command>LOCK</command> works only inside transactions.
</para> </para>
</refsect2> </refsect2>
</refsect1> </refsect1>

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.138 2001/08/04 22:01:38 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.139 2001/08/10 14:30:14 momjian Exp $
* *
* NOTES * NOTES
* The PerformAddAttribute() code, like most of the relation * The PerformAddAttribute() code, like most of the relation
@ -1985,7 +1985,6 @@ needs_toast_table(Relation rel)
return (tuple_length > TOAST_TUPLE_THRESHOLD); return (tuple_length > TOAST_TUPLE_THRESHOLD);
} }
/* /*
* *
* LOCK TABLE * LOCK TABLE
@ -1994,18 +1993,29 @@ needs_toast_table(Relation rel)
void void
LockTableCommand(LockStmt *lockstmt) LockTableCommand(LockStmt *lockstmt)
{ {
List *p;
Relation rel; Relation rel;
/* Iterate over the list and open, lock, and close the relations
one at a time
*/
foreach(p, lockstmt->rellist)
{
char* relname = strVal(lfirst(p));
int aclresult; int aclresult;
rel = heap_openr(lockstmt->relname, NoLock); rel = heap_openr(relname, NoLock);
if (rel->rd_rel->relkind != RELKIND_RELATION) if (rel->rd_rel->relkind != RELKIND_RELATION)
elog(ERROR, "LOCK TABLE: %s is not a table", lockstmt->relname); elog(ERROR, "LOCK TABLE: %s is not a table",
relname);
if (lockstmt->mode == AccessShareLock) if (lockstmt->mode == AccessShareLock)
aclresult = pg_aclcheck(lockstmt->relname, GetUserId(), ACL_SELECT); aclresult = pg_aclcheck(relname, GetUserId(),
ACL_SELECT);
else else
aclresult = pg_aclcheck(lockstmt->relname, GetUserId(), aclresult = pg_aclcheck(relname, GetUserId(),
ACL_UPDATE | ACL_DELETE); ACL_UPDATE | ACL_DELETE);
if (aclresult != ACLCHECK_OK) if (aclresult != ACLCHECK_OK)
@ -2015,6 +2025,7 @@ LockTableCommand(LockStmt *lockstmt)
heap_close(rel, NoLock); /* close rel, keep lock */ heap_close(rel, NoLock); /* close rel, keep lock */
} }
}
static bool static bool

View File

@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.150 2001/08/04 22:01:38 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.151 2001/08/10 14:30:14 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2425,8 +2425,8 @@ _copyLockStmt(LockStmt *from)
{ {
LockStmt *newnode = makeNode(LockStmt); LockStmt *newnode = makeNode(LockStmt);
if (from->relname) Node_Copy(from, newnode, rellist);
newnode->relname = pstrdup(from->relname);
newnode->mode = from->mode; newnode->mode = from->mode;
return newnode; return newnode;

View File

@ -20,7 +20,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.98 2001/08/04 22:01:38 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.99 2001/08/10 14:30:14 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1283,7 +1283,7 @@ _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
static bool static bool
_equalLockStmt(LockStmt *a, LockStmt *b) _equalLockStmt(LockStmt *a, LockStmt *b)
{ {
if (!equalstr(a->relname, b->relname)) if (!equal(a->rellist, b->rellist))
return false; return false;
if (a->mode != b->mode) if (a->mode != b->mode)
return false; return false;

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.241 2001/08/06 05:42:48 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.242 2001/08/10 14:30:14 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -3281,11 +3281,11 @@ DeleteStmt: DELETE FROM relation_expr where_clause
} }
; ;
LockStmt: LOCK_P opt_table relation_name opt_lock LockStmt: LOCK_P opt_table relation_name_list opt_lock
{ {
LockStmt *n = makeNode(LockStmt); LockStmt *n = makeNode(LockStmt);
n->relname = $3; n->rellist = $3;
n->mode = $4; n->mode = $4;
$$ = (Node *)n; $$ = (Node *)n;
} }

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: parsenodes.h,v 1.138 2001/08/04 22:01:39 momjian Exp $ * $Id: parsenodes.h,v 1.139 2001/08/10 14:30:15 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -760,7 +760,7 @@ typedef struct VariableResetStmt
typedef struct LockStmt typedef struct LockStmt
{ {
NodeTag type; NodeTag type;
char *relname; /* relation to lock */ List *rellist; /* relations to lock */
int mode; /* lock mode */ int mode; /* lock mode */
} LockStmt; } LockStmt;

View File

@ -2421,7 +2421,7 @@ DeleteStmt: DELETE FROM relation_expr where_clause
} }
; ;
LockStmt: LOCK_P opt_table relation_name opt_lock LockStmt: LOCK_P opt_table relation_name_list opt_lock
{ {
$$ = cat_str(4, make_str("lock"), $2, $3, $4); $$ = cat_str(4, make_str("lock"), $2, $3, $4);
} }