aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-08-02 21:54:34 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-08-02 21:54:34 +0000
commit154f26ff5960ea11d0d5683dd2a119dc15d01218 (patch)
tree217b8ee49e3cc8ea59b442b986ddb2be0e7590af
parent21cf6b2166ae1fc86734a0aaac89fda7df884e82 (diff)
downloadpostgresql-154f26ff5960ea11d0d5683dd2a119dc15d01218.tar.gz
postgresql-154f26ff5960ea11d0d5683dd2a119dc15d01218.zip
RemoveAttrDefaultById() neglected to obtain exclusive lock on the
relation being modified. In most paths of control we'd already have such a lock, but if we were dropping the default due to a cascaded delete of some function it depended on, maybe not.
-rw-r--r--src/backend/catalog/heap.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index ec9165c55b1..cb1248caaa0 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.215 2002/08/02 18:15:05 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.216 2002/08/02 21:54:34 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -1027,6 +1027,7 @@ RemoveAttrDefaultById(Oid attrdefId)
{
Relation attrdef_rel;
Relation attr_rel;
+ Relation myrel;
ScanKeyData scankeys[1];
SysScanDesc scan;
HeapTuple tuple;
@@ -1036,6 +1037,7 @@ RemoveAttrDefaultById(Oid attrdefId)
/* Grab an appropriate lock on the pg_attrdef relation */
attrdef_rel = heap_openr(AttrDefaultRelationName, RowExclusiveLock);
+ /* Find the pg_attrdef tuple */
ScanKeyEntryInitialize(&scankeys[0], 0x0,
ObjectIdAttributeNumber, F_OIDEQ,
ObjectIdGetDatum(attrdefId));
@@ -1051,6 +1053,10 @@ RemoveAttrDefaultById(Oid attrdefId)
myrelid = ((Form_pg_attrdef) GETSTRUCT(tuple))->adrelid;
myattnum = ((Form_pg_attrdef) GETSTRUCT(tuple))->adnum;
+ /* Get an exclusive lock on the relation owning the attribute */
+ myrel = heap_open(myrelid, AccessExclusiveLock);
+
+ /* Now we can delete the pg_attrdef row */
simple_heap_delete(attrdef_rel, &tuple->t_self);
systable_endscan(scan);
@@ -1081,7 +1087,14 @@ RemoveAttrDefaultById(Oid attrdefId)
CatalogCloseIndices(Num_pg_attr_indices, idescs);
}
+ /*
+ * Our update of the pg_attribute row will force a relcache rebuild,
+ * so there's nothing else to do here.
+ */
heap_close(attr_rel, RowExclusiveLock);
+
+ /* Keep lock on attribute's rel until end of xact */
+ heap_close(myrel, NoLock);
}
/* ----------------------------------------------------------------