Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 89e5ef7

Browse files
committed
Remove ObjectClass type
ObjectClass is an enum whose values correspond to catalog OIDs. But the extra layer of redirection, which is used only in small parts of the code, and the similarity to ObjectType, are confusing and cumbersome. One advantage has been that some switches processing the OCLASS enum don't have "default:" cases. This is so that the compiler tells us when we fail to add support for some new object class. But you can also handle that with some assertions and proper test coverage. It's not even clear how strong this benefit is. For example, in AlterObjectNamespace_oid(), you could still put a new OCLASS into the "ignore object types that don't have schema-qualified names" case, and it might or might not be wrong. Also, there are already various OCLASS switches that do have a default case, so it's not even clear what the preferred coding style should be. Reviewed-by: jian he <jian.universality@gmail.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://www.postgresql.org/message-id/flat/CAGECzQT3caUbcCcszNewCCmMbCuyP7XNAm60J3ybd6PN5kH2Dw%40mail.gmail.com
1 parent 8c4f2d5 commit 89e5ef7

File tree

8 files changed

+233
-641
lines changed

8 files changed

+233
-641
lines changed

src/backend/catalog/dependency.c

Lines changed: 45 additions & 194 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ deleteObjectsInList(ObjectAddresses *targetObjects, Relation *depRel,
206206
if (extra->flags & DEPFLAG_REVERSE)
207207
normal = true;
208208

209-
if (EventTriggerSupportsObjectClass(getObjectClass(thisobj)))
209+
if (EventTriggerSupportsObject(thisobj))
210210
{
211211
EventTriggerSQLDropAddObject(thisobj, original, normal);
212212
}
@@ -1349,9 +1349,9 @@ deleteOneObject(const ObjectAddress *object, Relation *depRel, int flags)
13491349
static void
13501350
doDeletion(const ObjectAddress *object, int flags)
13511351
{
1352-
switch (getObjectClass(object))
1352+
switch (object->classId)
13531353
{
1354-
case OCLASS_CLASS:
1354+
case RelationRelationId:
13551355
{
13561356
char relKind = get_rel_relkind(object->objectId);
13571357

@@ -1382,104 +1382,102 @@ doDeletion(const ObjectAddress *object, int flags)
13821382
break;
13831383
}
13841384

1385-
case OCLASS_PROC:
1385+
case ProcedureRelationId:
13861386
RemoveFunctionById(object->objectId);
13871387
break;
13881388

1389-
case OCLASS_TYPE:
1389+
case TypeRelationId:
13901390
RemoveTypeById(object->objectId);
13911391
break;
13921392

1393-
case OCLASS_CONSTRAINT:
1393+
case ConstraintRelationId:
13941394
RemoveConstraintById(object->objectId);
13951395
break;
13961396

1397-
case OCLASS_DEFAULT:
1397+
case AttrDefaultRelationId:
13981398
RemoveAttrDefaultById(object->objectId);
13991399
break;
14001400

1401-
case OCLASS_LARGEOBJECT:
1401+
case LargeObjectRelationId:
14021402
LargeObjectDrop(object->objectId);
14031403
break;
14041404

1405-
case OCLASS_OPERATOR:
1405+
case OperatorRelationId:
14061406
RemoveOperatorById(object->objectId);
14071407
break;
14081408

1409-
case OCLASS_REWRITE:
1409+
case RewriteRelationId:
14101410
RemoveRewriteRuleById(object->objectId);
14111411
break;
14121412

1413-
case OCLASS_TRIGGER:
1413+
case TriggerRelationId:
14141414
RemoveTriggerById(object->objectId);
14151415
break;
14161416

1417-
case OCLASS_STATISTIC_EXT:
1417+
case StatisticExtRelationId:
14181418
RemoveStatisticsById(object->objectId);
14191419
break;
14201420

1421-
case OCLASS_TSCONFIG:
1421+
case TSConfigRelationId:
14221422
RemoveTSConfigurationById(object->objectId);
14231423
break;
14241424

1425-
case OCLASS_EXTENSION:
1425+
case ExtensionRelationId:
14261426
RemoveExtensionById(object->objectId);
14271427
break;
14281428

1429-
case OCLASS_POLICY:
1429+
case PolicyRelationId:
14301430
RemovePolicyById(object->objectId);
14311431
break;
14321432

1433-
case OCLASS_PUBLICATION_NAMESPACE:
1433+
case PublicationNamespaceRelationId:
14341434
RemovePublicationSchemaById(object->objectId);
14351435
break;
14361436

1437-
case OCLASS_PUBLICATION_REL:
1437+
case PublicationRelRelationId:
14381438
RemovePublicationRelById(object->objectId);
14391439
break;
14401440

1441-
case OCLASS_PUBLICATION:
1441+
case PublicationRelationId:
14421442
RemovePublicationById(object->objectId);
14431443
break;
14441444

1445-
case OCLASS_CAST:
1446-
case OCLASS_COLLATION:
1447-
case OCLASS_CONVERSION:
1448-
case OCLASS_LANGUAGE:
1449-
case OCLASS_OPCLASS:
1450-
case OCLASS_OPFAMILY:
1451-
case OCLASS_AM:
1452-
case OCLASS_AMOP:
1453-
case OCLASS_AMPROC:
1454-
case OCLASS_SCHEMA:
1455-
case OCLASS_TSPARSER:
1456-
case OCLASS_TSDICT:
1457-
case OCLASS_TSTEMPLATE:
1458-
case OCLASS_FDW:
1459-
case OCLASS_FOREIGN_SERVER:
1460-
case OCLASS_USER_MAPPING:
1461-
case OCLASS_DEFACL:
1462-
case OCLASS_EVENT_TRIGGER:
1463-
case OCLASS_TRANSFORM:
1464-
case OCLASS_ROLE_MEMBERSHIP:
1445+
case CastRelationId:
1446+
case CollationRelationId:
1447+
case ConversionRelationId:
1448+
case LanguageRelationId:
1449+
case OperatorClassRelationId:
1450+
case OperatorFamilyRelationId:
1451+
case AccessMethodRelationId:
1452+
case AccessMethodOperatorRelationId:
1453+
case AccessMethodProcedureRelationId:
1454+
case NamespaceRelationId:
1455+
case TSParserRelationId:
1456+
case TSDictionaryRelationId:
1457+
case TSTemplateRelationId:
1458+
case ForeignDataWrapperRelationId:
1459+
case ForeignServerRelationId:
1460+
case UserMappingRelationId:
1461+
case DefaultAclRelationId:
1462+
case EventTriggerRelationId:
1463+
case TransformRelationId:
1464+
case AuthMemRelationId:
14651465
DropObjectById(object);
14661466
break;
14671467

14681468
/*
14691469
* These global object types are not supported here.
14701470
*/
1471-
case OCLASS_ROLE:
1472-
case OCLASS_DATABASE:
1473-
case OCLASS_TBLSPACE:
1474-
case OCLASS_SUBSCRIPTION:
1475-
case OCLASS_PARAMETER_ACL:
1471+
case AuthIdRelationId:
1472+
case DatabaseRelationId:
1473+
case TableSpaceRelationId:
1474+
case SubscriptionRelationId:
1475+
case ParameterAclRelationId:
14761476
elog(ERROR, "global objects cannot be deleted by doDeletion");
14771477
break;
14781478

1479-
/*
1480-
* There's intentionally no default: case here; we want the
1481-
* compiler to warn if a new OCLASS hasn't been handled above.
1482-
*/
1479+
default:
1480+
elog(ERROR, "unsupported object class: %u", object->classId);
14831481
}
14841482
}
14851483

@@ -2774,153 +2772,6 @@ free_object_addresses(ObjectAddresses *addrs)
27742772
pfree(addrs);
27752773
}
27762774

