Here is the patch I promised (against current). Regression tests all passed. One thing I have not checked is the doc(lock.sgml). For some reason I failed to install docbook V4.2 (I have working docbook V3.1 though), and I couldn't test the correctness of the file. Also, it would be nice if some one checks my English grammer:-) -- Tatsuo Ishii
> It seems "NOWAIT" is the winner... > -- > Tatsuo Ishii > > > Oracle uses "NOWAIT" so we should go for that one. > > > > Regards, > > > > Hans > > > > > > > > Tatsuo Ishii wrote: > > > If "NOWAIT" is the choice, I could live with it. If there's no > > > objection, I will go with "NOWAIT", not "NO WAIT". > > > -- > > > Tatsuo Ishii > > > > > > > > >>Tatsuo Ishii <[EMAIL PROTECTED]> writes: > > >> > > >>>LOCK TABLE table NO WAIT is OK for 7.5? If ok, I will make patches > > >>>against current with some docs changes. > > >> > > >>Dept of minor gripes: can we do this without turning "NO" into a > > >>keyword? Even as a nonreserved word, I think that would be annoying. > > >>"no" is a common abbreviation for "number" so I think it's likely to > > >>get used as a column name. > > >> > > >>If Oracle spells it "NOWAIT" then I'd be much happier with that... > > >> > > >> regards, tom lane > > >> > > > > > > > > > ---------------------------(end of broadcast)--------------------------- > > > TIP 6: Have you searched our list archives? > > > > > > http://archives.postgresql.org > > > > > > -- > > Cybertec Geschwinde u Schoenig > > Schoengrabern 134, A-2020 Hollabrunn, Austria > > Tel: +43/2952/30706 or +43/664/233 90 75 > > www.cybertec.at, www.postgresql.at, kernel.cybertec.at > > > > > > ---------------------------(end of broadcast)--------------------------- > > TIP 5: Have you checked our extensive FAQ? > > > > http://www.postgresql.org/docs/faqs/FAQ.html > > > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED]) >
Index: doc/src/sgml/ref/lock.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/lock.sgml,v retrieving revision 1.40 diff -c -r1.40 lock.sgml *** doc/src/sgml/ref/lock.sgml 14 Dec 2003 00:05:29 -0000 1.40 --- doc/src/sgml/ref/lock.sgml 9 Mar 2004 12:42:31 -0000 *************** *** 20,26 **** <refsynopsisdiv> <synopsis> ! LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ IN <replaceable class="PARAMETER">lockmode</replaceable> MODE ] where <replaceable class="PARAMETER">lockmode</replaceable> is one of: --- 20,26 ---- <refsynopsisdiv> <synopsis> ! LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> [, ...] [ IN <replaceable class="PARAMETER">lockmode</replaceable> MODE ] [ NOWAIT ] where <replaceable class="PARAMETER">lockmode</replaceable> is one of: *************** *** 34,41 **** <para> <command>LOCK TABLE</command> obtains a table-level lock, waiting if ! necessary for any conflicting locks to be released. Once obtained, ! the lock is held for the remainder of the current transaction. (There is no <command>UNLOCK TABLE</command> command; locks are always released at transaction end.) </para> --- 34,43 ---- <para> <command>LOCK TABLE</command> obtains a table-level lock, waiting if ! necessary for any conflicting locks to be released. ! 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 released at transaction end.) </para> Index: src/backend/access/heap/heapam.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/access/heap/heapam.c,v retrieving revision 1.162 diff -c -r1.162 heapam.c *** src/backend/access/heap/heapam.c 16 Jan 2004 20:51:30 -0000 1.162 --- src/backend/access/heap/heapam.c 9 Mar 2004 12:42:33 -0000 *************** *** 464,469 **** --- 464,496 ---- 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 * Index: src/backend/commands/lockcmds.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/commands/lockcmds.c,v retrieving revision 1.8 diff -c -r1.8 lockcmds.c *** src/backend/commands/lockcmds.c 29 Nov 2003 19:51:47 -0000 1.8 --- src/backend/commands/lockcmds.c 9 Mar 2004 12:42:34 -0000 *************** *** 59,65 **** aclcheck_error(aclresult, ACL_KIND_CLASS, get_rel_name(reloid)); ! rel = relation_open(reloid, lockstmt->mode); /* Currently, we only allow plain tables to be locked */ if (rel->rd_rel->relkind != RELKIND_RELATION) --- 59,65 ---- aclcheck_error(aclresult, ACL_KIND_CLASS, get_rel_name(reloid)); ! rel = conditional_relation_open(reloid, lockstmt->mode, lockstmt->nowait); /* Currently, we only allow plain tables to be locked */ if (rel->rd_rel->relkind != RELKIND_RELATION) Index: src/backend/parser/gram.y =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/parser/gram.y,v retrieving revision 2.447 diff -c -r2.447 gram.y *** src/backend/parser/gram.y 9 Mar 2004 05:05:41 -0000 2.447 --- src/backend/parser/gram.y 9 Mar 2004 12:42:37 -0000 *************** *** 169,174 **** --- 169,175 ---- %type <ival> opt_lock lock_type cast_context %type <boolean> opt_force opt_or_replace transaction_access_mode opt_grant_grant_option opt_revoke_grant_option + opt_nowait %type <boolean> like_including_defaults *************** *** 375,381 **** MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB ! NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NULL_P NULLIF NUMERIC OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR --- 376,382 ---- MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB ! NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NUMERIC OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR *************** *** 4347,4358 **** } ; ! LockStmt: LOCK_P opt_table qualified_name_list opt_lock { LockStmt *n = makeNode(LockStmt); n->relations = $3; n->mode = $4; $$ = (Node *)n; } ; --- 4348,4360 ---- } ; ! LockStmt: LOCK_P opt_table qualified_name_list opt_lock opt_nowait { LockStmt *n = makeNode(LockStmt); n->relations = $3; n->mode = $4; + n->nowait = $5; $$ = (Node *)n; } ; *************** *** 4369,4374 **** --- 4371,4380 ---- | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; } | EXCLUSIVE { $$ = ExclusiveLock; } | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; } + ; + + opt_nowait: NOWAIT { $$ = TRUE; } + | /*EMPTY*/ { $$ = FALSE; } ; Index: src/backend/parser/keywords.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/parser/keywords.c,v retrieving revision 1.146 diff -c -r1.146 keywords.c *** src/backend/parser/keywords.c 9 Mar 2004 05:05:41 -0000 1.146 --- src/backend/parser/keywords.c 9 Mar 2004 12:42:37 -0000 *************** *** 213,218 **** --- 213,219 ---- {"nothing", NOTHING}, {"notify", NOTIFY}, {"notnull", NOTNULL}, + {"nowait", NOWAIT}, {"null", NULL_P}, {"nullif", NULLIF}, {"numeric", NUMERIC}, Index: src/include/access/heapam.h =================================================================== RCS file: /cvsroot/pgsql-server/src/include/access/heapam.h,v retrieving revision 1.86 diff -c -r1.86 heapam.h *** src/include/access/heapam.h 29 Nov 2003 22:40:55 -0000 1.86 --- src/include/access/heapam.h 9 Mar 2004 12:42:38 -0000 *************** *** 129,134 **** --- 129,135 ---- /* heapam.c */ 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_openr(const char *sysRelationName, LOCKMODE lockmode); extern void relation_close(Relation relation, LOCKMODE lockmode); Index: src/include/nodes/parsenodes.h =================================================================== RCS file: /cvsroot/pgsql-server/src/include/nodes/parsenodes.h,v retrieving revision 1.253 diff -c -r1.253 parsenodes.h *** src/include/nodes/parsenodes.h 14 Jan 2004 23:01:55 -0000 1.253 --- src/include/nodes/parsenodes.h 9 Mar 2004 12:42:39 -0000 *************** *** 1619,1624 **** --- 1619,1625 ---- NodeTag type; List *relations; /* relations to lock */ int mode; /* lock mode */ + bool nowait; /* no wait mode */ } LockStmt; /* ----------------------
---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://archives.postgresql.org