Add an assertion in get_object_address()
authorPeter Eisentraut <[email protected]>
Fri, 15 Nov 2024 07:42:59 +0000 (08:42 +0100)
committerPeter Eisentraut <[email protected]>
Fri, 15 Nov 2024 07:52:43 +0000 (08:52 +0100)
Some places declared a Relation before calling get_object_address()
only to assert that the relation is NULL after the call.

The new assertion allows passing NULL as the relation argument at
those places making the code cleaner and easier to understand.

Author: Bertrand Drouvot <[email protected]>
Discussion: https://www.postgresql.org/message-id/ZzG34eNrT83W/[email protected]

src/backend/catalog/objectaddress.c
src/backend/commands/alter.c

index 85a7b7e641a02d5800463eb61becc186efa7ec15..7520a982151dd1ea070cfb48c1ecf1201f93ef8d 100644 (file)
@@ -896,7 +896,8 @@ static void getRelationIdentity(StringInfo buffer, Oid relid, List **object,
  *
  * If the object is a relation or a child object of a relation (e.g. an
  * attribute or constraint), the relation is also opened and *relp receives
- * the open relcache entry pointer; otherwise, *relp is set to NULL.  This
+ * the open relcache entry pointer; otherwise, *relp is set to NULL.
+ * (relp can be NULL if the caller never passes a relation-related object.)  This
  * is a bit grotty but it makes life simpler, since the caller will
  * typically need the relcache entry too.  Caller must close the relcache
  * entry when done with it.  The relation is locked with the specified lockmode
@@ -1204,8 +1205,12 @@ get_object_address(ObjectType objtype, Node *object,
        old_address = address;
    }
 
+   /* relp must be given if it's a relation */
+   Assert(!relation || relp);
+
    /* Return the object address and the relation. */
-   *relp = relation;
+   if (relp)
+       *relp = relation;
    return address;
 }
 
index 4f99ebb4470a6d648cbe3719e7d0d2acddc82604..a45f3bb6b8347924d14d2497fadbe21fe6f50907 100644 (file)
@@ -421,13 +421,11 @@ ExecRenameStmt(RenameStmt *stmt)
            {
                ObjectAddress address;
                Relation    catalog;
-               Relation    relation;
 
                address = get_object_address(stmt->renameType,
                                             stmt->object,
-                                            &relation,
+                                            NULL,
                                             AccessExclusiveLock, false);
-               Assert(relation == NULL);
 
                catalog = table_open(address.classId, RowExclusiveLock);
                AlterObjectRename_internal(catalog,
@@ -482,8 +480,7 @@ ExecAlterObjectDependsStmt(AlterObjectDependsStmt *stmt, ObjectAddress *refAddre
        table_close(rel, NoLock);
 
    refAddr = get_object_address(OBJECT_EXTENSION, (Node *) stmt->extname,
-                                &rel, AccessExclusiveLock, false);
-   Assert(rel == NULL);
+                                NULL, AccessExclusiveLock, false);
    if (refAddress)
        *refAddress = refAddr;
 
@@ -563,16 +560,14 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt,
        case OBJECT_TSTEMPLATE:
            {
                Relation    catalog;
-               Relation    relation;
                Oid         classId;
                Oid         nspOid;
 
                address = get_object_address(stmt->objectType,
                                             stmt->object,
-                                            &relation,
+                                            NULL,
                                             AccessExclusiveLock,
                                             false);
-               Assert(relation == NULL);
                classId = address.classId;
                catalog = table_open(classId, RowExclusiveLock);
                nspOid = LookupCreationNamespace(stmt->newschema);
@@ -876,15 +871,13 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt)
        case OBJECT_TSDICTIONARY:
        case OBJECT_TSCONFIGURATION:
            {
-               Relation    relation;
                ObjectAddress address;
 
                address = get_object_address(stmt->objectType,
                                             stmt->object,
-                                            &relation,
+                                            NULL,
                                             AccessExclusiveLock,
                                             false);
-               Assert(relation == NULL);
 
                AlterObjectOwner_internal(address.classId, address.objectId,
                                          newowner);