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

Commita417f85

Browse files
committed
REASSIGN OWNED: Support foreign data wrappers and servers
This was overlooked when implementing those kinds of objects, in commitcae565e.Per report from Pawel Casperek.
1 parent593a963 commita417f85

File tree

3 files changed

+115
-31
lines changed

3 files changed

+115
-31
lines changed

‎src/backend/catalog/pg_shdepend.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include"catalog/pg_conversion.h"
2626
#include"catalog/pg_database.h"
2727
#include"catalog/pg_default_acl.h"
28+
#include"catalog/pg_foreign_data_wrapper.h"
29+
#include"catalog/pg_foreign_server.h"
2830
#include"catalog/pg_language.h"
2931
#include"catalog/pg_largeobject.h"
3032
#include"catalog/pg_namespace.h"
@@ -1382,6 +1384,14 @@ shdepReassignOwned(List *roleids, Oid newrole)
13821384
AlterOpFamilyOwner_oid(sdepForm->objid,newrole);
13831385
break;
13841386

1387+
caseForeignServerRelationId:
1388+
AlterForeignServerOwner_oid(sdepForm->objid,newrole);
1389+
break;
1390+
1391+
caseForeignDataWrapperRelationId:
1392+
AlterForeignDataWrapperOwner_oid(sdepForm->objid,newrole);
1393+
break;
1394+
13851395
default:
13861396
elog(ERROR,"unexpected classid %u",sdepForm->classid);
13871397
break;

‎src/backend/commands/foreigncmds.c

Lines changed: 103 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -277,47 +277,34 @@ RenameForeignServer(const char *oldname, const char *newname)
277277

278278

279279
/*
280-
*Change foreign-data wrapper owner.
280+
*Internal workhorse for changing adata wrapper's owner.
281281
*
282282
* Allow this only for superusers; also the new owner must be a
283283
* superuser.
284284
*/
285-
void
286-
AlterForeignDataWrapperOwner(constchar*name,OidnewOwnerId)
285+
staticvoid
286+
AlterForeignDataWrapperOwner_internal(Relationrel,HeapTupletup,OidnewOwnerId)
287287
{
288-
HeapTupletup;
289-
Relationrel;
290-
OidfdwId;
291288
Form_pg_foreign_data_wrapperform;
292289

293-
rel=heap_open(ForeignDataWrapperRelationId,RowExclusiveLock);
290+
form=(Form_pg_foreign_data_wrapper)GETSTRUCT(tup);
294291

295292
/* Must be a superuser to change a FDW owner */
296293
if (!superuser())
297294
ereport(ERROR,
298295
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
299296
errmsg("permission denied to change owner of foreign-data wrapper \"%s\"",
300-
name),
297+
NameStr(form->fdwname)),
301298
errhint("Must be superuser to change owner of a foreign-data wrapper.")));
302299

303300
/* New owner must also be a superuser */
304301
if (!superuser_arg(newOwnerId))
305302
ereport(ERROR,
306303
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
307304
errmsg("permission denied to change owner of foreign-data wrapper \"%s\"",
308-
name),
305+
NameStr(form->fdwname)),
309306
errhint("The owner of a foreign-data wrapper must be a superuser.")));
310307

311-
tup=SearchSysCacheCopy1(FOREIGNDATAWRAPPERNAME,CStringGetDatum(name));
312-
313-
if (!HeapTupleIsValid(tup))
314-
ereport(ERROR,
315-
(errcode(ERRCODE_UNDEFINED_OBJECT),
316-
errmsg("foreign-data wrapper \"%s\" does not exist",name)));
317-
318-
fdwId=HeapTupleGetOid(tup);
319-
form= (Form_pg_foreign_data_wrapper)GETSTRUCT(tup);
320-
321308
if (form->fdwowner!=newOwnerId)
322309
{
323310
form->fdwowner=newOwnerId;
@@ -327,49 +314,89 @@ AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
327314

328315
/* Update owner dependency reference */
329316
changeDependencyOnOwner(ForeignDataWrapperRelationId,
330-
fdwId,
317+
HeapTupleGetOid(tup),
331318
newOwnerId);
332319
}
320+
}
321+
322+
/*
323+
* Change foreign-data wrapper owner -- by name
324+
*
325+
* Note restrictions in the "_internal" function, above.
326+
*/
327+
void
328+
AlterForeignDataWrapperOwner(constchar*name,OidnewOwnerId)
329+
{
330+
HeapTupletup;
331+
Relationrel;
332+
333+
rel=heap_open(ForeignDataWrapperRelationId,RowExclusiveLock);
334+
335+
tup=SearchSysCacheCopy1(FOREIGNDATAWRAPPERNAME,CStringGetDatum(name));
336+
337+
if (!HeapTupleIsValid(tup))
338+
ereport(ERROR,
339+
(errcode(ERRCODE_UNDEFINED_OBJECT),
340+
errmsg("foreign-data wrapper \"%s\" does not exist",name)));
341+
342+
AlterForeignDataWrapperOwner_internal(rel,tup,newOwnerId);
333343

334344
heap_freetuple(tup);
335345

336346
heap_close(rel,RowExclusiveLock);
337347
}
338348

