|
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