Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit994c36e

Browse files
committed
refactor ALTER some-obj SET OWNER implementation
Remove duplicate implementation of catalog munging and miscellaneousprivilege and consistency checks. Instead rely on already existing datain objectaddress.c to do the work.Author: KaiGai KoheiTweaked by meReviewed by Robert Haas
1 parent1f91c8c commit994c36e

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(Oidloid,OidnewOwnerId)
149-
{
150-
Form_pg_largeobject_metadataform_lo_meta;
151-
Relationpg_lo_meta;
152-
ScanKeyDataskey[1];
153-
SysScanDescscan;
154-
HeapTupleoldtup;
155-
HeapTuplenewtup;
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-
Datumvalues[Natts_pg_largeobject_metadata];
179-
boolnulls[Natts_pg_largeobject_metadata];
180-
boolreplaces[Natts_pg_largeobject_metadata];
181-
Acl*newAcl;
182-
DatumaclDatum;
183-
boolisnull;
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-
caseCollationRelationId:
1339-
AlterCollationOwner_oid(sdepForm->objid,newrole);
1340-
break;
1341-
1342-
caseConversionRelationId:
1343-
AlterConversionOwner_oid(sdepForm->objid,newrole);
1344-
break;
1345-
13461340
caseTypeRelationId:
13471341
AlterTypeOwnerInternal(sdepForm->objid,newrole, true);
13481342
break;
13491343

1350-
caseOperatorRelationId:
1351-
AlterOperatorOwner_oid(sdepForm->objid,newrole);
1352-
break;
1353-
13541344
caseNamespaceRelationId:
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-
caseProcedureRelationId:
1369-
AlterFunctionOwner_oid(sdepForm->objid,newrole);
1370-
break;
1371-
1372-
caseLanguageRelationId:
1373-
AlterLanguageOwner_oid(sdepForm->objid,newrole);
1374-
break;
1375-
1376-
caseLargeObjectRelationId:
1377-
LargeObjectAlterOwner(sdepForm->objid,newrole);
1378-
break;
1379-
13801358
caseDefaultAclRelationId:
13811359

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

1388-
caseOperatorClassRelationId:
1389-
AlterOpClassOwner_oid(sdepForm->objid,newrole);
1390-
break;
1391-
1392-
caseOperatorFamilyRelationId:
1393-
AlterOpFamilyOwner_oid(sdepForm->objid,newrole);
1394-
break;
1395-
13961366
caseForeignServerRelationId:
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-
caseExtensionRelationId:
1405-
AlterExtensionOwner_oid(sdepForm->objid,newrole);
1406-
break;
1407-
14081374
caseEventTriggerRelationId:
14091375
AlterEventTriggerOwner_oid(sdepForm->objid,newrole);
14101376
break;
14111377

1378+
/* Generic alter owner cases */
1379+
caseCollationRelationId:
1380+
caseConversionRelationId:
1381+
caseOperatorRelationId:
1382+
caseProcedureRelationId:
1383+
caseLanguageRelationId:
1384+
caseLargeObjectRelationId:
1385+
caseOperatorFamilyRelationId:
1386+
caseOperatorClassRelationId:
1387+
caseExtensionRelationId:
1388+
{
1389+
OidclassId=sdepForm->classid;
1390+
Relationcatalog;
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,OidnewOwnerId)
276-
{
277-
OidprocOid;
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)

[8]ページ先頭

©2009-2025 Movatter.jp