On 6/24/15 2:11 PM, Robert Haas wrote:
Fixing this is easy, but ISTM that we need to insert some sort of a
guard to prevent people from continuing to forget this, because it's
apparently quite easy to do.  Perhaps add_object_address should
Assert(OidIsValid(object_classes[oclass])), plus a (static?) assert
someplace checking that OidIsValid(object_classes[MAX_OCLASS - 1])?

I tried doing this and I'm getting a "static_assert expression is not an integral constant expression" error, even when I reduce it to a simple constant comparison. Maybe I'm just doing something dumb...

If I replace the StaticAssert with Assert(OidIsValid(object_classes[MAX_OCLASS - 1])) it works find and initdb will fail if that assert trips.

I've attached the broken StaticAssert version. Also added a warning comment to the enum.
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Data in Trouble? Get it in Treble! http://BlueTreble.com
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index c1212e9..7adc216 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -2037,6 +2037,15 @@ add_object_address(ObjectClass oclass, Oid objectId, 
int32 subId,
 {
        ObjectAddress *item;
 
+       /*
+        * Ensure object_classes is properly sized. Can't use OidIsValid here
+        * because it's not marked as static (nor should it be).
+        */
+       StaticAssertStmt(object_classes[MAX_OCLASS - 1] != 0,
+                       "last OID in object_classes[] is invalid (did you 
forget to add a new entry to it?)");
+
+       Assert(OidIsValid(object_classes[oclass]));
+
        /* enlarge array if needed */
        if (addrs->numrefs >= addrs->maxrefs)
        {
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 5da18c2..515417d 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -149,6 +149,8 @@ typedef enum ObjectClass
        OCLASS_EVENT_TRIGGER,           /* pg_event_trigger */
        OCLASS_POLICY,                          /* pg_policy */
        OCLASS_TRANSFORM,                       /* pg_transform */
+       
+       /* New classes need to be added to object_classes[] too. */
        MAX_OCLASS                                      /* MUST BE LAST */
 } ObjectClass;
 
-- 
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