]> granicus.if.org Git - postgresql/commitdiff
Allow REASSIGNED OWNED to handle opclasses and opfamilies.
authorRobert Haas <rhaas@postgresql.org>
Sat, 3 Jul 2010 13:53:38 +0000 (13:53 +0000)
committerRobert Haas <rhaas@postgresql.org>
Sat, 3 Jul 2010 13:53:38 +0000 (13:53 +0000)
Backpatch to 8.3, which is as far back as we have opfamilies.
The opclass portion could probably be backpatched to 8.2, when
REASSIGN OWNED was added, but for now I have not done that.

Asko Tiidumaa, with minor adjustments by me.

src/backend/catalog/pg_shdepend.c
src/backend/commands/opclasscmds.c
src/include/commands/defrem.h

index 7fa55d9267d497d81efeda7d1330c2c8e788c7fe..e40ce1c4469b2dc2fdd4fbd14c872017fa7f1317 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.23.2.2 2008/04/29 19:37:13 alvherre Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.23.2.3 2010/07/03 13:53:38 rhaas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -26,6 +26,8 @@
 #include "catalog/pg_language.h"
 #include "catalog/pg_namespace.h"
 #include "catalog/pg_operator.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_opfamily.h"
 #include "catalog/pg_proc.h"
 #include "catalog/pg_shdepend.h"
 #include "catalog/pg_tablespace.h"
@@ -1347,6 +1349,14 @@ shdepReassignOwned(List *roleids, Oid newrole)
                                        AlterLanguageOwner_oid(sdepForm->objid, newrole);
                                        break;
 
+                               case OperatorClassRelationId:
+                                       AlterOpClassOwner_oid(sdepForm->objid, newrole);
+                                       break;
+
+                               case OperatorFamilyRelationId:
+                                       AlterOpFamilyOwner_oid(sdepForm->objid, newrole);
+                                       break;
+
                                default:
                                        elog(ERROR, "unexpected classid %d", sdepForm->classid);
                                        break;
index 7957d0474d91946090318039e99d9594e4cc7472..c7739280e0977c5e9df617f949c80a012929d61e 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.58 2008/01/01 19:45:49 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.58.2.1 2010/07/03 13:53:38 rhaas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1994,6 +1994,27 @@ AlterOpClassOwner(List *name, const char *access_method, Oid newOwnerId)
        heap_close(rel, NoLock);
 }
 
+/*
+ * Change operator class owner, specified by OID
+ */
+void
+AlterOpClassOwner_oid(Oid opclassOid, Oid newOwnerId)
+{
+       HeapTuple       tup;
+       Relation        rel;
+
+       rel = heap_open(OperatorClassRelationId, RowExclusiveLock);
+
+       tup = SearchSysCacheCopy(CLAOID, ObjectIdGetDatum(opclassOid), 0, 0, 0);
+       if (!HeapTupleIsValid(tup))
+               elog(ERROR, "cache lookup failed for opclass %u", opclassOid);
+
+       AlterOpClassOwner_internal(rel, tup, newOwnerId);
+
+       heap_freetuple(tup);
+       heap_close(rel, NoLock);
+}
+
 /*
  * The first parameter is pg_opclass, opened and suitably locked.  The second
  * parameter is a copy of the tuple from pg_opclass we want to modify.
@@ -2121,6 +2142,28 @@ AlterOpFamilyOwner(List *name, const char *access_method, Oid newOwnerId)
        heap_close(rel, NoLock);
 }
 
+/*
+ * Change operator family owner, specified by OID
+ */
+void
+AlterOpFamilyOwner_oid(Oid opfamilyOid, Oid newOwnerId)
+{
+       HeapTuple       tup;
+       Relation        rel;
+
+       rel = heap_open(OperatorFamilyRelationId, RowExclusiveLock);
+
+       tup = SearchSysCacheCopy(OPFAMILYOID, ObjectIdGetDatum(opfamilyOid),
+                                                        0, 0, 0);
+       if (!HeapTupleIsValid(tup))
+               elog(ERROR, "cache lookup failed for opfamily %u", opfamilyOid);
+
+       AlterOpFamilyOwner_internal(rel, tup, newOwnerId);
+
+       heap_freetuple(tup);
+       heap_close(rel, NoLock);
+}
+
 /*
  * The first parameter is pg_opfamily, opened and suitably locked.     The second
  * parameter is a copy of the tuple from pg_opfamily we want to modify.
index 1270a7a5138ad8a8ff0ad5031baf49a3c3757d2b..75a50b8b09b0d760a0d76d650f8e087c6f282406 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.88 2008/01/01 19:45:57 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.88.2.1 2010/07/03 13:53:38 rhaas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -89,7 +89,9 @@ extern void RemoveAmProcEntryById(Oid entryOid);
 extern void RenameOpClass(List *name, const char *access_method, const char *newname);
 extern void RenameOpFamily(List *name, const char *access_method, const char *newname);
 extern void AlterOpClassOwner(List *name, const char *access_method, Oid newOwnerId);
+extern void AlterOpClassOwner_oid(Oid opclassOid, Oid newOwnerId);
 extern void AlterOpFamilyOwner(List *name, const char *access_method, Oid newOwnerId);
+extern void AlterOpFamilyOwner_oid(Oid opfamilyOid, Oid newOwnerId);
 
 /* commands/tsearchcmds.c */
 extern void DefineTSParser(List *names, List *parameters);