2777-
/*
2778-
* Determine the class of a given object identified by objectAddress.
2779-
*
2780-
* We implement it as a function instead of an array because the OIDs aren't
2781-
* consecutive.
2782-
*/
2783-
ObjectClass
2784-
getObjectClass(const ObjectAddress *object)
2785-
{
2786-
/* only pg_class entries can have nonzero objectSubId */
2787-
if (object->classId != RelationRelationId &&
2788-
object->objectSubId != 0)
2789-
elog(ERROR, "invalid non-zero objectSubId for object class %u",
2790-
object->classId);
2791-
2792-
switch (object->classId)
2793-
{
2794-
case RelationRelationId:
2795-
/* caller must check objectSubId */
2796-
return OCLASS_CLASS;
2797-
2798-
case ProcedureRelationId:
2799-
return OCLASS_PROC;
2800-
2801-
case TypeRelationId:
2802-
return OCLASS_TYPE;
2803-
2804-
case CastRelationId:
2805-
return OCLASS_CAST;
2806-
2807-
case CollationRelationId:
2808-
return OCLASS_COLLATION;
2809-
2810-
case ConstraintRelationId:
2811-
return OCLASS_CONSTRAINT;
2812-
2813-
case ConversionRelationId:
2814-
return OCLASS_CONVERSION;
2815-
2816-
case AttrDefaultRelationId:
2817-
return OCLASS_DEFAULT;
2818-
2819-
case LanguageRelationId:
2820-
return OCLASS_LANGUAGE;
2821-
2822-
case LargeObjectRelationId:
2823-
return OCLASS_LARGEOBJECT;
2824-
2825-
case OperatorRelationId:
2826-
return OCLASS_OPERATOR;
2827-
2828-
case OperatorClassRelationId:
2829-
return OCLASS_OPCLASS;
2830-
2831-
case OperatorFamilyRelationId:
2832-
return OCLASS_OPFAMILY;
2833-
2834-
case AccessMethodRelationId:
2835-
return OCLASS_AM;
2836-
2837-
case AccessMethodOperatorRelationId:
2838-
return OCLASS_AMOP;
2839-
2840-
case AccessMethodProcedureRelationId:
2841-
return OCLASS_AMPROC;
2842-
2843-
case RewriteRelationId:
2844-
return OCLASS_REWRITE;
2845-
2846-
case TriggerRelationId:
2847-
return OCLASS_TRIGGER;
2848-
2849-
case NamespaceRelationId:
2850-
return OCLASS_SCHEMA;
2851-
2852-
case StatisticExtRelationId:
2853-
return OCLASS_STATISTIC_EXT;
2854-
2855-
case TSParserRelationId:
2856-
return OCLASS_TSPARSER;
2857-
2858-
case TSDictionaryRelationId:
2859-
return OCLASS_TSDICT;
2860-
2861-
case TSTemplateRelationId:
2862-
return OCLASS_TSTEMPLATE;
2863-
2864-
case TSConfigRelationId:
2865-
return OCLASS_TSCONFIG;
2866-
2867-
case AuthIdRelationId:
2868-
return OCLASS_ROLE;
2869-
2870-
case AuthMemRelationId:
2871-
return OCLASS_ROLE_MEMBERSHIP;
2872-
2873-
case DatabaseRelationId:
2874-
return OCLASS_DATABASE;
2875-
2876-
case TableSpaceRelationId:
2877-
return OCLASS_TBLSPACE;
2878-
2879-
case ForeignDataWrapperRelationId:
2880-
return OCLASS_FDW;
2881-
2882-
case ForeignServerRelationId:
2883-
return OCLASS_FOREIGN_SERVER;
2884-
2885-
case UserMappingRelationId:
2886-
return OCLASS_USER_MAPPING;
2887-
2888-
case DefaultAclRelationId:
2889-
return OCLASS_DEFACL;
2890-
2891-
case ExtensionRelationId:
2892-
return OCLASS_EXTENSION;
2893-
2894-
case EventTriggerRelationId:
2895-
return OCLASS_EVENT_TRIGGER;
2896-
2897-
case ParameterAclRelationId:
2898-
return OCLASS_PARAMETER_ACL;
2899-
2900-
case PolicyRelationId:
2901-
return OCLASS_POLICY;
2902-
2903-
case PublicationNamespaceRelationId:
2904-
return OCLASS_PUBLICATION_NAMESPACE;
2905-
2906-
case PublicationRelationId:
2907-
return OCLASS_PUBLICATION;
2908-
2909-
case PublicationRelRelationId:
2910-
return OCLASS_PUBLICATION_REL;
2911-
2912-
case SubscriptionRelationId:
2913-
return OCLASS_SUBSCRIPTION;
2914-
2915-
case TransformRelationId:
2916-
return OCLASS_TRANSFORM;
2917-
}
2918-
2919-
/* shouldn't get here */
2920-
elog(ERROR, "unrecognized object class: %u", object->classId);
2921-
return OCLASS_CLASS; /* keep compiler quiet */
2922-
}
2923-
29242775
/*
29252776
* delete initial ACL for extension objects
29262777
*/

0 commit comments

Comments
 (0)