@@ -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 */
343354void
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.
0 commit comments