339-
340349
/*
341-
* Change foreign server owner
350+
* Change foreign-data wrapper owner -- by OID
351+
*
352+
* Note restrictions in the "_internal" function, above.
342353
*/
343354
void
344-
AlterForeignServerOwner(constchar*name,OidnewOwnerId)
355+
AlterForeignDataWrapperOwner_oid(OidfwdId,OidnewOwnerId)
345356
{
346357
HeapTupletup;
347358
Relationrel;
348-
OidsrvId;
349-
AclResultaclresult;
350-
Form_pg_foreign_serverform;
351359

352-
rel=heap_open(ForeignServerRelationId,RowExclusiveLock);
360+
rel=heap_open(ForeignDataWrapperRelationId,RowExclusiveLock);
353361

354-
tup=SearchSysCacheCopy1(FOREIGNSERVERNAME,CStringGetDatum(name));
362+
tup=SearchSysCacheCopy1(FOREIGNDATAWRAPPEROID,ObjectIdGetDatum(fwdId));
355363

356364
if (!HeapTupleIsValid(tup))
357365
ereport(ERROR,
358366
(errcode(ERRCODE_UNDEFINED_OBJECT),
359-
errmsg("server \"%s\" does not exist",name)));
367+
errmsg("foreign-data wrapper with OID \"%u\" does not exist",fwdId)));
368+
369+
AlterForeignDataWrapperOwner_internal(rel,tup,newOwnerId);
370+
371+
heap_freetuple(tup);
372+
373+
heap_close(rel,RowExclusiveLock);
374+
}
375+
376+
/*
377+
* Internal workhorse for changing a foreign server's owner
378+
*/
379+
staticvoid
380+
AlterForeignServerOwner_internal(Relationrel,HeapTupletup,OidnewOwnerId)
381+
{
382+
Form_pg_foreign_serverform;
360383

361-
srvId=HeapTupleGetOid(tup);
362384
form= (Form_pg_foreign_server)GETSTRUCT(tup);
363385

364386
if (form->srvowner!=newOwnerId)
365387
{
366388
/* Superusers can always do it */
367389
if (!superuser())
368390
{
391+
OidsrvId;
392+
AclResultaclresult;
393+
394+
srvId=HeapTupleGetOid(tup);
395+
369396
/* Must be owner */
370397
if (!pg_foreign_server_ownercheck(srvId,GetUserId()))
371398
aclcheck_error(ACLCHECK_NOT_OWNER,ACL_KIND_FOREIGN_SERVER,
372-
name);
399+
NameStr(form->srvname));
373400

374401
/* Must be able to become new owner */
375402
check_is_member_of_role(GetUserId(),newOwnerId);
@@ -393,12 +420,57 @@ AlterForeignServerOwner(const char *name, Oid newOwnerId)
393420
changeDependencyOnOwner(ForeignServerRelationId,HeapTupleGetOid(tup),
394421
newOwnerId);
395422
}
423+
}
424+
425+
/*
426+
* Change foreign server owner -- by name
427+
*/
428+
void
429+
AlterForeignServerOwner(constchar*name,OidnewOwnerId)
430+
{
431+
HeapTupletup;
432+
Relationrel;
433+
434+
rel=heap_open(ForeignServerRelationId,RowExclusiveLock);
435+
436+
tup=SearchSysCacheCopy1(FOREIGNSERVERNAME,CStringGetDatum(name));
437+
438+
if (!HeapTupleIsValid(tup))
439+
ereport(ERROR,
440+
(errcode(ERRCODE_UNDEFINED_OBJECT),
441+
errmsg("server \"%s\" does not exist",name)));
442+
443+
AlterForeignServerOwner_internal(rel,tup,newOwnerId);
396444

397445
heap_freetuple(tup);
398446

399447
heap_close(rel,RowExclusiveLock);
400448
}
401449

450+
/*
451+
* Change foreign server owner -- by OID
452+
*/
453+
void
454+
AlterForeignServerOwner_oid(OidsrvId,OidnewOwnerId)
455+
{
456+
HeapTupletup;
457+
Relationrel;
458+
459+
rel=heap_open(ForeignServerRelationId,RowExclusiveLock);
460+
461+
tup=SearchSysCacheCopy1(FOREIGNSERVEROID,ObjectIdGetDatum(srvId));
462+
463+
if (!HeapTupleIsValid(tup))
464+
ereport(ERROR,
465+
(errcode(ERRCODE_UNDEFINED_OBJECT),
466+
errmsg("server with OID \"%u\" does not exist",srvId)));
467+
468+
AlterForeignServerOwner_internal(rel,tup,newOwnerId);
469+
470+
heap_freetuple(tup);
471+
472+
heap_close(rel,RowExclusiveLock);
473+
}
402474

403475
/*
404476
* Convert a handler function name passed from the parser to an Oid.

‎src/include/commands/defrem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ extern List *deserialize_deflist(Datum txt);
149149
externvoidRenameForeignServer(constchar*oldname,constchar*newname);
150150
externvoidRenameForeignDataWrapper(constchar*oldname,constchar*newname);
151151
externvoidAlterForeignServerOwner(constchar*name,OidnewOwnerId);
152+
externvoidAlterForeignServerOwner_oid(Oid ,OidnewOwnerId);
152153
externvoidAlterForeignDataWrapperOwner(constchar*name,OidnewOwnerId);
154+
externvoidAlterForeignDataWrapperOwner_oid(OidfwdId,OidnewOwnerId);
153155
externvoidCreateForeignDataWrapper(CreateFdwStmt*stmt);
154156
externvoidAlterForeignDataWrapper(AlterFdwStmt*stmt);
155157
externvoidRemoveForeignDataWrapperById(OidfdwId);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp