mirror of
https://github.com/postgres/postgres.git
synced 2025-05-17 06:41:24 +03:00
Clean out column-level pg_init_privs entries when dropping tables.
DeleteInitPrivs did not get the memo about how, when dropping a whole object (with subid == 0), you should drop entries relating to its sub-objects too. This is visible in the test_pg_dump test case if one drops the extension at the end: the entry for GRANT SELECT(col1) ON regress_pg_dump_table TO public; was still present in pg_init_privs afterwards, although it was pointing to a dangling table OID. Noted while fooling with a fix for REASSIGN OWNED for pg_init_privs entries. This bug is aboriginal in the pg_init_privs feature though, and there seems no reason not to back-patch the fix.
This commit is contained in:
parent
c7de5a6545
commit
198de79612
@ -1328,7 +1328,9 @@ deleteOneObject(const ObjectAddress *object, Relation *depRel, int flags)
|
|||||||
/*
|
/*
|
||||||
* Delete any comments, security labels, or initial privileges associated
|
* Delete any comments, security labels, or initial privileges associated
|
||||||
* with this object. (This is a convenient place to do these things,
|
* with this object. (This is a convenient place to do these things,
|
||||||
* rather than having every object type know to do it.)
|
* rather than having every object type know to do it.) As above, all
|
||||||
|
* these functions must remove records for sub-objects too if the subid is
|
||||||
|
* zero.
|
||||||
*/
|
*/
|
||||||
DeleteComments(object->objectId, object->classId, object->objectSubId);
|
DeleteComments(object->objectId, object->classId, object->objectSubId);
|
||||||
DeleteSecurityLabel(object);
|
DeleteSecurityLabel(object);
|
||||||
@ -2887,6 +2889,7 @@ DeleteInitPrivs(const ObjectAddress *object)
|
|||||||
{
|
{
|
||||||
Relation relation;
|
Relation relation;
|
||||||
ScanKeyData key[3];
|
ScanKeyData key[3];
|
||||||
|
int nkeys;
|
||||||
SysScanDesc scan;
|
SysScanDesc scan;
|
||||||
HeapTuple oldtuple;
|
HeapTuple oldtuple;
|
||||||
|
|
||||||
@ -2900,13 +2903,19 @@ DeleteInitPrivs(const ObjectAddress *object)
|
|||||||
Anum_pg_init_privs_classoid,
|
Anum_pg_init_privs_classoid,
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
BTEqualStrategyNumber, F_OIDEQ,
|
||||||
ObjectIdGetDatum(object->classId));
|
ObjectIdGetDatum(object->classId));
|
||||||
ScanKeyInit(&key[2],
|
if (object->objectSubId != 0)
|
||||||
Anum_pg_init_privs_objsubid,
|
{
|
||||||
BTEqualStrategyNumber, F_INT4EQ,
|
ScanKeyInit(&key[2],
|
||||||
Int32GetDatum(object->objectSubId));
|
Anum_pg_init_privs_objsubid,
|
||||||
|
BTEqualStrategyNumber, F_INT4EQ,
|
||||||
|
Int32GetDatum(object->objectSubId));
|
||||||
|
nkeys = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nkeys = 2;
|
||||||
|
|
||||||
scan = systable_beginscan(relation, InitPrivsObjIndexId, true,
|
scan = systable_beginscan(relation, InitPrivsObjIndexId, true,
|
||||||
NULL, 3, key);
|
NULL, nkeys, key);
|
||||||
|
|
||||||
while (HeapTupleIsValid(oldtuple = systable_getnext(scan)))
|
while (HeapTupleIsValid(oldtuple = systable_getnext(scan)))
|
||||||
CatalogTupleDelete(relation, &oldtuple->t_self);
|
CatalogTupleDelete(relation, &oldtuple->t_self);
|
||||||
|
@ -93,3 +93,10 @@ ALTER EXTENSION test_pg_dump DROP SERVER s0;
|
|||||||
ALTER EXTENSION test_pg_dump DROP TABLE test_pg_dump_t1;
|
ALTER EXTENSION test_pg_dump DROP TABLE test_pg_dump_t1;
|
||||||
ALTER EXTENSION test_pg_dump DROP TYPE test_pg_dump_e1;
|
ALTER EXTENSION test_pg_dump DROP TYPE test_pg_dump_e1;
|
||||||
ALTER EXTENSION test_pg_dump DROP VIEW test_pg_dump_v1;
|
ALTER EXTENSION test_pg_dump DROP VIEW test_pg_dump_v1;
|
||||||
|
DROP EXTENSION test_pg_dump;
|
||||||
|
-- shouldn't be anything left in pg_init_privs
|
||||||
|
SELECT * FROM pg_init_privs WHERE privtype = 'e';
|
||||||
|
objoid | classoid | objsubid | privtype | initprivs
|
||||||
|
--------+----------+----------+----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
@ -106,3 +106,8 @@ ALTER EXTENSION test_pg_dump DROP SERVER s0;
|
|||||||
ALTER EXTENSION test_pg_dump DROP TABLE test_pg_dump_t1;
|
ALTER EXTENSION test_pg_dump DROP TABLE test_pg_dump_t1;
|
||||||
ALTER EXTENSION test_pg_dump DROP TYPE test_pg_dump_e1;
|
ALTER EXTENSION test_pg_dump DROP TYPE test_pg_dump_e1;
|
||||||
ALTER EXTENSION test_pg_dump DROP VIEW test_pg_dump_v1;
|
ALTER EXTENSION test_pg_dump DROP VIEW test_pg_dump_v1;
|
||||||
|
|
||||||
|
DROP EXTENSION test_pg_dump;
|
||||||
|
|
||||||
|
-- shouldn't be anything left in pg_init_privs
|
||||||
|
SELECT * FROM pg_init_privs WHERE privtype = 'e';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user