From 154f26ff5960ea11d0d5683dd2a119dc15d01218 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 2 Aug 2002 21:54:34 +0000 Subject: [PATCH] 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. --- src/backend/catalog/heap.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index ec9165c55b..cb1248caaa 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); } /* ---------------------------------------------------------------- -- 2.40.0