aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/command.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2001-08-04 22:01:39 +0000
committerBruce Momjian <bruce@momjian.us>2001-08-04 22:01:39 +0000
commitd1c9633060fbb6c062e642e1b7e0d08bbd3d31ce (patch)
treeaa99ea3e580272a90172ee54c2834eceec32de39 /src/backend/commands/command.c
parenteb610fb8f1c2efe4f4dd454563598d4841a1b732 (diff)
downloadpostgresql-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.c111
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 */
}