Skip to content

Commit b1d32d3

Browse files
committed
Unify drop-by-OID functions
There are a number of Remove${Something}ById() functions that are essentially identical in structure and only different in which catalog they are working on. Refactor this to be one generic function. The information about which oid column, index, etc. to use was already available in ObjectProperty for most catalogs, in a few cases it was easily added. Reviewed-by: Pavel Stehule <[email protected]> Reviewed-by: Robert Haas <[email protected]> Discussion: https://www.postgresql.org/message-id/flat/331d9661-1743-857f-1cbb-d5728bcd62cb%402ndquadrant.com
1 parent b27c90b commit b1d32d3

23 files changed

+175
-619
lines changed

Diff for: src/backend/catalog/aclchk.c

-33
Original file line numberDiff line numberDiff line change
@@ -1498,39 +1498,6 @@ RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid)
14981498
}
14991499

15001500

1501-
/*
1502-
* Remove a pg_default_acl entry
1503-
*/
1504-
void
1505-
RemoveDefaultACLById(Oid defaclOid)
1506-
{
1507-
Relation rel;
1508-
ScanKeyData skey[1];
1509-
SysScanDesc scan;
1510-
HeapTuple tuple;
1511-
1512-
rel = table_open(DefaultAclRelationId, RowExclusiveLock);
1513-
1514-
ScanKeyInit(&skey[0],
1515-
Anum_pg_default_acl_oid,
1516-
BTEqualStrategyNumber, F_OIDEQ,
1517-
ObjectIdGetDatum(defaclOid));
1518-
1519-
scan = systable_beginscan(rel, DefaultAclOidIndexId, true,
1520-
NULL, 1, skey);
1521-
1522-
tuple = systable_getnext(scan);
1523-
1524-
if (!HeapTupleIsValid(tuple))
1525-
elog(ERROR, "could not find tuple for default ACL %u", defaclOid);
1526-
1527-
CatalogTupleDelete(rel, &tuple->t_self);
1528-
1529-
systable_endscan(scan);
1530-
table_close(rel, RowExclusiveLock);
1531-
}
1532-
1533-
15341501
/*
15351502
* expand_col_privileges
15361503
*

Diff for: src/backend/catalog/dependency.c

+76-84
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@
6666
#include "commands/event_trigger.h"
6767
#include "commands/extension.h"
6868
#include "commands/policy.h"
69-
#include "commands/proclang.h"
7069
#include "commands/publicationcmds.h"
71-
#include "commands/schemacmds.h"
7270
#include "commands/seclabel.h"
7371
#include "commands/sequence.h"
7472
#include "commands/trigger.h"
@@ -1223,6 +1221,62 @@ reportDependentObjects(const ObjectAddresses *targetObjects,
12231221
pfree(logdetail.data);
12241222
}
12251223

1224+
/*
1225+
* Drop an object by OID. Works for most catalogs, if no special processing
1226+
* is needed.
1227+
*/
1228+
static void
1229+
DropObjectById(const ObjectAddress *object)
1230+
{
1231+
int cacheId;
1232+
Relation rel;
1233+
HeapTuple tup;
1234+
1235+
cacheId = get_object_catcache_oid(object->classId);
1236+
1237+
rel = table_open(object->classId, RowExclusiveLock);
1238+
1239+
/*
1240+
* Use the system cache for the oid column, if one exists.
1241+
*/
1242+
if (cacheId >= 0)
1243+
{
1244+
tup = SearchSysCache1(cacheId, ObjectIdGetDatum(object->objectId));
1245+
if (!HeapTupleIsValid(tup))
1246+
elog(ERROR, "cache lookup failed for %s %u",
1247+
get_object_class_descr(object->classId), object->objectId);
1248+
1249+
CatalogTupleDelete(rel, &tup->t_self);
1250+
1251+
ReleaseSysCache(tup);
1252+
}
1253+
else
1254+
{
1255+
ScanKeyData skey[1];
1256+
SysScanDesc scan;
1257+
1258+
ScanKeyInit(&skey[0],
1259+
get_object_attnum_oid(object->classId),
1260+
BTEqualStrategyNumber, F_OIDEQ,
1261+
ObjectIdGetDatum(object->objectId));
1262+
1263+
scan = systable_beginscan(rel, get_object_oid_index(object->classId), true,
1264+
NULL, 1, skey);
1265+
1266+
/* we expect exactly one match */
1267+
tup = systable_getnext(scan);
1268+
if (!HeapTupleIsValid(tup))
1269+
elog(ERROR, "could not find tuple for %s %u",
1270+
get_object_class_descr(object->classId), object->objectId);
1271+
1272+
CatalogTupleDelete(rel, &tup->t_self);
1273+
1274+
systable_endscan(scan);
1275+
}
1276+
1277+
table_close(rel, RowExclusiveLock);
1278+
}
1279+
12261280
/*
12271281
* deleteOneObject: delete a single object for performDeletion.
12281282
*
@@ -1376,30 +1430,14 @@ doDeletion(const ObjectAddress *object, int flags)
13761430
RemoveTypeById(object->objectId);
13771431
break;
13781432

1379-
case OCLASS_CAST:
1380-
DropCastById(object->objectId);
1381-
break;
1382-
1383-
case OCLASS_COLLATION:
1384-
RemoveCollationById(object->objectId);
1385-
break;
1386-
13871433
case OCLASS_CONSTRAINT:
13881434
RemoveConstraintById(object->objectId);
13891435
break;
13901436

1391-
case OCLASS_CONVERSION:
1392-
RemoveConversionById(object->objectId);
1393-
break;
1394-
13951437
case OCLASS_DEFAULT:
13961438
RemoveAttrDefaultById(object->objectId);
13971439
break;
13981440

1399-
case OCLASS_LANGUAGE:
1400-
DropProceduralLanguageById(object->objectId);
1401-
break;
1402-
14031441
case OCLASS_LARGEOBJECT:
14041442
LargeObjectDrop(object->objectId);
14051443
break;
@@ -1408,26 +1446,6 @@ doDeletion(const ObjectAddress *object, int flags)
14081446
RemoveOperatorById(object->objectId);
14091447
break;
14101448

1411-
case OCLASS_OPCLASS:
1412-
RemoveOpClassById(object->objectId);
1413-
break;
1414-
1415-
case OCLASS_OPFAMILY:
1416-
RemoveOpFamilyById(object->objectId);
1417-
break;
1418-
1419-
case OCLASS_AM:
1420-
RemoveAccessMethodById(object->objectId);
1421-
break;
1422-
1423-
case OCLASS_AMOP:
1424-
RemoveAmOpEntryById(object->objectId);
1425-
break;
1426-
1427-
case OCLASS_AMPROC:
1428-
RemoveAmProcEntryById(object->objectId);
1429-
break;
1430-
14311449
case OCLASS_REWRITE:
14321450
RemoveRewriteRuleById(object->objectId);
14331451
break;
@@ -1436,73 +1454,47 @@ doDeletion(const ObjectAddress *object, int flags)
14361454
RemoveTriggerById(object->objectId);
14371455
break;
14381456

1439-
case OCLASS_SCHEMA:
1440-
RemoveSchemaById(object->objectId);
1441-
break;
1442-
14431457
case OCLASS_STATISTIC_EXT:
14441458
RemoveStatisticsById(object->objectId);
14451459
break;
14461460

1447-
case OCLASS_TSPARSER:
1448-
RemoveTSParserById(object->objectId);
1449-
break;
1450-
1451-
case OCLASS_TSDICT:
1452-
RemoveTSDictionaryById(object->objectId);
1453-
break;
1454-
1455-
case OCLASS_TSTEMPLATE:
1456-
RemoveTSTemplateById(object->objectId);
1457-
break;
1458-
14591461
case OCLASS_TSCONFIG:
14601462
RemoveTSConfigurationById(object->objectId);
14611463
break;
14621464

1463-
/*
1464-
* OCLASS_ROLE, OCLASS_DATABASE, OCLASS_TBLSPACE intentionally not
1465-
* handled here
1466-
*/
1467-
1468-
case OCLASS_FDW:
1469-
RemoveForeignDataWrapperById(object->objectId);
1470-
break;
1471-
1472-
case OCLASS_FOREIGN_SERVER:
1473-
RemoveForeignServerById(object->objectId);
1474-
break;
1475-
1476-
case OCLASS_USER_MAPPING:
1477-
RemoveUserMappingById(object->objectId);
1478-
break;
1479-
1480-
case OCLASS_DEFACL:
1481-
RemoveDefaultACLById(object->objectId);
1482-
break;
1483-
14841465
case OCLASS_EXTENSION:
14851466
RemoveExtensionById(object->objectId);
14861467
break;
14871468

