@@ -202,47 +202,34 @@ GetUserOidFromMapping(const char *username, bool missing_ok)
202
202
203
203
204
204
/*
205
- *Change foreign- data wrapper owner.
205
+ *Internal workhorse for changing a data wrapper's owner.
206
206
*
207
207
* Allow this only for superusers; also the new owner must be a
208
208
* superuser.
209
209
*/
210
- void
211
- AlterForeignDataWrapperOwner ( const char * name ,Oid newOwnerId )
210
+ static void
211
+ AlterForeignDataWrapperOwner_internal ( Relation rel , HeapTuple tup ,Oid newOwnerId )
212
212
{
213
- HeapTuple tup ;
214
- Relation rel ;
215
- Oid fdwId ;
216
213
Form_pg_foreign_data_wrapper form ;
217
214
218
- rel = heap_open ( ForeignDataWrapperRelationId , RowExclusiveLock );
215
+ form = ( Form_pg_foreign_data_wrapper ) GETSTRUCT ( tup );
219
216
220
217
/* Must be a superuser to change a FDW owner */
221
218
if (!superuser ())
222
219
ereport (ERROR ,
223
220
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
224
221
errmsg ("permission denied to change owner of foreign-data wrapper \"%s\"" ,
225
- name ),
222
+ NameStr ( form -> fdwname ) ),
226
223
errhint ("Must be superuser to change owner of a foreign-data wrapper." )));
227
224
228
225
/* New owner must also be a superuser */
229
226
if (!superuser_arg (newOwnerId ))
230
227
ereport (ERROR ,
231
228
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
232
229
errmsg ("permission denied to change owner of foreign-data wrapper \"%s\"" ,
233
- name ),
230
+ NameStr ( form -> fdwname ) ),
234
231
errhint ("The owner of a foreign-data wrapper must be a superuser." )));
235
232
236
- tup = SearchSysCacheCopy1 (FOREIGNDATAWRAPPERNAME ,CStringGetDatum (name ));
237
-
238
- if (!HeapTupleIsValid (tup ))
239
- ereport (ERROR ,
240
- (errcode (ERRCODE_UNDEFINED_OBJECT ),
241
- errmsg ("foreign-data wrapper \"%s\" does not exist" ,name )));
242
-
243
- fdwId = HeapTupleGetOid (tup );
244
- form = (Form_pg_foreign_data_wrapper )GETSTRUCT (tup );
245
-
246
233
if (form -> fdwowner != newOwnerId )
247
234
{
248
235
form -> fdwowner = newOwnerId ;
@@ -252,49 +239,89 @@ AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
252
239
253
240
/* Update owner dependency reference */
254
241
changeDependencyOnOwner (ForeignDataWrapperRelationId ,
255
- fdwId ,
242
+ HeapTupleGetOid ( tup ) ,
256
243
newOwnerId );
257
244
}
245
+ }
246
+
247
+ /*
248
+ * Change foreign-data wrapper owner -- by name
249
+ *
250
+ * Note restrictions in the "_internal" function, above.
251
+ */
252
+ void
253
+ AlterForeignDataWrapperOwner (const char * name ,Oid newOwnerId )
254
+ {
255
+ HeapTuple tup ;
256
+ Relation rel ;
257
+
258
+ rel = heap_open (ForeignDataWrapperRelationId ,RowExclusiveLock );
259
+
260
+ tup = SearchSysCacheCopy1 (FOREIGNDATAWRAPPERNAME ,CStringGetDatum (name ));
261
+
262
+ if (!HeapTupleIsValid (tup ))
263
+ ereport (ERROR ,
264
+ (errcode (ERRCODE_UNDEFINED_OBJECT ),
265
+ errmsg ("foreign-data wrapper \"%s\" does not exist" ,name )));
266
+
267
+ AlterForeignDataWrapperOwner_internal (rel ,tup ,newOwnerId );
258
268
259
269
heap_freetuple (tup );
260
270
261
271
heap_close (rel ,RowExclusiveLock );
262
272
}
263
273
264
-
265
274
/*
266
- * Change foreign server owner
275
+ * Change foreign-data wrapper owner -- by OID
276
+ *
277
+ * Note restrictions in the "_internal" function, above.
267
278
*/
268
279
void
269
- AlterForeignServerOwner ( const char * name ,Oid newOwnerId )
280
+ AlterForeignDataWrapperOwner_oid ( Oid fwdId ,Oid newOwnerId )
270
281
{
271
282
HeapTuple tup ;
272
283
Relation rel ;
273
- Oid srvId ;
274
- AclResult aclresult ;
275
- Form_pg_foreign_server form ;
276
284
277
- rel = heap_open (ForeignServerRelationId ,RowExclusiveLock );
285
+ rel = heap_open (ForeignDataWrapperRelationId ,RowExclusiveLock );
278
286
279
- tup = SearchSysCacheCopy1 (FOREIGNSERVERNAME , CStringGetDatum ( name ));
287
+ tup = SearchSysCacheCopy1 (FOREIGNDATAWRAPPEROID , ObjectIdGetDatum ( fwdId ));
280
288
281
289
if (!HeapTupleIsValid (tup ))
282
290
ereport (ERROR ,
283
291
(errcode (ERRCODE_UNDEFINED_OBJECT ),
284
- errmsg ("server \"%s\" does not exist" ,name )));
292
+ errmsg ("foreign-data wrapper with OID \"%u\" does not exist" ,fwdId )));
293
+
294
+ AlterForeignDataWrapperOwner_internal (rel ,tup ,newOwnerId );
295
+
296
+ heap_freetuple (tup );
297
+
298
+ heap_close (rel ,RowExclusiveLock );
299
+ }
300
+
301
+ /*
302
+ * Internal workhorse for changing a foreign server's owner
303
+ */
304
+ static void
305
+ AlterForeignServerOwner_internal (Relation rel ,HeapTuple tup ,Oid newOwnerId )
306
+ {
307
+ Form_pg_foreign_server form ;
285
308
286
- srvId = HeapTupleGetOid (tup );
287
309
form = (Form_pg_foreign_server )GETSTRUCT (tup );
288
310
289
311
if (form -> srvowner != newOwnerId )
290
312
{
291
313
/* Superusers can always do it */
292
314
if (!superuser ())
293
315
{
316
+ Oid srvId ;
317
+ AclResult aclresult ;
318
+
319
+ srvId = HeapTupleGetOid (tup );
320
+
294
321
/* Must be owner */
295
322
if (!pg_foreign_server_ownercheck (srvId ,GetUserId ()))
296
323
aclcheck_error (ACLCHECK_NOT_OWNER ,ACL_KIND_FOREIGN_SERVER ,
297
- name );
324
+ NameStr ( form -> srvname ) );
298
325
299
326
/* Must be able to become new owner */
300
327
check_is_member_of_role (GetUserId (),newOwnerId );
@@ -318,12 +345,57 @@ AlterForeignServerOwner(const char *name, Oid newOwnerId)
318
345
changeDependencyOnOwner (ForeignServerRelationId ,HeapTupleGetOid (tup ),
319
346
newOwnerId );
320
347
}
348
+ }
349
+
350
+ /*
351
+ * Change foreign server owner -- by name
352
+ */
353
+ void
354
+ AlterForeignServerOwner (const char * name ,Oid newOwnerId )
355
+ {
356
+ HeapTuple tup ;
357
+ Relation rel ;
358
+
359
+ rel = heap_open (ForeignServerRelationId ,RowExclusiveLock );
360
+
361
+ tup = SearchSysCacheCopy1 (FOREIGNSERVERNAME ,CStringGetDatum (name ));
362
+
363
+ if (!HeapTupleIsValid (tup ))
364
+ ereport (ERROR ,
365
+ (errcode (ERRCODE_UNDEFINED_OBJECT ),
366
+ errmsg ("server \"%s\" does not exist" ,name )));
367
+
368
+ AlterForeignServerOwner_internal (rel ,tup ,newOwnerId );
321
369
322
370
heap_freetuple (tup );
323
371
324
372
heap_close (rel ,RowExclusiveLock );
325
373
}
326
374
375
+ /*
376
+ * Change foreign server owner -- by OID
377
+ */
378
+ void
379
+ AlterForeignServerOwner_oid (Oid srvId ,Oid newOwnerId )
380
+ {
381
+ HeapTuple tup ;
382
+ Relation rel ;
383
+
384
+ rel = heap_open (ForeignServerRelationId ,RowExclusiveLock );
385
+
386
+ tup = SearchSysCacheCopy1 (FOREIGNSERVEROID ,ObjectIdGetDatum (srvId ));
387
+
388
+ if (!HeapTupleIsValid (tup ))
389
+ ereport (ERROR ,
390
+ (errcode (ERRCODE_UNDEFINED_OBJECT ),
391
+ errmsg ("server with OID \"%u\" does not exist" ,srvId )));
392
+
393
+ AlterForeignServerOwner_internal (rel ,tup ,newOwnerId );
394
+
395
+ heap_freetuple (tup );
396
+
397
+ heap_close (rel ,RowExclusiveLock );
398
+ }
327
399
328
400
/*
329
401
* Convert a handler function name passed from the parser to an Oid.