@@ -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 ;
291288Form_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 */
296293if (!superuser ())
297294ereport (ERROR ,
298295(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
299296errmsg ("permission denied to change owner of foreign-data wrapper \"%s\"" ,
300- name ),
297+ NameStr ( form -> fdwname ) ),
301298errhint ("Must be superuser to change owner of a foreign-data wrapper." )));
302299
303300/* New owner must also be a superuser */
304301if (!superuser_arg (newOwnerId ))
305302ereport (ERROR ,
306303(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
307304errmsg ("permission denied to change owner of foreign-data wrapper \"%s\"" ,
308- name ),
305+ NameStr ( form -> fdwname ) ),
309306errhint ("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-
321308if (form -> fdwowner != newOwnerId )
322309{
323310form -> fdwowner = newOwnerId ;
@@ -327,49 +314,89 @@ AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
327314
328315/* Update owner dependency reference */
329316changeDependencyOnOwner (ForeignDataWrapperRelationId ,
330- fdwId ,
317+ HeapTupleGetOid ( tup ) ,
331318newOwnerId );
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
334344heap_freetuple (tup );
335345
336346heap_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{
346357HeapTuple tup ;
347358Relation 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
356364if (!HeapTupleIsValid (tup ))
357365ereport (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 );
362384form = (Form_pg_foreign_server )GETSTRUCT (tup );
363385
364386if (form -> srvowner != newOwnerId )
365387{
366388/* Superusers can always do it */
367389if (!superuser ())
368390{
391+ Oid srvId ;
392+ AclResult aclresult ;
393+
394+ srvId = HeapTupleGetOid (tup );
395+
369396/* Must be owner */
370397if (!pg_foreign_server_ownercheck (srvId ,GetUserId ()))
371398aclcheck_error (ACLCHECK_NOT_OWNER ,ACL_KIND_FOREIGN_SERVER ,
372- name );
399+ NameStr ( form -> srvname ) );
373400
374401/* Must be able to become new owner */
375402check_is_member_of_role (GetUserId (),newOwnerId );
@@ -393,12 +420,57 @@ AlterForeignServerOwner(const char *name, Oid newOwnerId)
393420changeDependencyOnOwner (ForeignServerRelationId ,HeapTupleGetOid (tup ),
394421newOwnerId );
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
397445heap_freetuple (tup );
398446
399447heap_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.