mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Add NOWAIT option to LOCK command
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$PostgreSQL: pgsql/doc/src/sgml/ref/lock.sgml,v 1.40 2003/12/14 00:05:29 neilc Exp $
|
$PostgreSQL: pgsql/doc/src/sgml/ref/lock.sgml,v 1.41 2004/03/11 01:47:35 ishii Exp $
|
||||||
PostgreSQL documentation
|
PostgreSQL documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ PostgreSQL documentation
|
|||||||
|
|
||||||
<refsynopsisdiv>
|
<refsynopsisdiv>
|
||||||
<synopsis>
|
<synopsis>
|
||||||
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 ] [ NOWAIT ]
|
||||||
|
|
||||||
where <replaceable class="PARAMETER">lockmode</replaceable> is one of:
|
where <replaceable class="PARAMETER">lockmode</replaceable> is one of:
|
||||||
|
|
||||||
@ -34,8 +34,10 @@ where <replaceable class="PARAMETER">lockmode</replaceable> is one of:
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
<command>LOCK TABLE</command> obtains a table-level lock, waiting if
|
<command>LOCK TABLE</command> obtains a table-level lock, waiting if
|
||||||
necessary for any conflicting locks to be released. Once obtained,
|
necessary for any conflicting locks to be released.
|
||||||
the lock is held for the remainder of the current transaction.
|
If <literal>NOWAIT</literal> is given, <command>LOCK TABLE</command>
|
||||||
|
does not wait for acquiring lock, and throws an error instead.
|
||||||
|
Once obtained, the lock is held for the remainder of the current transaction.
|
||||||
(There is no <command>UNLOCK TABLE</command> command; locks are always
|
(There is no <command>UNLOCK TABLE</command> command; locks are always
|
||||||
released at transaction end.)
|
released at transaction end.)
|
||||||
</para>
|
</para>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.162 2004/01/16 20:51:30 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.163 2004/03/11 01:47:35 ishii Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
@ -464,6 +464,33 @@ relation_open(Oid relationId, LOCKMODE lockmode)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Relation
|
||||||
|
conditional_relation_open(Oid relationId, LOCKMODE lockmode, bool nowait)
|
||||||
|
{
|
||||||
|
Relation r;
|
||||||
|
|
||||||
|
Assert(lockmode >= NoLock && lockmode < MAX_LOCKMODES);
|
||||||
|
|
||||||
|
/* The relcache does all the real work... */
|
||||||
|
r = RelationIdGetRelation(relationId);
|
||||||
|
|
||||||
|
if (!RelationIsValid(r))
|
||||||
|
elog(ERROR, "could not open relation with OID %u", relationId);
|
||||||
|
|
||||||
|
if (lockmode != NoLock)
|
||||||
|
{
|
||||||
|
if (nowait)
|
||||||
|
{
|
||||||
|
if (!ConditionalLockRelation(r, lockmode))
|
||||||
|
elog(ERROR, "could not aquire relation lock");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LockRelation(r, lockmode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* relation_openrv - open any relation specified by a RangeVar
|
* relation_openrv - open any relation specified by a RangeVar
|
||||||
*
|
*
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/lockcmds.c,v 1.8 2003/11/29 19:51:47 pgsql Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/lockcmds.c,v 1.9 2004/03/11 01:47:35 ishii Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -59,7 +59,7 @@ LockTableCommand(LockStmt *lockstmt)
|
|||||||
aclcheck_error(aclresult, ACL_KIND_CLASS,
|
aclcheck_error(aclresult, ACL_KIND_CLASS,
|
||||||
get_rel_name(reloid));
|
get_rel_name(reloid));
|
||||||
|
|
||||||
rel = relation_open(reloid, lockstmt->mode);
|
rel = conditional_relation_open(reloid, lockstmt->mode, lockstmt->nowait);
|
||||||
|
|
||||||
/* Currently, we only allow plain tables to be locked */
|
/* Currently, we only allow plain tables to be locked */
|
||||||
if (rel->rd_rel->relkind != RELKIND_RELATION)
|
if (rel->rd_rel->relkind != RELKIND_RELATION)
|
||||||
|
@ -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
|
||||||
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.277 2004/01/14 23:01:54 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.278 2004/03/11 01:47:35 ishii Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2316,6 +2316,7 @@ _copyLockStmt(LockStmt *from)
|
|||||||
|
|
||||||
COPY_NODE_FIELD(relations);
|
COPY_NODE_FIELD(relations);
|
||||||
COPY_SCALAR_FIELD(mode);
|
COPY_SCALAR_FIELD(mode);
|
||||||
|
COPY_SCALAR_FIELD(nowait);
|
||||||
|
|
||||||
return newnode;
|
return newnode;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.215 2004/01/14 23:01:55 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.216 2004/03/11 01:47:35 ishii Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1252,6 +1252,7 @@ _equalLockStmt(LockStmt *a, LockStmt *b)
|
|||||||
{
|
{
|
||||||
COMPARE_NODE_FIELD(relations);
|
COMPARE_NODE_FIELD(relations);
|
||||||
COMPARE_SCALAR_FIELD(mode);
|
COMPARE_SCALAR_FIELD(mode);
|
||||||
|
COMPARE_SCALAR_FIELD(nowait);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.447 2004/03/09 05:05:41 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.448 2004/03/11 01:47:37 ishii Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -169,6 +169,7 @@ static void doNegateFloat(Value *v);
|
|||||||
%type <ival> opt_lock lock_type cast_context
|
%type <ival> opt_lock lock_type cast_context
|
||||||
%type <boolean> opt_force opt_or_replace transaction_access_mode
|
%type <boolean> opt_force opt_or_replace transaction_access_mode
|
||||||
opt_grant_grant_option opt_revoke_grant_option
|
opt_grant_grant_option opt_revoke_grant_option
|
||||||
|
opt_nowait
|
||||||
|
|
||||||
%type <boolean> like_including_defaults
|
%type <boolean> like_including_defaults
|
||||||
|
|
||||||
@ -375,7 +376,7 @@ static void doNegateFloat(Value *v);
|
|||||||
MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
|
MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
|
||||||
|
|
||||||
NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
|
NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
|
||||||
NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NULL_P
|
NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P
|
||||||
NULLIF NUMERIC
|
NULLIF NUMERIC
|
||||||
|
|
||||||
OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
|
OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
|
||||||
@ -4347,12 +4348,13 @@ DeleteStmt: DELETE_P FROM relation_expr where_clause
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
LockStmt: LOCK_P opt_table qualified_name_list opt_lock
|
LockStmt: LOCK_P opt_table qualified_name_list opt_lock opt_nowait
|
||||||
{
|
{
|
||||||
LockStmt *n = makeNode(LockStmt);
|
LockStmt *n = makeNode(LockStmt);
|
||||||
|
|
||||||
n->relations = $3;
|
n->relations = $3;
|
||||||
n->mode = $4;
|
n->mode = $4;
|
||||||
|
n->nowait = $5;
|
||||||
$$ = (Node *)n;
|
$$ = (Node *)n;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -4371,6 +4373,10 @@ lock_type: ACCESS SHARE { $$ = AccessShareLock; }
|
|||||||
| ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
|
| ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
opt_nowait: NOWAIT { $$ = TRUE; }
|
||||||
|
| /*EMPTY*/ { $$ = FALSE; }
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
@ -7683,6 +7689,7 @@ reserved_keyword:
|
|||||||
| LOCALTIMESTAMP
|
| LOCALTIMESTAMP
|
||||||
| NEW
|
| NEW
|
||||||
| NOT
|
| NOT
|
||||||
|
| NOWAIT
|
||||||
| NULL_P
|
| NULL_P
|
||||||
| OFF
|
| OFF
|
||||||
| OFFSET
|
| OFFSET
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.146 2004/03/09 05:05:41 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.147 2004/03/11 01:47:40 ishii Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -213,6 +213,7 @@ static const ScanKeyword ScanKeywords[] = {
|
|||||||
{"nothing", NOTHING},
|
{"nothing", NOTHING},
|
||||||
{"notify", NOTIFY},
|
{"notify", NOTIFY},
|
||||||
{"notnull", NOTNULL},
|
{"notnull", NOTNULL},
|
||||||
|
{"nowait", NOWAIT},
|
||||||
{"null", NULL_P},
|
{"null", NULL_P},
|
||||||
{"nullif", NULLIF},
|
{"nullif", NULLIF},
|
||||||
{"numeric", NUMERIC},
|
{"numeric", NUMERIC},
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.86 2003/11/29 22:40:55 pgsql Exp $
|
* $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.87 2004/03/11 01:47:41 ishii Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -129,6 +129,7 @@ extern Datum heap_getsysattr(HeapTuple tup, int attnum, bool *isnull);
|
|||||||
/* heapam.c */
|
/* heapam.c */
|
||||||
|
|
||||||
extern Relation relation_open(Oid relationId, LOCKMODE lockmode);
|
extern Relation relation_open(Oid relationId, LOCKMODE lockmode);
|
||||||
|
extern Relation conditional_relation_open(Oid relationId, LOCKMODE lockmode, bool nowait);
|
||||||
extern Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode);
|
extern Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode);
|
||||||
extern Relation relation_openr(const char *sysRelationName, LOCKMODE lockmode);
|
extern Relation relation_openr(const char *sysRelationName, LOCKMODE lockmode);
|
||||||
extern void relation_close(Relation relation, LOCKMODE lockmode);
|
extern void relation_close(Relation relation, LOCKMODE lockmode);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.253 2004/01/14 23:01:55 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.254 2004/03/11 01:47:41 ishii Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1619,6 +1619,7 @@ typedef struct LockStmt
|
|||||||
NodeTag type;
|
NodeTag type;
|
||||||
List *relations; /* relations to lock */
|
List *relations; /* relations to lock */
|
||||||
int mode; /* lock mode */
|
int mode; /* lock mode */
|
||||||
|
bool nowait; /* no wait mode */
|
||||||
} LockStmt;
|
} LockStmt;
|
||||||
|
|
||||||
/* ----------------------
|
/* ----------------------
|
||||||
|
Reference in New Issue
Block a user