acl.diff
text/x-diff
Filename: acl.diff
Type: text/x-diff
Part: 2
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/foreigncmds.c | 0 | 0 |
| src/backend/commands/typecmds.c | 0 | 0 |
| src/test/regress/expected/foreign_data.out | 0 | 0 |
diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c
new file mode 100644
index a3aeabb..9f7adbf
*** a/src/backend/commands/foreigncmds.c
--- b/src/backend/commands/foreigncmds.c
*************** static void
*** 225,230 ****
--- 225,236 ----
AlterForeignDataWrapperOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
{
Form_pg_foreign_data_wrapper form;
+ Datum repl_val[Natts_pg_foreign_data_wrapper];
+ bool repl_null[Natts_pg_foreign_data_wrapper];
+ bool repl_repl[Natts_pg_foreign_data_wrapper];
+ Acl *newAcl;
+ Datum aclDatum;
+ bool isNull;
form = (Form_pg_foreign_data_wrapper) GETSTRUCT(tup);
*************** AlterForeignDataWrapperOwner_internal(Re
*** 246,252 ****
if (form->fdwowner != newOwnerId)
{
! form->fdwowner = newOwnerId;
simple_heap_update(rel, &tup->t_self, tup);
CatalogUpdateIndexes(rel, tup);
--- 252,278 ----
if (form->fdwowner != newOwnerId)
{
! memset(repl_null, false, sizeof(repl_null));
! memset(repl_repl, false, sizeof(repl_repl));
!
! repl_repl[Anum_pg_foreign_data_wrapper_fdwowner - 1] = true;
! repl_val[Anum_pg_foreign_data_wrapper_fdwowner - 1] = ObjectIdGetDatum(newOwnerId);
!
! aclDatum = heap_getattr(tup,
! Anum_pg_foreign_data_wrapper_fdwacl,
! RelationGetDescr(rel),
! &isNull);
! /* Null ACLs do not require changes */
! if (!isNull)
! {
! newAcl = aclnewowner(DatumGetAclP(aclDatum),
! form->fdwowner, newOwnerId);
! repl_repl[Anum_pg_foreign_data_wrapper_fdwacl - 1] = true;
! repl_val[Anum_pg_foreign_data_wrapper_fdwacl - 1] = PointerGetDatum(newAcl);
! }
!
! tup = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null,
! repl_repl);
simple_heap_update(rel, &tup->t_self, tup);
CatalogUpdateIndexes(rel, tup);
*************** static void
*** 327,332 ****
--- 353,364 ----
AlterForeignServerOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
{
Form_pg_foreign_server form;
+ Datum repl_val[Natts_pg_foreign_server];
+ bool repl_null[Natts_pg_foreign_server];
+ bool repl_repl[Natts_pg_foreign_server];
+ Acl *newAcl;
+ Datum aclDatum;
+ bool isNull;
form = (Form_pg_foreign_server) GETSTRUCT(tup);
*************** AlterForeignServerOwner_internal(Relatio
*** 358,364 ****
}
}
! form->srvowner = newOwnerId;
simple_heap_update(rel, &tup->t_self, tup);
CatalogUpdateIndexes(rel, tup);
--- 390,416 ----
}
}
! memset(repl_null, false, sizeof(repl_null));
! memset(repl_repl, false, sizeof(repl_repl));
!
! repl_repl[Anum_pg_foreign_server_srvowner - 1] = true;
! repl_val[Anum_pg_foreign_server_srvowner - 1] = ObjectIdGetDatum(newOwnerId);
!
! aclDatum = heap_getattr(tup,
! Anum_pg_foreign_server_srvacl,
! RelationGetDescr(rel),
! &isNull);
! /* Null ACLs do not require changes */
! if (!isNull)
! {
! newAcl = aclnewowner(DatumGetAclP(aclDatum),
! form->srvowner, newOwnerId);
! repl_repl[Anum_pg_foreign_server_srvacl - 1] = true;
! repl_val[Anum_pg_foreign_server_srvacl - 1] = PointerGetDatum(newAcl);
! }
!
! tup = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null,
! repl_repl);
simple_heap_update(rel, &tup->t_self, tup);
CatalogUpdateIndexes(rel, tup);
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
new file mode 100644
index 322a3c7..b77e1b4
*** a/src/backend/commands/typecmds.c
--- b/src/backend/commands/typecmds.c
*************** AlterTypeOwner(List *names, Oid newOwner
*** 3376,3387 ****
ATExecChangeOwner(typTup->typrelid, newOwnerId, true, AccessExclusiveLock);
else
{
! /*
! * We can just apply the modification directly.
! *
! * okay to scribble on typTup because it's a copy
! */
! typTup->typowner = newOwnerId;
simple_heap_update(rel, &tup->t_self, tup);
--- 3376,3409 ----
ATExecChangeOwner(typTup->typrelid, newOwnerId, true, AccessExclusiveLock);
else
{
! Datum repl_val[Natts_pg_type];
! bool repl_null[Natts_pg_type];
! bool repl_repl[Natts_pg_type];
! Acl *newAcl;
! Datum aclDatum;
! bool isNull;
!
! memset(repl_null, false, sizeof(repl_null));
! memset(repl_repl, false, sizeof(repl_repl));
!
! repl_repl[Anum_pg_type_typowner - 1] = true;
! repl_val[Anum_pg_type_typowner - 1] = ObjectIdGetDatum(newOwnerId);
!
! aclDatum = heap_getattr(tup,
! Anum_pg_type_typacl,
! RelationGetDescr(rel),
! &isNull);
! /* Null ACLs do not require changes */
! if (!isNull)
! {
! newAcl = aclnewowner(DatumGetAclP(aclDatum),
! typTup->typowner, newOwnerId);
! repl_repl[Anum_pg_type_typacl - 1] = true;
! repl_val[Anum_pg_type_typacl - 1] = PointerGetDatum(newAcl);
! }
!
! tup = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null,
! repl_repl);
simple_heap_update(rel, &tup->t_self, tup);
*************** AlterTypeOwnerInternal(Oid typeOid, Oid
*** 3424,3429 ****
--- 3446,3457 ----
Relation rel;
HeapTuple tup;
Form_pg_type typTup;
+ Datum repl_val[Natts_pg_type];
+ bool repl_null[Natts_pg_type];
+ bool repl_repl[Natts_pg_type];
+ Acl *newAcl;
+ Datum aclDatum;
+ bool isNull;
rel = heap_open(TypeRelationId, RowExclusiveLock);
*************** AlterTypeOwnerInternal(Oid typeOid, Oid
*** 3432,3441 ****
elog(ERROR, "cache lookup failed for type %u", typeOid);
typTup = (Form_pg_type) GETSTRUCT(tup);
! /*
! * Modify the owner --- okay to scribble on typTup because it's a copy
! */
! typTup->typowner = newOwnerId;
simple_heap_update(rel, &tup->t_self, tup);
--- 3460,3486 ----
elog(ERROR, "cache lookup failed for type %u", typeOid);
typTup = (Form_pg_type) GETSTRUCT(tup);
! memset(repl_null, false, sizeof(repl_null));
! memset(repl_repl, false, sizeof(repl_repl));
!
! repl_repl[Anum_pg_type_typowner - 1] = true;
! repl_val[Anum_pg_type_typowner - 1] = ObjectIdGetDatum(newOwnerId);
!
! aclDatum = heap_getattr(tup,
! Anum_pg_type_typacl,
! RelationGetDescr(rel),
! &isNull);
! /* Null ACLs do not require changes */
! if (!isNull)
! {
! newAcl = aclnewowner(DatumGetAclP(aclDatum),
! typTup->typowner, newOwnerId);
! repl_repl[Anum_pg_type_typacl - 1] = true;
! repl_val[Anum_pg_type_typacl - 1] = PointerGetDatum(newAcl);
! }
!
! tup = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null,
! repl_repl);
simple_heap_update(rel, &tup->t_self, tup);
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
new file mode 100644
index 9bca440..4795c83
*** a/src/test/regress/expected/foreign_data.out
--- b/src/test/regress/expected/foreign_data.out
*************** ERROR: role "regress_test_indirect" can
*** 422,461 ****
DETAIL: owner of server s1
privileges for foreign-data wrapper foo
\des+
! List of foreign servers
! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description
! ------+-----------------------+----------------------+-----------------------------------------+--------+---------+--------------------------------------+-------------
! s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user +| | 1.1 | (servername 's1') |
! | | | regress_test_role=U/foreign_data_user | | | |
! s2 | foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') |
! s3 | foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') |
! s4 | foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') |
! s5 | foreign_data_user | foo | | | 15.0 | |
! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | (host 'a', dbname 'b') |
! | | | regress_test_role2=U*/foreign_data_user | | | |
! s7 | foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') |
! s8 | foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') |
! t1 | regress_test_role | foo | | | | |
! t2 | regress_test_role | foo | | | | |
(10 rows)
ALTER SERVER s8 RENAME to s8new;
\des+
! List of foreign servers
! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description
! -------+-----------------------+----------------------+-----------------------------------------+--------+---------+--------------------------------------+-------------
! s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user +| | 1.1 | (servername 's1') |
! | | | regress_test_role=U/foreign_data_user | | | |
! s2 | foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') |
! s3 | foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') |
! s4 | foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') |
! s5 | foreign_data_user | foo | | | 15.0 | |
! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | (host 'a', dbname 'b') |
! | | | regress_test_role2=U*/foreign_data_user | | | |
! s7 | foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') |
! s8new | foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') |
! t1 | regress_test_role | foo | | | | |
! t2 | regress_test_role | foo | | | | |
(10 rows)
ALTER SERVER s8new RENAME to s8;
--- 422,459 ----
DETAIL: owner of server s1
privileges for foreign-data wrapper foo
\des+
! List of foreign servers
! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description
! ------+-----------------------+----------------------+-----------------------------------------------+--------+---------+--------------------------------------+-------------
! s1 | regress_test_indirect | foo | regress_test_indirect=U/regress_test_indirect | | 1.1 | (servername 's1') |
! s2 | foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') |
! s3 | foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') |
! s4 | foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') |
! s5 | foreign_data_user | foo | | | 15.0 | |
! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | (host 'a', dbname 'b') |
! | | | regress_test_role2=U*/foreign_data_user | | | |
! s7 | foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') |
! s8 | foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') |
! t1 | regress_test_role | foo | | | | |
! t2 | regress_test_role | foo | | | | |
(10 rows)
ALTER SERVER s8 RENAME to s8new;
\des+
! List of foreign servers
! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description
! -------+-----------------------+----------------------+-----------------------------------------------+--------+---------+--------------------------------------+-------------
! s1 | regress_test_indirect | foo | regress_test_indirect=U/regress_test_indirect | | 1.1 | (servername 's1') |
! s2 | foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') |
! s3 | foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') |
! s4 | foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') |
! s5 | foreign_data_user | foo | | | 15.0 | |
! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | (host 'a', dbname 'b') |
! | | | regress_test_role2=U*/foreign_data_user | | | |
! s7 | foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') |
! s8new | foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') |
! t1 | regress_test_role | foo | | | | |
! t2 | regress_test_role | foo | | | | |
(10 rows)
ALTER SERVER s8new RENAME to s8;
*************** SELECT * FROM information_schema.user_ma
*** 937,957 ****
(7 rows)
SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | foreign_data_user | regression | | foo | FOREIGN DATA WRAPPER | USAGE | YES
! foreign_data_user | foreign_data_user | regression | | s6 | FOREIGN SERVER | USAGE | YES
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! foreign_data_user | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
(4 rows)
SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | foreign_data_user | regression | | foo | FOREIGN DATA WRAPPER | USAGE | YES
! foreign_data_user | foreign_data_user | regression | | s6 | FOREIGN SERVER | USAGE | YES
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! foreign_data_user | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
(4 rows)
SELECT * FROM information_schema.foreign_tables ORDER BY 1, 2, 3;
--- 935,955 ----
(7 rows)
SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -----------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | foreign_data_user | regression | | foo | FOREIGN DATA WRAPPER | USAGE | YES
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES
! regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
(4 rows)
SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -----------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | foreign_data_user | regression | | foo | FOREIGN DATA WRAPPER | USAGE | YES
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES
! regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
(4 rows)
SELECT * FROM information_schema.foreign_tables ORDER BY 1, 2, 3;
*************** SELECT * FROM information_schema.user_ma
*** 980,997 ****
(5 rows)
SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! foreign_data_user | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
! (2 rows)
SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! foreign_data_user | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
! (2 rows)
DROP USER MAPPING FOR current_user SERVER t1;
SET ROLE regress_test_role2;
--- 978,997 ----
(5 rows)
SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -----------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES
! regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
! (3 rows)
SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
! grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable
! -----------------------+-----------------------+----------------+---------------+-------------+----------------------+----------------+--------------
! foreign_data_user | regress_test_indirect | regression | | foo | FOREIGN DATA WRAPPER | USAGE | NO
! regress_test_indirect | regress_test_indirect | regression | | s6 | FOREIGN SERVER | USAGE | YES
! regress_test_indirect | regress_test_role2 | regression | | s6 | FOREIGN SERVER | USAGE | YES
! (3 rows)
DROP USER MAPPING FOR current_user SERVER t1;
SET ROLE regress_test_role2;