diff options
author | Bruce Momjian <bruce@momjian.us> | 2001-08-04 22:01:39 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2001-08-04 22:01:39 +0000 |
commit | d1c9633060fbb6c062e642e1b7e0d08bbd3d31ce (patch) | |
tree | aa99ea3e580272a90172ee54c2834eceec32de39 /src/backend/commands/command.c | |
parent | eb610fb8f1c2efe4f4dd454563598d4841a1b732 (diff) | |
download | postgresql-d1c9633060fbb6c062e642e1b7e0d08bbd3d31ce.tar.gz postgresql-d1c9633060fbb6c062e642e1b7e0d08bbd3d31ce.zip |
Back out LOCK A,B,C patch at Tom's suggestion.
Diffstat (limited to 'src/backend/commands/command.c')
-rw-r--r-- | src/backend/commands/command.c | 111 |
1 files changed, 17 insertions, 94 deletions
diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c index 827608363cb..37814cdcd38 100644 --- a/src/backend/commands/command.c +++ b/src/backend/commands/command.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.137 2001/08/04 19:38:59 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.138 2001/08/04 22:01:38 momjian Exp $ * * NOTES * The PerformAddAttribute() code, like most of the relation @@ -1984,7 +1984,8 @@ needs_toast_table(Relation rel) MAXALIGN(data_length); return (tuple_length > TOAST_TUPLE_THRESHOLD); } - + + /* * * LOCK TABLE @@ -1993,104 +1994,26 @@ needs_toast_table(Relation rel) void LockTableCommand(LockStmt *lockstmt) { - int relCnt; - - relCnt = length(lockstmt -> rellist); - - /* Handle a single relation lock specially to avoid overhead on likely the - most common case */ - - if(relCnt == 1) - { - - /* Locking a single table */ - - Relation rel; - int aclresult; - char *relname; - - relname = strVal(lfirst(lockstmt->rellist)); - - freeList(lockstmt->rellist); - - rel = heap_openr(relname, NoLock); - - if (rel->rd_rel->relkind != RELKIND_RELATION) - elog(ERROR, "LOCK TABLE: %s is not a table", relname); - - if (lockstmt->mode == AccessShareLock) - aclresult = pg_aclcheck(relname, GetUserId(), - ACL_SELECT); - else - aclresult = pg_aclcheck(relname, GetUserId(), - ACL_UPDATE | ACL_DELETE); - - if (aclresult != ACLCHECK_OK) - elog(ERROR, "LOCK TABLE: permission denied"); - - LockRelation(rel, lockstmt->mode); - - pfree(relname); - - heap_close(rel, NoLock); /* close rel, keep lock */ - } - else - { - List *p; - Relation *RelationArray; - Relation *pRel; - - /* Locking multiple tables */ - - /* Create an array of relations */ - - RelationArray = palloc(relCnt * sizeof(Relation)); - pRel = RelationArray; - - /* Iterate over the list and populate the relation array */ - - foreach(p, lockstmt->rellist) - { - char* relname = strVal(lfirst(p)); - int aclresult; - - *pRel = heap_openr(relname, NoLock); - - if ((*pRel)->rd_rel->relkind != RELKIND_RELATION) - elog(ERROR, "LOCK TABLE: %s is not a table", - relname); - - if (lockstmt->mode == AccessShareLock) - aclresult = pg_aclcheck(relname, GetUserId(), - ACL_SELECT); - else - aclresult = pg_aclcheck(relname, GetUserId(), - ACL_UPDATE | ACL_DELETE); - - if (aclresult != ACLCHECK_OK) - elog(ERROR, "LOCK TABLE: permission denied"); + Relation rel; + int aclresult; - pRel++; - pfree(relname); - } + rel = heap_openr(lockstmt->relname, NoLock); - /* Now, lock all the relations, closing each after it is locked - (Keeping the locks) - */ + if (rel->rd_rel->relkind != RELKIND_RELATION) + elog(ERROR, "LOCK TABLE: %s is not a table", lockstmt->relname); - for(pRel = RelationArray; - pRel < RelationArray + relCnt; - pRel++) - { - LockRelation(*pRel, lockstmt->mode); + if (lockstmt->mode == AccessShareLock) + aclresult = pg_aclcheck(lockstmt->relname, GetUserId(), ACL_SELECT); + else + aclresult = pg_aclcheck(lockstmt->relname, GetUserId(), + ACL_UPDATE | ACL_DELETE); - heap_close(*pRel, NoLock); - } + if (aclresult != ACLCHECK_OK) + elog(ERROR, "LOCK TABLE: permission denied"); - /* Free the relation array */ + LockRelation(rel, lockstmt->mode); - pfree(RelationArray); - } + heap_close(rel, NoLock); /* close rel, keep lock */ } |