*** a/src/backend/catalog/pg_shdepend.c --- b/src/backend/catalog/pg_shdepend.c *************** *** 26,31 **** --- 26,33 ---- #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,1352 **** shdepReassignOwned(List *roleids, Oid newrole) --- 1349,1362 ---- 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; *** a/src/backend/commands/opclasscmds.c --- b/src/backend/commands/opclasscmds.c *************** *** 1995,2000 **** AlterOpClassOwner(List *name, const char *access_method, Oid newOwnerId) --- 1995,2023 ---- } /* + * 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. */ *************** *** 2122,2127 **** AlterOpFamilyOwner(List *name, const char *access_method, Oid newOwnerId) --- 2145,2173 ---- } /* + * 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. */ *** a/src/include/commands/defrem.h --- b/src/include/commands/defrem.h *************** *** 89,95 **** extern void RemoveAmProcEntryById(Oid entryOid); --- 89,97 ---- 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);