*** a/src/backend/catalog/objectaddress.c --- b/src/backend/catalog/objectaddress.c *************** *** 63,69 **** #include "rewrite/rewriteSupport.h" #include "storage/lmgr.h" #include "storage/sinval.h" - #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" --- 63,68 ---- *************** *** 81,87 **** typedef struct --- 80,91 ---- Oid class_oid; /* oid of catalog */ Oid oid_index_oid; /* oid of index on system oid column */ int oid_catcache_id; /* id of catcache on system oid column */ + int name_catcache_id; /* id of catcache on (name,namespace) */ + AttrNumber attnum_name; /* attnum of name field */ AttrNumber attnum_namespace; /* attnum of namespace field */ + AttrNumber attnum_owner; /* attnum of owner field */ + AttrNumber attnum_acl; /* attnum of acl field */ + AclObjectKind acl_kind; /* ACL_KIND_* of this object type */ } ObjectPropertyType; static ObjectPropertyType ObjectProperty[] = *************** *** 90,246 **** static ObjectPropertyType ObjectProperty[] = CastRelationId, CastOidIndexId, -1, ! InvalidAttrNumber }, { CollationRelationId, CollationOidIndexId, COLLOID, ! Anum_pg_collation_collnamespace }, { ConstraintRelationId, ConstraintOidIndexId, CONSTROID, ! Anum_pg_constraint_connamespace }, { ConversionRelationId, ConversionOidIndexId, CONVOID, ! Anum_pg_conversion_connamespace }, { DatabaseRelationId, DatabaseOidIndexId, DATABASEOID, ! InvalidAttrNumber }, { ExtensionRelationId, ExtensionOidIndexId, -1, ! InvalidAttrNumber /* extension doesn't belong to extnamespace */ }, { ForeignDataWrapperRelationId, ForeignDataWrapperOidIndexId, FOREIGNDATAWRAPPEROID, ! InvalidAttrNumber }, { ForeignServerRelationId, ForeignServerOidIndexId, FOREIGNSERVEROID, ! InvalidAttrNumber }, { ProcedureRelationId, ProcedureOidIndexId, PROCOID, ! Anum_pg_proc_pronamespace }, { LanguageRelationId, LanguageOidIndexId, LANGOID, InvalidAttrNumber, }, { LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId, -1, ! InvalidAttrNumber }, { OperatorClassRelationId, OpclassOidIndexId, CLAOID, Anum_pg_opclass_opcnamespace, }, { OperatorRelationId, OperatorOidIndexId, OPEROID, ! Anum_pg_operator_oprnamespace }, { OperatorFamilyRelationId, OpfamilyOidIndexId, OPFAMILYOID, ! Anum_pg_opfamily_opfnamespace }, { AuthIdRelationId, AuthIdOidIndexId, AUTHOID, ! InvalidAttrNumber }, { RewriteRelationId, RewriteOidIndexId, -1, ! InvalidAttrNumber }, { NamespaceRelationId, NamespaceOidIndexId, NAMESPACEOID, ! InvalidAttrNumber }, { RelationRelationId, ClassOidIndexId, RELOID, ! Anum_pg_class_relnamespace }, { TableSpaceRelationId, TablespaceOidIndexId, TABLESPACEOID, ! InvalidAttrNumber }, { TriggerRelationId, TriggerOidIndexId, -1, ! InvalidAttrNumber }, { EventTriggerRelationId, EventTriggerOidIndexId, ! -1, ! InvalidAttrNumber }, { TSConfigRelationId, TSConfigOidIndexId, TSCONFIGOID, ! Anum_pg_ts_config_cfgnamespace }, { TSDictionaryRelationId, TSDictionaryOidIndexId, TSDICTOID, ! Anum_pg_ts_dict_dictnamespace }, { TSParserRelationId, TSParserOidIndexId, TSPARSEROID, ! Anum_pg_ts_parser_prsnamespace }, { TSTemplateRelationId, TSTemplateOidIndexId, TSTEMPLATEOID, Anum_pg_ts_template_tmplnamespace, }, { TypeRelationId, TypeOidIndexId, TYPEOID, ! Anum_pg_type_typnamespace } }; --- 94,380 ---- CastRelationId, CastOidIndexId, -1, ! -1, ! InvalidAttrNumber, ! InvalidAttrNumber, ! InvalidAttrNumber, ! InvalidAttrNumber, ! -1 }, { CollationRelationId, CollationOidIndexId, COLLOID, ! -1, /* COLLNAMEENCNSP also takes encoding */ ! Anum_pg_collation_collname, ! Anum_pg_collation_collnamespace, ! Anum_pg_collation_collowner, ! InvalidAttrNumber, ! ACL_KIND_COLLATION }, { ConstraintRelationId, ConstraintOidIndexId, CONSTROID, ! -1, ! Anum_pg_constraint_conname, ! Anum_pg_constraint_connamespace, ! InvalidAttrNumber, ! InvalidAttrNumber, ! -1 }, { ConversionRelationId, ConversionOidIndexId, CONVOID, ! CONNAMENSP, ! Anum_pg_conversion_conname, ! Anum_pg_conversion_connamespace, ! Anum_pg_conversion_conowner, ! InvalidAttrNumber, ! ACL_KIND_CONVERSION }, { DatabaseRelationId, DatabaseOidIndexId, DATABASEOID, ! -1, ! Anum_pg_database_datname, ! InvalidAttrNumber, ! Anum_pg_database_datdba, ! Anum_pg_database_datacl, ! ACL_KIND_DATABASE }, { ExtensionRelationId, ExtensionOidIndexId, -1, ! -1, ! Anum_pg_extension_extname, ! InvalidAttrNumber, /* extension doesn't belong to extnamespace */ ! Anum_pg_extension_extowner, ! InvalidAttrNumber, ! ACL_KIND_EXTENSION }, { ForeignDataWrapperRelationId, ForeignDataWrapperOidIndexId, FOREIGNDATAWRAPPEROID, ! FOREIGNDATAWRAPPERNAME, ! Anum_pg_foreign_data_wrapper_fdwname, ! InvalidAttrNumber, ! Anum_pg_foreign_data_wrapper_fdwowner, ! Anum_pg_foreign_data_wrapper_fdwacl, ! ACL_KIND_FDW }, { ForeignServerRelationId, ForeignServerOidIndexId, FOREIGNSERVEROID, ! FOREIGNSERVERNAME, ! Anum_pg_foreign_server_srvname, ! InvalidAttrNumber, ! Anum_pg_foreign_server_srvowner, ! Anum_pg_foreign_server_srvacl, ! ACL_KIND_FOREIGN_SERVER }, { ProcedureRelationId, ProcedureOidIndexId, PROCOID, ! -1, /* PROCNAMEARGSNSP also takes argument types */ ! Anum_pg_proc_proname, ! Anum_pg_proc_pronamespace, ! Anum_pg_proc_proowner, ! Anum_pg_proc_proacl, ! ACL_KIND_PROC }, { LanguageRelationId, LanguageOidIndexId, LANGOID, + LANGNAME, + Anum_pg_language_lanname, InvalidAttrNumber, + Anum_pg_language_lanowner, + Anum_pg_language_lanacl, + ACL_KIND_LANGUAGE }, { LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId, -1, ! -1, ! InvalidAttrNumber, ! InvalidAttrNumber, ! Anum_pg_largeobject_metadata_lomowner, ! Anum_pg_largeobject_metadata_lomacl, ! ACL_KIND_LARGEOBJECT }, { OperatorClassRelationId, OpclassOidIndexId, CLAOID, + -1, /* CLAAMNAMENSP also takes opcmethod */ + Anum_pg_opclass_opcname, Anum_pg_opclass_opcnamespace, + Anum_pg_opclass_opcowner, + InvalidAttrNumber, + ACL_KIND_OPCLASS }, { OperatorRelationId, OperatorOidIndexId, OPEROID, ! -1, /* OPERNAMENSP also takes left and right type */ ! Anum_pg_operator_oprname, ! Anum_pg_operator_oprnamespace, ! Anum_pg_operator_oprowner, ! InvalidAttrNumber, ! ACL_KIND_OPER }, { OperatorFamilyRelationId, OpfamilyOidIndexId, OPFAMILYOID, ! -1, /* OPFAMILYAMNAMENSP also takes opfmethod */ ! Anum_pg_opfamily_opfname, ! Anum_pg_opfamily_opfnamespace, ! Anum_pg_opfamily_opfowner, ! InvalidAttrNumber, ! ACL_KIND_OPFAMILY }, { AuthIdRelationId, AuthIdOidIndexId, AUTHOID, ! AUTHNAME, ! Anum_pg_authid_rolname, ! InvalidAttrNumber, ! InvalidAttrNumber, ! InvalidAttrNumber, ! -1 }, { RewriteRelationId, RewriteOidIndexId, -1, ! -1, ! Anum_pg_rewrite_rulename, ! InvalidAttrNumber, ! InvalidAttrNumber, ! InvalidAttrNumber, ! -1 }, { NamespaceRelationId, NamespaceOidIndexId, NAMESPACEOID, ! NAMESPACENAME, ! Anum_pg_namespace_nspname, ! InvalidAttrNumber, ! Anum_pg_namespace_nspowner, ! Anum_pg_namespace_nspacl, ! ACL_KIND_NAMESPACE }, { RelationRelationId, ClassOidIndexId, RELOID, ! RELNAMENSP, ! Anum_pg_class_relname, ! Anum_pg_class_relnamespace, ! Anum_pg_class_relowner, ! Anum_pg_class_relacl, ! ACL_KIND_CLASS }, { TableSpaceRelationId, TablespaceOidIndexId, TABLESPACEOID, ! -1, ! Anum_pg_tablespace_spcname, ! InvalidAttrNumber, ! Anum_pg_tablespace_spcowner, ! Anum_pg_tablespace_spcacl, ! ACL_KIND_TABLESPACE }, { TriggerRelationId, TriggerOidIndexId, -1, ! -1, ! Anum_pg_trigger_tgname, ! InvalidAttrNumber, ! InvalidAttrNumber, ! InvalidAttrNumber, ! -1, }, { EventTriggerRelationId, EventTriggerOidIndexId, ! EVENTTRIGGEROID, ! EVENTTRIGGERNAME, ! Anum_pg_event_trigger_evtname, ! InvalidAttrNumber, ! Anum_pg_event_trigger_evtowner, ! InvalidAttrNumber, ! ACL_KIND_EVENT_TRIGGER, }, { TSConfigRelationId, TSConfigOidIndexId, TSCONFIGOID, ! TSCONFIGNAMENSP, ! Anum_pg_ts_config_cfgname, ! Anum_pg_ts_config_cfgnamespace, ! Anum_pg_ts_config_cfgowner, ! InvalidAttrNumber, ! ACL_KIND_TSCONFIGURATION }, { TSDictionaryRelationId, TSDictionaryOidIndexId, TSDICTOID, ! TSDICTNAMENSP, ! Anum_pg_ts_dict_dictname, ! Anum_pg_ts_dict_dictnamespace, ! Anum_pg_ts_dict_dictowner, ! InvalidAttrNumber, ! ACL_KIND_TSDICTIONARY }, { TSParserRelationId, TSParserOidIndexId, TSPARSEROID, ! TSPARSERNAMENSP, ! Anum_pg_ts_parser_prsname, ! Anum_pg_ts_parser_prsnamespace, ! InvalidAttrNumber, ! InvalidAttrNumber, ! -1, }, { TSTemplateRelationId, TSTemplateOidIndexId, TSTEMPLATEOID, + TSTEMPLATENAMENSP, + Anum_pg_ts_template_tmplname, Anum_pg_ts_template_tmplnamespace, + InvalidAttrNumber, + InvalidAttrNumber, + -1, }, { TypeRelationId, TypeOidIndexId, TYPEOID, ! TYPENAMENSP, ! Anum_pg_type_typname, ! Anum_pg_type_typnamespace, ! Anum_pg_type_typowner, ! Anum_pg_type_typacl, ! ACL_KIND_TYPE } }; *************** *** 1133,1149 **** get_object_namespace(const ObjectAddress *address) } /* * Find ObjectProperty structure by class_id. */ static ObjectPropertyType * get_object_property_data(Oid class_id) { int index; for (index = 0; index < lengthof(ObjectProperty); index++) if (ObjectProperty[index].class_oid == class_id) return &ObjectProperty[index]; ! elog(ERROR, "unrecognized class id: %u", class_id); ! return NULL; /* not reached */ } --- 1267,1363 ---- } /* + * Interfaces to reference fields of ObjectPropertyType + */ + Oid + get_object_oid_index(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->oid_index_oid; + } + + int + get_object_catcache_oid(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->oid_catcache_id; + } + + int + get_object_catcache_name(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->name_catcache_id; + } + + AttrNumber + get_object_attnum_name(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->attnum_name; + } + + AttrNumber + get_object_attnum_namespace(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->attnum_namespace; + } + + AttrNumber + get_object_attnum_owner(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->attnum_owner; + } + + AttrNumber + get_object_attnum_acl(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->attnum_acl; + } + + AclObjectKind + get_object_aclkind(Oid class_id) + { + ObjectPropertyType *prop = get_object_property_data(class_id); + + return prop->acl_kind; + } + + /* * Find ObjectProperty structure by class_id. */ static ObjectPropertyType * get_object_property_data(Oid class_id) { + static ObjectPropertyType *prop_last = NULL; int index; + /* + * A shortcut to speed up multiple consecutive lookups of a particular + * object class. + */ + if (prop_last && prop_last->class_oid == class_id) + return prop_last; + for (index = 0; index < lengthof(ObjectProperty); index++) + { if (ObjectProperty[index].class_oid == class_id) + { + prop_last = &ObjectProperty[index]; return &ObjectProperty[index]; + } + } ! ereport(ERROR, ! (errmsg_internal("unrecognized class id: %u", class_id))); } *** a/src/backend/commands/alter.c --- b/src/backend/commands/alter.c *************** *** 173,182 **** ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) AlterCollationNamespace(stmt->object, stmt->newschema); break; - case OBJECT_CONVERSION: - AlterConversionNamespace(stmt->object, stmt->newschema); - break; - case OBJECT_EXTENSION: AlterExtensionNamespace(stmt->object, stmt->newschema); break; --- 173,178 ---- *************** *** 186,203 **** ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) stmt->newschema); break; - case OBJECT_OPERATOR: - AlterOperatorNamespace(stmt->object, stmt->objarg, stmt->newschema); - break; - - case OBJECT_OPCLASS: - AlterOpClassNamespace(stmt->object, stmt->addname, stmt->newschema); - break; - - case OBJECT_OPFAMILY: - AlterOpFamilyNamespace(stmt->object, stmt->addname, stmt->newschema); - break; - case OBJECT_SEQUENCE: case OBJECT_TABLE: case OBJECT_VIEW: --- 182,187 ---- *************** *** 205,229 **** ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) AlterTableNamespace(stmt); break; ! case OBJECT_TSPARSER: ! AlterTSParserNamespace(stmt->object, stmt->newschema); break; case OBJECT_TSDICTIONARY: - AlterTSDictionaryNamespace(stmt->object, stmt->newschema); - break; - case OBJECT_TSTEMPLATE: - AlterTSTemplateNamespace(stmt->object, stmt->newschema); - break; - case OBJECT_TSCONFIGURATION: ! AlterTSConfigurationNamespace(stmt->object, stmt->newschema); ! break; ! ! case OBJECT_TYPE: ! case OBJECT_DOMAIN: ! AlterTypeNamespace(stmt->object, stmt->newschema, stmt->objectType); break; default: --- 189,230 ---- AlterTableNamespace(stmt); break; ! case OBJECT_TYPE: ! case OBJECT_DOMAIN: ! AlterTypeNamespace(stmt->object, stmt->newschema, stmt->objectType); break; + /* generic code path */ + case OBJECT_CONVERSION: + case OBJECT_OPERATOR: + case OBJECT_OPCLASS: + case OBJECT_OPFAMILY: + case OBJECT_TSPARSER: case OBJECT_TSDICTIONARY: case OBJECT_TSTEMPLATE: case OBJECT_TSCONFIGURATION: ! { ! Relation catalog; ! Relation relation; ! Oid classId; ! Oid nspOid; ! ObjectAddress address; ! ! address = get_object_address(stmt->objectType, ! stmt->object, ! stmt->objarg, ! &relation, ! AccessExclusiveLock, ! false); ! Assert(relation == NULL); ! classId = address.classId; ! catalog = heap_open(classId, RowExclusiveLock); ! nspOid = LookupCreationNamespace(stmt->newschema); ! ! AlterObjectNamespace_internal(catalog, address.objectId, ! nspOid); ! heap_close(catalog, RowExclusiveLock); ! } break; default: *************** *** 293,327 **** AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid) break; case OCLASS_CONVERSION: - oldNspOid = AlterConversionNamespace_oid(objid, nspOid); - break; - case OCLASS_OPERATOR: - oldNspOid = AlterOperatorNamespace_oid(objid, nspOid); - break; - case OCLASS_OPCLASS: - oldNspOid = AlterOpClassNamespace_oid(objid, nspOid); - break; - case OCLASS_OPFAMILY: - oldNspOid = AlterOpFamilyNamespace_oid(objid, nspOid); - break; - case OCLASS_TSPARSER: - oldNspOid = AlterTSParserNamespace_oid(objid, nspOid); - break; - case OCLASS_TSDICT: - oldNspOid = AlterTSDictionaryNamespace_oid(objid, nspOid); - break; - case OCLASS_TSTEMPLATE: - oldNspOid = AlterTSTemplateNamespace_oid(objid, nspOid); - break; - case OCLASS_TSCONFIG: ! oldNspOid = AlterTSConfigurationNamespace_oid(objid, nspOid); break; default: --- 294,316 ---- break; case OCLASS_CONVERSION: case OCLASS_OPERATOR: case OCLASS_OPCLASS: case OCLASS_OPFAMILY: case OCLASS_TSPARSER: case OCLASS_TSDICT: case OCLASS_TSTEMPLATE: case OCLASS_TSCONFIG: ! { ! Relation catalog; ! ! catalog = heap_open(classId, RowExclusiveLock); ! ! oldNspOid = AlterObjectNamespace_internal(catalog, objid, ! nspOid); ! ! heap_close(catalog, RowExclusiveLock); ! } break; default: *************** *** 336,367 **** AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid) * cases (won't work for tables, nor other cases where we need to do more * than change the namespace column of a single catalog entry). * - * The AlterFooNamespace() calls just above will call a function whose job - * is to lookup the arguments for the generic function here. - * * rel: catalog relation containing object (RowExclusiveLock'd by caller) - * oidCacheId: syscache that indexes this catalog by OID - * nameCacheId: syscache that indexes this catalog by name and namespace - * (pass -1 if there is none) * objid: OID of object to change the namespace of * nspOid: OID of new namespace - * Anum_name: column number of catalog's name column - * Anum_namespace: column number of catalog's namespace column - * Anum_owner: column number of catalog's owner column, or -1 if none - * acl_kind: ACL type for object, or -1 if none assigned - * - * If the object does not have an owner or permissions, pass -1 for - * Anum_owner and acl_kind. In this case the calling user must be superuser. * * Returns the OID of the object's previous namespace. */ Oid ! AlterObjectNamespace(Relation rel, int oidCacheId, int nameCacheId, ! Oid objid, Oid nspOid, ! int Anum_name, int Anum_namespace, int Anum_owner, ! AclObjectKind acl_kind) { Oid classId = RelationGetRelid(rel); Oid oldNspOid; Datum name, namespace; --- 325,346 ---- * cases (won't work for tables, nor other cases where we need to do more * than change the namespace column of a single catalog entry). * * rel: catalog relation containing object (RowExclusiveLock'd by caller) * objid: OID of object to change the namespace of * nspOid: OID of new namespace * * Returns the OID of the object's previous namespace. */ Oid ! AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid) { Oid classId = RelationGetRelid(rel); + int oidCacheId = get_object_catcache_oid(classId); + int nameCacheId = get_object_catcache_name(classId); + AttrNumber Anum_name = get_object_attnum_name(classId); + AttrNumber Anum_namespace = get_object_attnum_namespace(classId); + AttrNumber Anum_owner = get_object_attnum_owner(classId); + AclObjectKind acl_kind = get_object_aclkind(classId); Oid oldNspOid; Datum name, namespace; *************** *** 379,385 **** AlterObjectNamespace(Relation rel, int oidCacheId, int nameCacheId, name = heap_getattr(tup, Anum_name, RelationGetDescr(rel), &isnull); Assert(!isnull); ! namespace = heap_getattr(tup, Anum_namespace, RelationGetDescr(rel), &isnull); Assert(!isnull); oldNspOid = DatumGetObjectId(namespace); --- 358,365 ---- name = heap_getattr(tup, Anum_name, RelationGetDescr(rel), &isnull); Assert(!isnull); ! namespace = heap_getattr(tup, Anum_namespace, RelationGetDescr(rel), ! &isnull); Assert(!isnull); oldNspOid = DatumGetObjectId(namespace); *** a/src/backend/commands/collationcmds.c --- b/src/backend/commands/collationcmds.c *************** *** 339,345 **** AlterCollationNamespace_oid(Oid collOid, Oid newNspOid) /* * We have to check for name collision ourselves, because ! * AlterObjectNamespace doesn't know how to deal with the encoding * considerations. */ collation_name = get_collation_name(collOid); --- 339,345 ---- /* * We have to check for name collision ourselves, because ! * AlterObjectNamespace_internal doesn't know how to deal with the encoding * considerations. */ collation_name = get_collation_name(collOid); *************** *** 370,381 **** AlterCollationNamespace_oid(Oid collOid, Oid newNspOid) get_namespace_name(newNspOid)))); /* OK, do the work */ ! oldNspOid = AlterObjectNamespace(rel, COLLOID, -1, ! collOid, newNspOid, ! Anum_pg_collation_collname, ! Anum_pg_collation_collnamespace, ! Anum_pg_collation_collowner, ! ACL_KIND_COLLATION); heap_close(rel, RowExclusiveLock); --- 370,376 ---- get_namespace_name(newNspOid)))); /* OK, do the work */ ! oldNspOid = AlterObjectNamespace_internal(rel, collOid, newNspOid); heap_close(rel, RowExclusiveLock); *** a/src/backend/commands/conversioncmds.c --- b/src/backend/commands/conversioncmds.c *************** *** 266,318 **** AlterConversionOwner_internal(Relation rel, Oid conversionOid, Oid newOwnerId) heap_freetuple(tup); } - - /* - * Execute ALTER CONVERSION SET SCHEMA - */ - void - AlterConversionNamespace(List *name, const char *newschema) - { - Oid convOid, - nspOid; - Relation rel; - - rel = heap_open(ConversionRelationId, RowExclusiveLock); - - convOid = get_conversion_oid(name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, CONVOID, CONNAMENSP, - convOid, nspOid, - Anum_pg_conversion_conname, - Anum_pg_conversion_connamespace, - Anum_pg_conversion_conowner, - ACL_KIND_CONVERSION); - - heap_close(rel, RowExclusiveLock); - } - - /* - * Change conversion schema, by oid - */ - Oid - AlterConversionNamespace_oid(Oid convOid, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(ConversionRelationId, RowExclusiveLock); - - oldNspOid = AlterObjectNamespace(rel, CONVOID, CONNAMENSP, - convOid, newNspOid, - Anum_pg_conversion_conname, - Anum_pg_conversion_connamespace, - Anum_pg_conversion_conowner, - ACL_KIND_CONVERSION); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } --- 266,268 ---- *** a/src/backend/commands/dropcmds.c --- b/src/backend/commands/dropcmds.c *************** *** 26,32 **** #include "miscadmin.h" #include "nodes/makefuncs.h" #include "parser/parse_type.h" - #include "utils/acl.h" #include "utils/builtins.h" #include "utils/syscache.h" --- 26,31 ---- *** a/src/backend/commands/functioncmds.c --- b/src/backend/commands/functioncmds.c *************** *** 1851,1871 **** AlterFunctionNamespace_oid(Oid procOid, Oid nspOid) procRel = heap_open(ProcedureRelationId, RowExclusiveLock); tup = SearchSysCacheCopy1(PROCOID, ObjectIdGetDatum(procOid)); if (!HeapTupleIsValid(tup)) elog(ERROR, "cache lookup failed for function %u", procOid); proc = (Form_pg_proc) GETSTRUCT(tup); - /* check permissions on function */ - if (!pg_proc_ownercheck(procOid, GetUserId())) - aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC, - NameStr(proc->proname)); - - oldNspOid = proc->pronamespace; - - /* common checks on switching namespaces */ - CheckSetNamespace(oldNspOid, nspOid, ProcedureRelationId, procOid); - /* check for duplicate name (more friendly than unique-index failure) */ if (SearchSysCacheExists3(PROCNAMEARGSNSP, CStringGetDatum(NameStr(proc->proname)), --- 1851,1866 ---- procRel = heap_open(ProcedureRelationId, RowExclusiveLock); + /* + * We have to check for name collisions ourselves, because + * AlterObjectNamespace_internal doesn't know how to deal with the + * argument types. + */ tup = SearchSysCacheCopy1(PROCOID, ObjectIdGetDatum(procOid)); if (!HeapTupleIsValid(tup)) elog(ERROR, "cache lookup failed for function %u", procOid); proc = (Form_pg_proc) GETSTRUCT(tup); /* check for duplicate name (more friendly than unique-index failure) */ if (SearchSysCacheExists3(PROCNAMEARGSNSP, CStringGetDatum(NameStr(proc->proname)), *************** *** 1877,1897 **** AlterFunctionNamespace_oid(Oid procOid, Oid nspOid) NameStr(proc->proname), get_namespace_name(nspOid)))); ! /* OK, modify the pg_proc row */ ! ! /* tup is a copy, so we can scribble directly on it */ ! proc->pronamespace = nspOid; ! ! simple_heap_update(procRel, &tup->t_self, tup); ! CatalogUpdateIndexes(procRel, tup); ! ! /* Update dependency on schema */ ! if (changeDependencyFor(ProcedureRelationId, procOid, ! NamespaceRelationId, oldNspOid, nspOid) != 1) ! elog(ERROR, "failed to change schema dependency for function \"%s\"", ! NameStr(proc->proname)); ! ! heap_freetuple(tup); heap_close(procRel, RowExclusiveLock); --- 1872,1879 ---- NameStr(proc->proname), get_namespace_name(nspOid)))); ! /* OK, do the work */ ! oldNspOid = AlterObjectNamespace_internal(procRel, procOid, nspOid); heap_close(procRel, RowExclusiveLock); *** a/src/backend/commands/opclasscmds.c --- b/src/backend/commands/opclasscmds.c *************** *** 1915,1972 **** AlterOpClassOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId) } /* - * ALTER OPERATOR CLASS any_name USING access_method SET SCHEMA name - */ - void - AlterOpClassNamespace(List *name, char *access_method, const char *newschema) - { - Oid amOid; - Relation rel; - Oid opclassOid; - Oid nspOid; - - amOid = get_am_oid(access_method, false); - - rel = heap_open(OperatorClassRelationId, RowExclusiveLock); - - /* Look up the opclass */ - opclassOid = get_opclass_oid(amOid, name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, CLAOID, -1, - opclassOid, nspOid, - Anum_pg_opclass_opcname, - Anum_pg_opclass_opcnamespace, - Anum_pg_opclass_opcowner, - ACL_KIND_OPCLASS); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterOpClassNamespace_oid(Oid opclassOid, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(OperatorClassRelationId, RowExclusiveLock); - - oldNspOid = - AlterObjectNamespace(rel, CLAOID, -1, - opclassOid, newNspOid, - Anum_pg_opclass_opcname, - Anum_pg_opclass_opcnamespace, - Anum_pg_opclass_opcowner, - ACL_KIND_OPCLASS); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } - - /* * Change opfamily owner by name */ void --- 1915,1920 ---- *************** *** 2122,2176 **** get_am_oid(const char *amname, bool missing_ok) errmsg("access method \"%s\" does not exist", amname))); return oid; } - - /* - * ALTER OPERATOR FAMILY any_name USING access_method SET SCHEMA name - */ - void - AlterOpFamilyNamespace(List *name, char *access_method, const char *newschema) - { - Oid amOid; - Relation rel; - Oid opfamilyOid; - Oid nspOid; - - amOid = get_am_oid(access_method, false); - - rel = heap_open(OperatorFamilyRelationId, RowExclusiveLock); - - /* Look up the opfamily */ - opfamilyOid = get_opfamily_oid(amOid, name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, OPFAMILYOID, -1, - opfamilyOid, nspOid, - Anum_pg_opfamily_opfname, - Anum_pg_opfamily_opfnamespace, - Anum_pg_opfamily_opfowner, - ACL_KIND_OPFAMILY); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterOpFamilyNamespace_oid(Oid opfamilyOid, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(OperatorFamilyRelationId, RowExclusiveLock); - - oldNspOid = - AlterObjectNamespace(rel, OPFAMILYOID, -1, - opfamilyOid, newNspOid, - Anum_pg_opfamily_opfname, - Anum_pg_opfamily_opfnamespace, - Anum_pg_opfamily_opfowner, - ACL_KIND_OPFAMILY); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } --- 2070,2072 ---- *** a/src/backend/commands/operatorcmds.c --- b/src/backend/commands/operatorcmds.c *************** *** 423,478 **** AlterOperatorOwner_internal(Relation rel, Oid operOid, Oid newOwnerId) heap_freetuple(tup); } - - /* - * Execute ALTER OPERATOR SET SCHEMA - */ - void - AlterOperatorNamespace(List *names, List *argtypes, const char *newschema) - { - List *operatorName = names; - TypeName *typeName1 = (TypeName *) linitial(argtypes); - TypeName *typeName2 = (TypeName *) lsecond(argtypes); - Oid operOid, - nspOid; - Relation rel; - - rel = heap_open(OperatorRelationId, RowExclusiveLock); - - Assert(list_length(argtypes) == 2); - operOid = LookupOperNameTypeNames(NULL, operatorName, - typeName1, typeName2, - false, -1); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, OPEROID, -1, - operOid, nspOid, - Anum_pg_operator_oprname, - Anum_pg_operator_oprnamespace, - Anum_pg_operator_oprowner, - ACL_KIND_OPER); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterOperatorNamespace_oid(Oid operOid, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(OperatorRelationId, RowExclusiveLock); - - oldNspOid = AlterObjectNamespace(rel, OPEROID, -1, - operOid, newNspOid, - Anum_pg_operator_oprname, - Anum_pg_operator_oprnamespace, - Anum_pg_operator_oprowner, - ACL_KIND_OPER); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } --- 423,425 ---- *** a/src/backend/commands/tsearchcmds.c --- b/src/backend/commands/tsearchcmds.c *************** *** 346,397 **** RenameTSParser(List *oldname, const char *newname) heap_freetuple(tup); } - /* - * ALTER TEXT SEARCH PARSER any_name SET SCHEMA name - */ - void - AlterTSParserNamespace(List *name, const char *newschema) - { - Oid prsId, - nspOid; - Relation rel; - - rel = heap_open(TSParserRelationId, RowExclusiveLock); - - prsId = get_ts_parser_oid(name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, TSPARSEROID, TSPARSERNAMENSP, - prsId, nspOid, - Anum_pg_ts_parser_prsname, - Anum_pg_ts_parser_prsnamespace, - -1, -1); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterTSParserNamespace_oid(Oid prsId, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(TSParserRelationId, RowExclusiveLock); - - oldNspOid = - AlterObjectNamespace(rel, TSPARSEROID, TSPARSERNAMENSP, - prsId, newNspOid, - Anum_pg_ts_parser_prsname, - Anum_pg_ts_parser_prsnamespace, - -1, -1); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } - /* ---------------------- TS Dictionary commands -----------------------*/ /* --- 346,351 ---- *************** *** 626,679 **** RenameTSDictionary(List *oldname, const char *newname) } /* - * ALTER TEXT SEARCH DICTIONARY any_name SET SCHEMA name - */ - void - AlterTSDictionaryNamespace(List *name, const char *newschema) - { - Oid dictId, - nspOid; - Relation rel; - - rel = heap_open(TSDictionaryRelationId, RowExclusiveLock); - - dictId = get_ts_dict_oid(name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, TSDICTOID, TSDICTNAMENSP, - dictId, nspOid, - Anum_pg_ts_dict_dictname, - Anum_pg_ts_dict_dictnamespace, - Anum_pg_ts_dict_dictowner, - ACL_KIND_TSDICTIONARY); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterTSDictionaryNamespace_oid(Oid dictId, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(TSDictionaryRelationId, RowExclusiveLock); - - oldNspOid = - AlterObjectNamespace(rel, TSDICTOID, TSDICTNAMENSP, - dictId, newNspOid, - Anum_pg_ts_dict_dictname, - Anum_pg_ts_dict_dictnamespace, - Anum_pg_ts_dict_dictowner, - ACL_KIND_TSDICTIONARY); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } - - /* * Guts of TS dictionary deletion. */ void --- 580,585 ---- *************** *** 1091,1142 **** RenameTSTemplate(List *oldname, const char *newname) } /* - * ALTER TEXT SEARCH TEMPLATE any_name SET SCHEMA name - */ - void - AlterTSTemplateNamespace(List *name, const char *newschema) - { - Oid tmplId, - nspOid; - Relation rel; - - rel = heap_open(TSTemplateRelationId, RowExclusiveLock); - - tmplId = get_ts_template_oid(name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, TSTEMPLATEOID, TSTEMPLATENAMENSP, - tmplId, nspOid, - Anum_pg_ts_template_tmplname, - Anum_pg_ts_template_tmplnamespace, - -1, -1); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterTSTemplateNamespace_oid(Oid tmplId, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(TSTemplateRelationId, RowExclusiveLock); - - oldNspOid = - AlterObjectNamespace(rel, TSTEMPLATEOID, TSTEMPLATENAMENSP, - tmplId, newNspOid, - Anum_pg_ts_template_tmplname, - Anum_pg_ts_template_tmplnamespace, - -1, -1); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } - - /* * Guts of TS template deletion. */ void --- 997,1002 ---- *************** *** 1483,1536 **** RenameTSConfiguration(List *oldname, const char *newname) } /* - * ALTER TEXT SEARCH CONFIGURATION any_name SET SCHEMA name - */ - void - AlterTSConfigurationNamespace(List *name, const char *newschema) - { - Oid cfgId, - nspOid; - Relation rel; - - rel = heap_open(TSConfigRelationId, RowExclusiveLock); - - cfgId = get_ts_config_oid(name, false); - - /* get schema OID */ - nspOid = LookupCreationNamespace(newschema); - - AlterObjectNamespace(rel, TSCONFIGOID, TSCONFIGNAMENSP, - cfgId, nspOid, - Anum_pg_ts_config_cfgname, - Anum_pg_ts_config_cfgnamespace, - Anum_pg_ts_config_cfgowner, - ACL_KIND_TSCONFIGURATION); - - heap_close(rel, RowExclusiveLock); - } - - Oid - AlterTSConfigurationNamespace_oid(Oid cfgId, Oid newNspOid) - { - Oid oldNspOid; - Relation rel; - - rel = heap_open(TSConfigRelationId, RowExclusiveLock); - - oldNspOid = - AlterObjectNamespace(rel, TSCONFIGOID, TSCONFIGNAMENSP, - cfgId, newNspOid, - Anum_pg_ts_config_cfgname, - Anum_pg_ts_config_cfgnamespace, - Anum_pg_ts_config_cfgowner, - ACL_KIND_TSCONFIGURATION); - - heap_close(rel, RowExclusiveLock); - - return oldNspOid; - } - - /* * Guts of TS configuration deletion. */ void --- 1343,1348 ---- *** a/src/backend/nodes/copyfuncs.c --- b/src/backend/nodes/copyfuncs.c *************** *** 2932,2938 **** _copyAlterObjectSchemaStmt(const AlterObjectSchemaStmt *from) COPY_NODE_FIELD(relation); COPY_NODE_FIELD(object); COPY_NODE_FIELD(objarg); - COPY_STRING_FIELD(addname); COPY_STRING_FIELD(newschema); COPY_SCALAR_FIELD(missing_ok); --- 2932,2937 ---- *** a/src/backend/nodes/equalfuncs.c --- b/src/backend/nodes/equalfuncs.c *************** *** 1336,1342 **** _equalAlterObjectSchemaStmt(const AlterObjectSchemaStmt *a, const AlterObjectSch COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(object); COMPARE_NODE_FIELD(objarg); - COMPARE_STRING_FIELD(addname); COMPARE_STRING_FIELD(newschema); COMPARE_SCALAR_FIELD(missing_ok); --- 1336,1341 ---- *** a/src/backend/parser/gram.y --- b/src/backend/parser/gram.y *************** *** 7146,7152 **** AlterObjectSchemaStmt: AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); n->objectType = OBJECT_OPCLASS; n->object = $4; ! n->addname = $6; n->newschema = $9; n->missing_ok = false; $$ = (Node *)n; --- 7146,7152 ---- AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); n->objectType = OBJECT_OPCLASS; n->object = $4; ! n->objarg = list_make1(makeString($6)); n->newschema = $9; n->missing_ok = false; $$ = (Node *)n; *************** *** 7156,7162 **** AlterObjectSchemaStmt: AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); n->objectType = OBJECT_OPFAMILY; n->object = $4; ! n->addname = $6; n->newschema = $9; n->missing_ok = false; $$ = (Node *)n; --- 7156,7162 ---- AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); n->objectType = OBJECT_OPFAMILY; n->object = $4; ! n->objarg = list_make1(makeString($6)); n->newschema = $9; n->missing_ok = false; $$ = (Node *)n; *** a/src/include/catalog/objectaddress.h --- b/src/include/catalog/objectaddress.h *************** *** 15,20 **** --- 15,21 ---- #include "nodes/parsenodes.h" #include "storage/lock.h" + #include "utils/acl.h" #include "utils/relcache.h" /* *************** *** 37,40 **** extern void check_object_ownership(Oid roleid, --- 38,50 ---- extern Oid get_object_namespace(const ObjectAddress *address); + extern Oid get_object_oid_index(Oid class_id); + extern int get_object_catcache_oid(Oid class_id); + extern int get_object_catcache_name(Oid class_id); + extern AttrNumber get_object_attnum_name(Oid class_id); + extern AttrNumber get_object_attnum_namespace(Oid class_id); + extern AttrNumber get_object_attnum_owner(Oid class_id); + extern AttrNumber get_object_attnum_acl(Oid class_id); + extern AclObjectKind get_object_aclkind(Oid class_id); + #endif /* PARSE_OBJECT_H */ *** a/src/include/commands/alter.h --- b/src/include/commands/alter.h *************** *** 14,29 **** #ifndef ALTER_H #define ALTER_H ! #include "utils/acl.h" #include "utils/relcache.h" extern void ExecRenameStmt(RenameStmt *stmt); extern void ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt); extern Oid AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid); ! extern Oid AlterObjectNamespace(Relation rel, int oidCacheId, int nameCacheId, ! Oid objid, Oid nspOid, ! int Anum_name, int Anum_namespace, int Anum_owner, ! AclObjectKind acl_kind); extern void ExecAlterOwnerStmt(AlterOwnerStmt *stmt); #endif /* ALTER_H */ --- 14,26 ---- #ifndef ALTER_H #define ALTER_H ! #include "nodes/parsenodes.h" #include "utils/relcache.h" extern void ExecRenameStmt(RenameStmt *stmt); extern void ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt); extern Oid AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid); ! extern Oid AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid); extern void ExecAlterOwnerStmt(AlterOwnerStmt *stmt); #endif /* ALTER_H */ *** a/src/include/commands/conversioncmds.h --- b/src/include/commands/conversioncmds.h *************** *** 21,27 **** extern void CreateConversionCommand(CreateConversionStmt *parsetree); extern void RenameConversion(List *name, const char *newname); extern void AlterConversionOwner(List *name, Oid newOwnerId); extern void AlterConversionOwner_oid(Oid conversionOid, Oid newOwnerId); - extern void AlterConversionNamespace(List *name, const char *newschema); - extern Oid AlterConversionNamespace_oid(Oid convOid, Oid newNspOid); #endif /* CONVERSIONCMDS_H */ --- 21,25 ---- *** a/src/include/commands/defrem.h --- b/src/include/commands/defrem.h *************** *** 64,71 **** extern void RemoveOperatorById(Oid operOid); extern void AlterOperatorOwner(List *name, TypeName *typeName1, TypeName *typename2, Oid newOwnerId); extern void AlterOperatorOwner_oid(Oid operOid, Oid newOwnerId); - extern void AlterOperatorNamespace(List *names, List *argtypes, const char *newschema); - extern Oid AlterOperatorNamespace_oid(Oid operOid, Oid newNspOid); /* commands/aggregatecmds.c */ extern void DefineAggregate(List *name, List *args, bool oldstyle, --- 64,69 ---- *************** *** 85,96 **** extern void RenameOpClass(List *name, const char *access_method, const char *new 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 AlterOpClassNamespace(List *name, char *access_method, const char *newschema); - extern Oid AlterOpClassNamespace_oid(Oid opclassOid, Oid newNspOid); extern void AlterOpFamilyOwner(List *name, const char *access_method, Oid newOwnerId); extern void AlterOpFamilyOwner_oid(Oid opfamilyOid, Oid newOwnerId); - extern void AlterOpFamilyNamespace(List *name, char *access_method, const char *newschema); - extern Oid AlterOpFamilyNamespace_oid(Oid opfamilyOid, Oid newNspOid); extern Oid get_am_oid(const char *amname, bool missing_ok); extern Oid get_opclass_oid(Oid amID, List *opclassname, bool missing_ok); extern Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok); --- 83,90 ---- *************** *** 98,105 **** extern Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok); /* commands/tsearchcmds.c */ extern void DefineTSParser(List *names, List *parameters); extern void RenameTSParser(List *oldname, const char *newname); - extern void AlterTSParserNamespace(List *name, const char *newschema); - extern Oid AlterTSParserNamespace_oid(Oid prsId, Oid newNspOid); extern void RemoveTSParserById(Oid prsId); extern void DefineTSDictionary(List *names, List *parameters); --- 92,97 ---- *************** *** 107,119 **** extern void RenameTSDictionary(List *oldname, const char *newname); extern void RemoveTSDictionaryById(Oid dictId); extern void AlterTSDictionary(AlterTSDictionaryStmt *stmt); extern void AlterTSDictionaryOwner(List *name, Oid newOwnerId); - extern void AlterTSDictionaryNamespace(List *name, const char *newschema); - extern Oid AlterTSDictionaryNamespace_oid(Oid dictId, Oid newNspOid); extern void DefineTSTemplate(List *names, List *parameters); extern void RenameTSTemplate(List *oldname, const char *newname); - extern void AlterTSTemplateNamespace(List *name, const char *newschema); - extern Oid AlterTSTemplateNamespace_oid(Oid tmplId, Oid newNspOid); extern void RemoveTSTemplateById(Oid tmplId); extern void DefineTSConfiguration(List *names, List *parameters); --- 99,107 ---- *************** *** 121,128 **** extern void RenameTSConfiguration(List *oldname, const char *newname); extern void RemoveTSConfigurationById(Oid cfgId); extern void AlterTSConfiguration(AlterTSConfigurationStmt *stmt); extern void AlterTSConfigurationOwner(List *name, Oid newOwnerId); - extern void AlterTSConfigurationNamespace(List *name, const char *newschema); - extern Oid AlterTSConfigurationNamespace_oid(Oid cfgId, Oid newNspOid); extern text *serialize_deflist(List *deflist); extern List *deserialize_deflist(Datum txt); --- 109,114 ---- *** a/src/include/nodes/parsenodes.h --- b/src/include/nodes/parsenodes.h *************** *** 2168,2174 **** typedef struct AlterObjectSchemaStmt RangeVar *relation; /* in case it's a table */ List *object; /* in case it's some other object */ List *objarg; /* argument types, if applicable */ - char *addname; /* additional name if needed */ char *newschema; /* the new schema */ bool missing_ok; /* skip error if missing? */ } AlterObjectSchemaStmt; --- 2168,2173 ----