Skip to content

Commit 994c36e

Browse files
committed
refactor ALTER some-obj SET OWNER implementation
Remove duplicate implementation of catalog munging and miscellaneous privilege and consistency checks. Instead rely on already existing data in objectaddress.c to do the work. Author: KaiGai Kohei Tweaked by me Reviewed by Robert Haas
1 parent 1f91c8c commit 994c36e

24 files changed

+270
-1338
lines changed

src/backend/catalog/pg_largeobject.c

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -139,108 +139,6 @@ LargeObjectDrop(Oid loid)
139139
heap_close(pg_lo_meta, RowExclusiveLock);
140140
}
141141

142-
/*
143-
* LargeObjectAlterOwner
144-
*
145-
* Implementation of ALTER LARGE OBJECT statement
146-
*/
147-
void
148-
LargeObjectAlterOwner(Oid loid, Oid newOwnerId)
149-
{
150-
Form_pg_largeobject_metadata form_lo_meta;
151-
Relation pg_lo_meta;
152-
ScanKeyData skey[1];
153-
SysScanDesc scan;
154-
HeapTuple oldtup;
155-
HeapTuple newtup;
156-
157-
pg_lo_meta = heap_open(LargeObjectMetadataRelationId,
158-
RowExclusiveLock);
159-
160-
ScanKeyInit(&skey[0],
161-
ObjectIdAttributeNumber,
162-
BTEqualStrategyNumber, F_OIDEQ,
163-
ObjectIdGetDatum(loid));
164-
165-
scan = systable_beginscan(pg_lo_meta,
166-
LargeObjectMetadataOidIndexId, true,
167-
SnapshotNow, 1, skey);
168-
169-
oldtup = systable_getnext(scan);
170-
if (!HeapTupleIsValid(oldtup))
171-
ereport(ERROR,
172-
(errcode(ERRCODE_UNDEFINED_OBJECT),
173-
errmsg("large object %u does not exist", loid)));
174-
175-
form_lo_meta = (Form_pg_largeobject_metadata) GETSTRUCT(oldtup);
176-
if (form_lo_meta->lomowner != newOwnerId)
177-
{
178-
Datum values[Natts_pg_largeobject_metadata];
179-
bool nulls[Natts_pg_largeobject_metadata];
180-
bool replaces[Natts_pg_largeobject_metadata];
181-
Acl *newAcl;
182-
Datum aclDatum;
183-
bool isnull;
184-
185-
/* Superusers can always do it */
186-
if (!superuser())
187-
{
188-
/*
189-
* lo_compat_privileges is not checked here, because ALTER LARGE
190-
* OBJECT ... OWNER did not exist at all prior to PostgreSQL 9.0.
191-
*
192-
* We must be the owner of the existing object.
193-
*/
194-
if (!pg_largeobject_ownercheck(loid, GetUserId()))
195-
ereport(ERROR,
196-
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
197-
errmsg("must be owner of large object %u", loid)));
198-
199-
/* Must be able to become new owner */
200-
check_is_member_of_role(GetUserId(), newOwnerId);
201-
}
202-
203-
memset(values, 0, sizeof(values));
204-
memset(nulls, false, sizeof(nulls));
205-
memset(replaces, false, sizeof(nulls));
206-
207-
values[Anum_pg_largeobject_metadata_lomowner - 1]
208-
= ObjectIdGetDatum(newOwnerId);
209-
replaces[Anum_pg_largeobject_metadata_lomowner - 1] = true;
210-
211-
/*
212-
* Determine the modified ACL for the new owner. This is only
213-
* necessary when the ACL is non-null.
214-
*/
215-
aclDatum = heap_getattr(oldtup,
216-
Anum_pg_largeobject_metadata_lomacl,
217-
RelationGetDescr(pg_lo_meta), &isnull);
218-
if (!isnull)
219-
{
220-
newAcl = aclnewowner(DatumGetAclP(aclDatum),
221-
form_lo_meta->lomowner, newOwnerId);
222-
values[Anum_pg_largeobject_metadata_lomacl - 1]
223-
= PointerGetDatum(newAcl);
224-
replaces[Anum_pg_largeobject_metadata_lomacl - 1] = true;
225-
}
226-
227-
newtup = heap_modify_tuple(oldtup, RelationGetDescr(pg_lo_meta),
228-
values, nulls, replaces);
229-
230-
simple_heap_update(pg_lo_meta, &newtup->t_self, newtup);
231-
CatalogUpdateIndexes(pg_lo_meta, newtup);
232-
233-
heap_freetuple(newtup);
234-
235-
/* Update owner dependency reference */
236-
changeDependencyOnOwner(LargeObjectRelationId,
237-
loid, newOwnerId);
238-
}
239-
systable_endscan(scan);
240-
241-
heap_close(pg_lo_meta, RowExclusiveLock);
242-
}
243-
244142
/*
245143
* LargeObjectExists
246144
*

src/backend/catalog/pg_shdepend.c

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "catalog/pg_foreign_server.h"
3333
#include "catalog/pg_language.h"
3434
#include "catalog/pg_largeobject.h"
35+
#include "catalog/pg_largeobject_metadata.h"
3536
#include "catalog/pg_namespace.h"
3637
#include "catalog/pg_operator.h"
3738
#include "catalog/pg_opclass.h"
@@ -40,6 +41,7 @@
4041
#include "catalog/pg_shdepend.h"
4142
#include "catalog/pg_tablespace.h"
4243
#include "catalog/pg_type.h"
44+
#include "commands/alter.h"
4345
#include "commands/dbcommands.h"
4446
#include "commands/collationcmds.h"
4547
#include "commands/conversioncmds.h"
@@ -1335,22 +1337,10 @@ shdepReassignOwned(List *roleids, Oid newrole)
13351337
/* Issue the appropriate ALTER OWNER call */
13361338
switch (sdepForm->classid)
13371339
{
1338-
case CollationRelationId:
1339-
AlterCollationOwner_oid(sdepForm->objid, newrole);
1340-
break;
1341-
1342-
case ConversionRelationId:
1343-
AlterConversionOwner_oid(sdepForm->objid, newrole);
1344-
break;
1345-
13461340
case TypeRelationId:
13471341
AlterTypeOwnerInternal(sdepForm->objid, newrole, true);
13481342
break;
13491343

1350-
case OperatorRelationId:
1351-
AlterOperatorOwner_oid(sdepForm->objid, newrole);
1352-
break;
1353-
13541344
case NamespaceRelationId:
13551345
AlterSchemaOwner_oid(sdepForm->objid, newrole);
13561346
break;
@@ -1365,18 +1355,6 @@ shdepReassignOwned(List *roleids, Oid newrole)
13651355
ATExecChangeOwner(sdepForm->objid, newrole, true, AccessExclusiveLock);
13661356
break;
13671357

1368-
case ProcedureRelationId:
1369-
AlterFunctionOwner_oid(sdepForm->objid, newrole);
1370-
break;
1371-
1372-
case LanguageRelationId:
1373-
AlterLanguageOwner_oid(sdepForm->objid, newrole);
1374-
break;
1375-
1376-
case LargeObjectRelationId:
1377-
LargeObjectAlterOwner(sdepForm->objid, newrole);
1378-
break;
1379-
13801358
case DefaultAclRelationId:
13811359

13821360
/*
@@ -1385,14 +1363,6 @@ shdepReassignOwned(List *roleids, Oid newrole)
13851363
*/
13861364
break;
13871365

1388-
case OperatorClassRelationId:
1389-
AlterOpClassOwner_oid(sdepForm->objid, newrole);
1390-
break;
1391-
1392-
case OperatorFamilyRelationId:
1393-
AlterOpFamilyOwner_oid(sdepForm->objid, newrole);
1394-
break;
1395-
13961366
case ForeignServerRelationId:
13971367
AlterForeignServerOwner_oid(sdepForm->objid, newrole);
13981368
break;
@@ -1401,14 +1371,36 @@ shdepReassignOwned(List *roleids, Oid newrole)
14011371
AlterForeignDataWrapperOwner_oid(sdepForm->objid, newrole);
14021372
break;
14031373

1404-
case ExtensionRelationId:
1405-
AlterExtensionOwner_oid(sdepForm->objid, newrole);
1406-
break;
1407-
14081374
case EventTriggerRelationId:
14091375
AlterEventTriggerOwner_oid(sdepForm->objid, newrole);
14101376
break;
14111377

1378+
/* Generic alter owner cases */
1379+
case CollationRelationId:
1380+
case ConversionRelationId:
1381+
case OperatorRelationId:
1382+
case ProcedureRelationId:
1383+
case LanguageRelationId:
1384+
case LargeObjectRelationId:
1385+
case OperatorFamilyRelationId:
1386+
case OperatorClassRelationId:
1387+
case ExtensionRelationId:
1388+
{
1389+
Oid classId = sdepForm->classid;
1390+
Relation catalog;
1391+
1392+
if (classId == LargeObjectRelationId)
1393+
classId = LargeObjectMetadataRelationId;
1394+
1395+
catalog = heap_open(classId, RowExclusiveLock);
1396+
1397+
AlterObjectOwner_internal(catalog, sdepForm->objid,
1398+
newrole);
1399+
1400+
heap_close(catalog, NoLock);
1401+
}
1402+
break;
1403+
14121404
default:
14131405
elog(ERROR, "unexpected classid %u", sdepForm->classid);
14141406
break;

src/backend/commands/aggregatecmds.c

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -267,18 +267,3 @@ RenameAggregate(List *name, List *args, const char *newname)
267267
heap_close(rel, NoLock);
268268
heap_freetuple(tup);
269269
}
270-
271-
/*
272-
* Change aggregate owner
273-
*/
274-
void
275-
AlterAggregateOwner(List *name, List *args, Oid newOwnerId)
276-
{
277-
Oid procOid;
278-
279-
/* Look up function and make sure it's an aggregate */
280-
procOid = LookupAggNameTypeNames(name, args, false);
281-
282-
/* The rest is just like a function */
283-
AlterFunctionOwner_oid(procOid, newOwnerId);
284-
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy