Any opinions on this idea?  I don't like it all that much, but it's
plenty effective.

Alvaro Herrera wrote:
 
> The problem is that there aren't enough callers of add_object_address:
> there are many indexes of that array that aren't ever accessed and so
> it's not obvious when the array is broken.  If we were to put
> OCLASS_CLASS at the end instead of at the beginning, that would fix the
> problem by making it immediately obvious when things get broken this
> way, because the value used in the most common case would shift around
> every time we add another value.  (Of course, we'd have to instruct
> people to not add new members after the pg_class entry.)

> diff --git a/src/backend/catalog/dependency.c 
> b/src/backend/catalog/dependency.c
> index c1212e9..0107c53 100644
> --- a/src/backend/catalog/dependency.c
> +++ b/src/backend/catalog/dependency.c
> @@ -127,7 +127,6 @@ typedef struct
>   * See also getObjectClass().
>   */
>  static const Oid object_classes[MAX_OCLASS] = {
> -     RelationRelationId,                     /* OCLASS_CLASS */
>       ProcedureRelationId,            /* OCLASS_PROC */
>       TypeRelationId,                         /* OCLASS_TYPE */
>       CastRelationId,                         /* OCLASS_CAST */
> @@ -158,7 +157,9 @@ static const Oid object_classes[MAX_OCLASS] = {
>       DefaultAclRelationId,           /* OCLASS_DEFACL */
>       ExtensionRelationId,            /* OCLASS_EXTENSION */
>       EventTriggerRelationId,         /* OCLASS_EVENT_TRIGGER */
> -     PolicyRelationId                        /* OCLASS_POLICY */
> +     PolicyRelationId,                       /* OCLASS_POLICY */
> +     TransformRelationId,            /* OCLASS_POLICY */
> +     RelationRelationId                      /* OCLASS_CLASS */
>  };
>  
>  
> diff --git a/src/include/catalog/dependency.h 
> b/src/include/catalog/dependency.h
> index 5da18c2..6f4802d 100644
> --- a/src/include/catalog/dependency.h
> +++ b/src/include/catalog/dependency.h
> @@ -112,11 +112,10 @@ typedef struct ObjectAddresses ObjectAddresses;
>  
>  /*
>   * This enum covers all system catalogs whose OIDs can appear in
> - * pg_depend.classId or pg_shdepend.classId.
> + * pg_depend.classId or pg_shdepend.classId.  See also object_classes[].
>   */
>  typedef enum ObjectClass
>  {
> -     OCLASS_CLASS,                           /* pg_class */
>       OCLASS_PROC,                            /* pg_proc */
>       OCLASS_TYPE,                            /* pg_type */
>       OCLASS_CAST,                            /* pg_cast */
> @@ -149,6 +148,11 @@ typedef enum ObjectClass
>       OCLASS_EVENT_TRIGGER,           /* pg_event_trigger */
>       OCLASS_POLICY,                          /* pg_policy */
>       OCLASS_TRANSFORM,                       /* pg_transform */
> +     /*
> +      * Keep this previous-to-last, see
> +      * https://www.postgresql.org/message-id/
> +      */
> +     OCLASS_CLASS,                           /* pg_class */
>       MAX_OCLASS                                      /* MUST BE LAST */
>  } ObjectClass;
>  

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to