1488-
case OCLASS_EVENT_TRIGGER:
1489-
RemoveEventTriggerById(object->objectId);
1490-
break;
1491-
14921469
case OCLASS_POLICY:
14931470
RemovePolicyById(object->objectId);
14941471
break;
14951472

1496-
case OCLASS_PUBLICATION:
1497-
RemovePublicationById(object->objectId);
1498-
break;
1499-
15001473
case OCLASS_PUBLICATION_REL:
15011474
RemovePublicationRelById(object->objectId);
15021475
break;
15031476

1477+
case OCLASS_CAST:
1478+
case OCLASS_COLLATION:
1479+
case OCLASS_CONVERSION:
1480+
case OCLASS_LANGUAGE:
1481+
case OCLASS_OPCLASS:
1482+
case OCLASS_OPFAMILY:
1483+
case OCLASS_AM:
1484+
case OCLASS_AMOP:
1485+
case OCLASS_AMPROC:
1486+
case OCLASS_SCHEMA:
1487+
case OCLASS_TSPARSER:
1488+
case OCLASS_TSDICT:
1489+
case OCLASS_TSTEMPLATE:
1490+
case OCLASS_FDW:
1491+
case OCLASS_FOREIGN_SERVER:
1492+
case OCLASS_USER_MAPPING:
1493+
case OCLASS_DEFACL:
1494+
case OCLASS_EVENT_TRIGGER:
1495+
case OCLASS_PUBLICATION:
15041496
case OCLASS_TRANSFORM:
1505-
DropTransformById(object->objectId);
1497+
DropObjectById(object);
15061498
break;
15071499

15081500
/*

0 commit comments

Comments
 (0)