Commit 0b86ade1 authored by Tatsuo Ishii's avatar Tatsuo Ishii

Add NOWAIT option to LOCK command

parent 60a068b3
<!-- <!--
$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 ...@@ -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: ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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); ...@@ -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); ...@@ -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 ...@@ -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; } ...@@ -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: ...@@ -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 @@ ...@@ -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[] = { ...@@ -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 @@ ...@@ -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); ...@@ -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 @@ ...@@ -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 ...@@ -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;
/* ---------------------- /* ----------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment