List *objargs, bool missing_ok);
 static bool object_exists(ObjectAddress address);
 
+/*
+ * ObjectProperty
+ *
+ * This array provides a common part of system object structure; to help
+ * consolidate routines to handle various kind of object classes.
+ */
+typedef struct
+{
+   Oid         class_oid;          /* oid of catalog */
+   Oid         oid_index_oid;      /* oid of index on system oid column */
+   int         oid_catcache_id;    /* id of catcache on system oid column  */
+} ObjectPropertyType;
+
+static ObjectPropertyType ObjectProperty[] =
+{
+   {
+       CastRelationId,
+       CastOidIndexId,
+       -1
+   },
+   {
+       CollationRelationId,
+       CollationOidIndexId,
+       COLLOID
+   },
+   {
+       ConstraintRelationId,
+       ConstraintOidIndexId,
+       CONSTROID
+   },
+   {
+       ConversionRelationId,
+       ConversionOidIndexId,
+       CONVOID
+   },
+   {
+       DatabaseRelationId,
+       DatabaseOidIndexId,
+       DATABASEOID
+   },
+   {
+       ExtensionRelationId,
+       ExtensionOidIndexId,
+       -1
+   },
+   {
+       ForeignDataWrapperRelationId,
+       ForeignDataWrapperOidIndexId,
+       FOREIGNDATAWRAPPEROID
+   },
+   {
+       ForeignServerRelationId,
+       ForeignServerOidIndexId,
+       FOREIGNSERVEROID
+   },
+   {
+       ProcedureRelationId,
+       ProcedureOidIndexId,
+       PROCOID
+   },
+   {
+       LanguageRelationId,
+       LanguageOidIndexId,
+       LANGOID
+   },
+   {
+       LargeObjectMetadataRelationId,
+       LargeObjectMetadataOidIndexId,
+       -1
+   },
+   {
+       OperatorClassRelationId,
+       OpclassOidIndexId,
+       CLAOID
+   },
+   {
+       OperatorRelationId,
+       OperatorOidIndexId,
+       OPEROID
+   },
+   {
+       OperatorFamilyRelationId,
+       OpfamilyOidIndexId,
+       OPFAMILYOID
+   },
+   {
+       AuthIdRelationId,
+       AuthIdOidIndexId,
+       AUTHOID
+   },
+   {
+       RewriteRelationId,
+       RewriteOidIndexId,
+       -1
+   },
+   {
+       NamespaceRelationId,
+       NamespaceOidIndexId,
+       NAMESPACEOID
+   },
+   {
+       RelationRelationId,
+       ClassOidIndexId,
+       RELOID
+   },
+   {
+       TableSpaceRelationId,
+       TablespaceOidIndexId,
+       TABLESPACEOID,
+   },
+   {
+       TriggerRelationId,
+       TriggerOidIndexId,
+       -1
+   },
+   {
+       TSConfigRelationId,
+       TSConfigOidIndexId,
+       TSCONFIGOID
+   },
+   {
+       TSDictionaryRelationId,
+       TSDictionaryOidIndexId,
+       TSDICTOID
+   },
+   {
+       TSParserRelationId,
+       TSParserOidIndexId,
+       TSPARSEROID
+   },
+   {
+       TSTemplateRelationId,
+       TSTemplateOidIndexId,
+       TSTEMPLATEOID
+   },
+   {
+       TypeRelationId,
+       TypeOidIndexId,
+       TYPEOID
+   }
+};
 
 /*
  * Translate an object name and arguments (as passed by the parser) to an
            break;
    }
 
-   /* Done */
+   /* Done. */
    address.objectId = RelationGetRelid(relation);
    *relp = relation;
 
        }
        return found;
    }
-
-   /*
-    * For object types that have a relevant syscache, we use it; for
-    * everything else, we'll have to do an index-scan.  This switch sets
-    * either the cache to be used for the syscache lookup, or the index to be
-    * used for the index scan.
-    */
-   switch (address.classId)
+   else 
    {
-       case RelationRelationId:
-           cache = RELOID;
-           break;
-       case RewriteRelationId:
-           indexoid = RewriteOidIndexId;
-           break;
-       case TriggerRelationId:
-           indexoid = TriggerOidIndexId;
-           break;
-       case ConstraintRelationId:
-           cache = CONSTROID;
-           break;
-       case DatabaseRelationId:
-           cache = DATABASEOID;
-           break;
-       case TableSpaceRelationId:
-           cache = TABLESPACEOID;
-           break;
-       case AuthIdRelationId:
-           cache = AUTHOID;
-           break;
-       case NamespaceRelationId:
-           cache = NAMESPACEOID;
-           break;
-       case LanguageRelationId:
-           cache = LANGOID;
-           break;
-       case TypeRelationId:
-           cache = TYPEOID;
-           break;
-       case ProcedureRelationId:
-           cache = PROCOID;
-           break;
-       case OperatorRelationId:
-           cache = OPEROID;
-           break;
-       case CollationRelationId:
-           cache = COLLOID;
-           break;
-       case ConversionRelationId:
-           cache = CONVOID;
-           break;
-       case OperatorClassRelationId:
-           cache = CLAOID;
-           break;
-       case OperatorFamilyRelationId:
-           cache = OPFAMILYOID;
-           break;
-       case LargeObjectRelationId:
+       int         index;
 
-           /*
-            * Weird backward compatibility hack: ObjectAddress notation uses
-            * LargeObjectRelationId for large objects, but since PostgreSQL
-            * 9.0, the relevant catalog is actually
-            * LargeObjectMetadataRelationId.
-            */
+       /*
+        * Weird backward compatibility hack: ObjectAddress notation uses
+        * LargeObjectRelationId for large objects, but since PostgreSQL
+        * 9.0, the relevant catalog is actually LargeObjectMetadataRelationId.
+        */
+       if (address.classId == LargeObjectRelationId)
            address.classId = LargeObjectMetadataRelationId;
-           indexoid = LargeObjectMetadataOidIndexId;
-           break;
-       case CastRelationId:
-           indexoid = CastOidIndexId;
-           break;
-       case ForeignDataWrapperRelationId:
-           cache = FOREIGNDATAWRAPPEROID;
-           break;
-       case ForeignServerRelationId:
-           cache = FOREIGNSERVEROID;
-           break;
-       case TSParserRelationId:
-           cache = TSPARSEROID;
-           break;
-       case TSDictionaryRelationId:
-           cache = TSDICTOID;
-           break;
-       case TSTemplateRelationId:
-           cache = TSTEMPLATEOID;
-           break;
-       case TSConfigRelationId:
-           cache = TSCONFIGOID;
-           break;
-       case ExtensionRelationId:
-           indexoid = ExtensionOidIndexId;
-           break;
-       default:
+
+       /*
+        * For object types that have a relevant syscache, we use it; for
+        * everything else, we'll have to do an index-scan.  Search the
+        * ObjectProperty array to find out which it is.
+        */
+       for (index = 0; index < lengthof(ObjectProperty); index++)
+       {
+           if (ObjectProperty[index].class_oid == address.classId)
+           {
+               cache = ObjectProperty[index].oid_catcache_id;
+               indexoid = ObjectProperty[index].oid_index_oid;
+               break;
+           }
+       }
+       if (index == lengthof(ObjectProperty))
            elog(ERROR, "unrecognized classid: %u", address.classId);
    }