Skip to content

Commit a417f85

Browse files
committed
REASSIGN OWNED: Support foreign data wrappers and servers
This was overlooked when implementing those kinds of objects, in commit cae565e. Per report from Pawel Casperek.
1 parent 593a963 commit a417f85

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+
case ForeignServerRelationId:
1388+
AlterForeignServerOwner_oid(sdepForm->objid, newrole);
1389+
break;
1390+
1391+
case ForeignDataWrapperRelationId:
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 a data wrapper's owner.
281281
*
282282
* Allow this only for superusers; also the new owner must be a
283283
* superuser.
284284
*/
285-
void
286-
AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
285+
static void
286+
AlterForeignDataWrapperOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
287287
{
288-
HeapTuple tup;
289-
Relation rel;
290-
Oid fdwId;
291288
Form_pg_foreign_data_wrapper form;
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(const char *name, Oid newOwnerId)
329+
{
330+
HeapTuple tup;
331+
Relation rel;
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(const char *name, Oid newOwnerId)
355+
AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId)
345356
{
346357
HeapTuple tup;
347358
Relation rel;
348-
Oid srvId;
349-
AclResult aclresult;
350-
Form_pg_foreign_server form;
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+
static void
380+
AlterForeignServerOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
381+
{
382+
Form_pg_foreign_server form;
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+
Oid srvId;
392+
AclResult aclresult;
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(const char *name, Oid newOwnerId)
430+
{
431+
HeapTuple tup;
432+
Relation rel;
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(Oid srvId, Oid newOwnerId)
455+
{
456+
HeapTuple tup;
457+
Relation rel;
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
extern void RenameForeignServer(const char *oldname, const char *newname);
150150
extern void RenameForeignDataWrapper(const char *oldname, const char *newname);
151151
extern void AlterForeignServerOwner(const char *name, Oid newOwnerId);
152+
extern void AlterForeignServerOwner_oid(Oid , Oid newOwnerId);
152153
extern void AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId);
154+
extern void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId);
153155
extern void CreateForeignDataWrapper(CreateFdwStmt *stmt);
154156
extern void AlterForeignDataWrapper(AlterFdwStmt *stmt);
155157
extern void RemoveForeignDataWrapperById(Oid fdwId);

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