|
30 | 30 | #include "catalog/pg_conversion.h"
|
31 | 31 | #include "catalog/pg_database.h"
|
32 | 32 | #include "catalog/pg_extension.h"
|
| 33 | +#include "catalog/pg_foreign_data_wrapper.h" |
| 34 | +#include "catalog/pg_foreign_server.h" |
33 | 35 | #include "catalog/pg_language.h"
|
34 | 36 | #include "catalog/pg_largeobject.h"
|
35 | 37 | #include "catalog/pg_largeobject_metadata.h"
|
|
52 | 54 | #include "commands/proclang.h"
|
53 | 55 | #include "commands/tablespace.h"
|
54 | 56 | #include "commands/trigger.h"
|
| 57 | +#include "foreign/foreign.h" |
55 | 58 | #include "libpq/be-fsstubs.h"
|
56 | 59 | #include "miscadmin.h"
|
57 | 60 | #include "nodes/makefuncs.h"
|
@@ -140,6 +143,8 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
140 | 143 | case OBJECT_ROLE:
|
141 | 144 | case OBJECT_SCHEMA:
|
142 | 145 | case OBJECT_LANGUAGE:
|
| 146 | + case OBJECT_FDW: |
| 147 | + case OBJECT_FOREIGN_SERVER: |
143 | 148 | address = get_object_address_unqualified(objtype, objname);
|
144 | 149 | break;
|
145 | 150 | case OBJECT_TYPE:
|
@@ -295,6 +300,12 @@ get_object_address_unqualified(ObjectType objtype, List *qualname)
|
295 | 300 | case OBJECT_LANGUAGE:
|
296 | 301 | msg = gettext_noop("language name cannot be qualified");
|
297 | 302 | break;
|
| 303 | + case OBJECT_FDW: |
| 304 | + msg = gettext_noop("foreign-data wrapper name cannot be qualified"); |
| 305 | + break; |
| 306 | + case OBJECT_FOREIGN_SERVER: |
| 307 | + msg = gettext_noop("server name cannot be qualified"); |
| 308 | + break; |
298 | 309 | default:
|
299 | 310 | elog(ERROR, "unrecognized objtype: %d", (int) objtype);
|
300 | 311 | msg = NULL; /* placate compiler */
|
@@ -340,6 +351,16 @@ get_object_address_unqualified(ObjectType objtype, List *qualname)
|
340 | 351 | address.objectId = get_language_oid(name, false);
|
341 | 352 | address.objectSubId = 0;
|
342 | 353 | break;
|
| 354 | + case OBJECT_FDW: |
| 355 | + address.classId = ForeignDataWrapperRelationId; |
| 356 | + address.objectId = get_foreign_data_wrapper_oid(name, false); |
| 357 | + address.objectSubId = 0; |
| 358 | + break; |
| 359 | + case OBJECT_FOREIGN_SERVER: |
| 360 | + address.classId = ForeignServerRelationId; |
| 361 | + address.objectId = get_foreign_server_oid(name, false); |
| 362 | + address.objectSubId = 0; |
| 363 | + break; |
343 | 364 | default:
|
344 | 365 | elog(ERROR, "unrecognized objtype: %d", (int) objtype);
|
345 | 366 | /* placate compiler, which doesn't know elog won't return */
|
@@ -655,6 +676,12 @@ object_exists(ObjectAddress address)
|
655 | 676 | case CastRelationId:
|
656 | 677 | indexoid = CastOidIndexId;
|
657 | 678 | break;
|
| 679 | + case ForeignDataWrapperRelationId: |
| 680 | + cache = FOREIGNDATAWRAPPEROID; |
| 681 | + break; |
| 682 | + case ForeignServerRelationId: |
| 683 | + cache = FOREIGNSERVEROID; |
| 684 | + break; |
658 | 685 | case TSParserRelationId:
|
659 | 686 | cache = TSPARSEROID;
|
660 | 687 | break;
|
@@ -758,6 +785,11 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
|
758 | 785 | aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_EXTENSION,
|
759 | 786 | NameListToString(objname));
|
760 | 787 | break;
|
| 788 | + case OBJECT_FDW: |
| 789 | + if (!pg_foreign_data_wrapper_ownercheck(address.objectId, roleid)) |
| 790 | + aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_FDW, |
| 791 | + NameListToString(objname)); |
| 792 | + break; |
761 | 793 | case OBJECT_FOREIGN_SERVER:
|
762 | 794 | if (!pg_foreign_server_ownercheck(address.objectId, roleid))
|
763 | 795 | aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_FOREIGN_SERVER,
|
@@ -838,7 +870,6 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
|
838 | 870 | errmsg("must have CREATEROLE privilege")));
|
839 | 871 | }
|
840 | 872 | break;
|
841 |
| - case OBJECT_FDW: |
842 | 873 | case OBJECT_TSPARSER:
|
843 | 874 | case OBJECT_TSTEMPLATE:
|
844 | 875 | /* We treat these object types as being owned by superusers */
|
|
0 commit comments