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