|
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 | caseOBJECT_ROLE: |
141 | 144 | caseOBJECT_SCHEMA: |
142 | 145 | caseOBJECT_LANGUAGE: |
| 146 | +caseOBJECT_FDW: |
| 147 | +caseOBJECT_FOREIGN_SERVER: |
143 | 148 | address=get_object_address_unqualified(objtype,objname); |
144 | 149 | break; |
145 | 150 | caseOBJECT_TYPE: |
@@ -295,6 +300,12 @@ get_object_address_unqualified(ObjectType objtype, List *qualname) |
295 | 300 | caseOBJECT_LANGUAGE: |
296 | 301 | msg=gettext_noop("language name cannot be qualified"); |
297 | 302 | break; |
| 303 | +caseOBJECT_FDW: |
| 304 | +msg=gettext_noop("foreign-data wrapper name cannot be qualified"); |
| 305 | +break; |
| 306 | +caseOBJECT_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 | +caseOBJECT_FDW: |
| 355 | +address.classId=ForeignDataWrapperRelationId; |
| 356 | +address.objectId=get_foreign_data_wrapper_oid(name, false); |
| 357 | +address.objectSubId=0; |
| 358 | +break; |
| 359 | +caseOBJECT_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 | caseCastRelationId: |
656 | 677 | indexoid=CastOidIndexId; |
657 | 678 | break; |
| 679 | +caseForeignDataWrapperRelationId: |
| 680 | +cache=FOREIGNDATAWRAPPEROID; |
| 681 | +break; |
| 682 | +caseForeignServerRelationId: |
| 683 | +cache=FOREIGNSERVEROID; |
| 684 | +break; |
658 | 685 | caseTSParserRelationId: |
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 | +caseOBJECT_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 | caseOBJECT_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 | | -caseOBJECT_FDW: |
842 | 873 | caseOBJECT_TSPARSER: |
843 | 874 | caseOBJECT_TSTEMPLATE: |
844 | 875 | /* We treat these object types as being owned by superusers */ |
|