The attached patch changes ALTER TABLE OWNER to also change the
authorBruce Momjian
Thu, 14 Mar 2002 22:44:50 +0000 (22:44 +0000)
committerBruce Momjian
Thu, 14 Mar 2002 22:44:50 +0000 (22:44 +0000)
ownership of any toast tables that belong to the table that is being
operated upon (as suggested by Tom Lane).

Neil Conway

src/backend/commands/command.c

index b166ed539cd61239b9a0450907c15f6d86fbb584..c32be8b02f397cd9f52009167f5659a7036ac4d8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.160 2002/03/06 19:58:26 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.161 2002/03/14 22:44:50 momjian Exp $
  *
  * NOTES
  *   The PerformAddAttribute() code, like most of the relation
@@ -1619,11 +1619,13 @@ AlterTableOwnerId(Oid relationOid, int32 newOwnerSysId)
    CatalogCloseIndices(Num_pg_class_indices, idescs);
 
    /*
-    * If we are operating on a table, also change the ownership
-    * of all of its indexes.
+    * If we are operating on a table, also change the ownership of any
+    * indexes that belong to the table, as well as the table's toast
+    * table (if it has one)
     */
    if (tuple_class->relkind == RELKIND_RELATION)
    {
+       /* Search for indexes belonging to this table */
        Relation target_rel;
        List *index_oid_list, *i;
 
@@ -1639,6 +1641,12 @@ AlterTableOwnerId(Oid relationOid, int32 newOwnerSysId)
        }
 
        freeList(index_oid_list);
+
+       /* If it has a toast table, recurse to change its ownership */
+       if (tuple_class->reltoastrelid != InvalidOid)
+       {
+           AlterTableOwnerId(tuple_class->reltoastrelid, newOwnerSysId);
+       }
    }
 
    heap_freetuple(tuple);
@@ -1654,10 +1662,11 @@ CheckTupleType(Form_pg_class tuple_class)
        case RELKIND_INDEX:
        case RELKIND_VIEW:
        case RELKIND_SEQUENCE:
+       case RELKIND_TOASTVALUE:
            /* ok to change owner */
            break;
        default:
-           elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table, index, view, or sequence",
+           elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table, TOAST table, index, view, or sequence",
                 NameStr(tuple_class->relname));
    }
 }