@@ -200,6 +200,82 @@ GetUserOidFromMapping(const char *username, bool missing_ok)
200
200
}
201
201
202
202
203
+ /*
204
+ * Rename foreign-data wrapper
205
+ */
206
+ void
207
+ RenameForeignDataWrapper (const char * oldname , const char * newname )
208
+ {
209
+ HeapTuple tup ;
210
+ Relation rel ;
211
+
212
+ rel = heap_open (ForeignDataWrapperRelationId , RowExclusiveLock );
213
+
214
+ tup = SearchSysCacheCopy1 (FOREIGNDATAWRAPPERNAME , CStringGetDatum (oldname ));
215
+ if (!HeapTupleIsValid (tup ))
216
+ ereport (ERROR ,
217
+ (errcode (ERRCODE_UNDEFINED_OBJECT ),
218
+ errmsg ("foreign-data wrapper \"%s\" does not exist" , oldname )));
219
+
220
+ /* make sure the new name doesn't exist */
221
+ if (SearchSysCacheExists1 (FOREIGNDATAWRAPPERNAME , CStringGetDatum (newname )))
222
+ ereport (ERROR ,
223
+ (errcode (ERRCODE_DUPLICATE_OBJECT ),
224
+ errmsg ("foreign-data wrapper \"%s\" already exists" , newname )));
225
+
226
+ /* must be owner of FDW */
227
+ if (!pg_foreign_data_wrapper_ownercheck (HeapTupleGetOid (tup ), GetUserId ()))
228
+ aclcheck_error (ACLCHECK_NOT_OWNER , ACL_KIND_FDW ,
229
+ oldname );
230
+
231
+ /* rename */
232
+ namestrcpy (& (((Form_pg_foreign_data_wrapper ) GETSTRUCT (tup ))-> fdwname ), newname );
233
+ simple_heap_update (rel , & tup -> t_self , tup );
234
+ CatalogUpdateIndexes (rel , tup );
235
+
236
+ heap_close (rel , NoLock );
237
+ heap_freetuple (tup );
238
+ }
239
+
240
+
241
+ /*
242
+ * Rename foreign server
243
+ */
244
+ void
245
+ RenameForeignServer (const char * oldname , const char * newname )
246
+ {
247
+ HeapTuple tup ;
248
+ Relation rel ;
249
+
250
+ rel = heap_open (ForeignServerRelationId , RowExclusiveLock );
251
+
252
+ tup = SearchSysCacheCopy1 (FOREIGNSERVERNAME , CStringGetDatum (oldname ));
253
+ if (!HeapTupleIsValid (tup ))
254
+ ereport (ERROR ,
255
+ (errcode (ERRCODE_UNDEFINED_OBJECT ),
256
+ errmsg ("server \"%s\" does not exist" , oldname )));
257
+
258
+ /* make sure the new name doesn't exist */
259
+ if (SearchSysCacheExists1 (FOREIGNSERVERNAME , CStringGetDatum (newname )))
260
+ ereport (ERROR ,
261
+ (errcode (ERRCODE_DUPLICATE_OBJECT ),
262
+ errmsg ("server \"%s\" already exists" , newname )));
263
+
264
+ /* must be owner of server */
265
+ if (!pg_foreign_server_ownercheck (HeapTupleGetOid (tup ), GetUserId ()))
266
+ aclcheck_error (ACLCHECK_NOT_OWNER , ACL_KIND_FOREIGN_SERVER ,
267
+ oldname );
268
+
269
+ /* rename */
270
+ namestrcpy (& (((Form_pg_foreign_server ) GETSTRUCT (tup ))-> srvname ), newname );
271
+ simple_heap_update (rel , & tup -> t_self , tup );
272
+ CatalogUpdateIndexes (rel , tup );
273
+
274
+ heap_close (rel , NoLock );
275
+ heap_freetuple (tup );
276
+ }
277
+
278
+
203
279
/*
204
280
* Change foreign-data wrapper owner.
205
281
*
0 commit comments