diff options
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/alter.c | 120 | ||||
-rw-r--r-- | src/backend/commands/collationcmds.c | 9 | ||||
-rw-r--r-- | src/backend/commands/conversioncmds.c | 50 | ||||
-rw-r--r-- | src/backend/commands/dropcmds.c | 1 | ||||
-rw-r--r-- | src/backend/commands/functioncmds.c | 33 | ||||
-rw-r--r-- | src/backend/commands/opclasscmds.c | 104 | ||||
-rw-r--r-- | src/backend/commands/operatorcmds.c | 53 | ||||
-rw-r--r-- | src/backend/commands/tsearchcmds.c | 188 |
8 files changed, 60 insertions, 498 deletions
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index e5b813d19a0..ec7e7c2b4ee 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -173,10 +173,6 @@ 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; @@ -186,18 +182,6 @@ 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: @@ -205,25 +189,42 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) AlterTableNamespace(stmt); break; - case OBJECT_TSPARSER: - AlterTSParserNamespace(stmt->object, stmt->newschema); + 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: - 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); + { + 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,35 +294,23 @@ 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); + { + Relation catalog; + + catalog = heap_open(classId, RowExclusiveLock); + + oldNspOid = AlterObjectNamespace_internal(catalog, objid, + nspOid); + + heap_close(catalog, RowExclusiveLock); + } break; default: @@ -336,32 +325,22 @@ 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) +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,7 +358,8 @@ 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); + namespace = heap_getattr(tup, Anum_namespace, RelationGetDescr(rel), + &isnull); Assert(!isnull); oldNspOid = DatumGetObjectId(namespace); diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index ad7528828bd..8918bfc15b3 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -339,7 +339,7 @@ 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 + * AlterObjectNamespace_internal doesn't know how to deal with the encoding * considerations. */ collation_name = get_collation_name(collOid); @@ -370,12 +370,7 @@ 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); + oldNspOid = AlterObjectNamespace_internal(rel, collOid, newNspOid); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index e36c91ade19..af690b8f2bb 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -266,53 +266,3 @@ 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; -} diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c index 1a569d91ece..25c127b252a 100644 --- a/src/backend/commands/dropcmds.c +++ b/src/backend/commands/dropcmds.c @@ -26,7 +26,6 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "parser/parse_type.h" -#include "utils/acl.h" #include "utils/builtins.h" #include "utils/syscache.h" diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index bf040730fa0..ef6eadc95fd 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -47,6 +47,7 @@ #include "catalog/pg_proc_fn.h" #include "catalog/pg_type.h" #include "catalog/pg_type_fn.h" +#include "commands/alter.h" #include "commands/defrem.h" #include "commands/proclang.h" #include "miscadmin.h" @@ -1851,21 +1852,16 @@ AlterFunctionNamespace_oid(Oid procOid, Oid nspOid) 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 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)), @@ -1877,21 +1873,8 @@ 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); + /* OK, do the work */ + oldNspOid = AlterObjectNamespace_internal(procRel, procOid, nspOid); heap_close(procRel, RowExclusiveLock); diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 7cf4db05115..e26c9477bb1 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -1915,58 +1915,6 @@ 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 @@ -2122,55 +2070,3 @@ 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; -} diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index e0ac0e113b4..0d8dbe4a869 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -423,56 +423,3 @@ 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; -} diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c index 487c7fb1a25..8d2b4c09c93 100644 --- a/src/backend/commands/tsearchcmds.c +++ b/src/backend/commands/tsearchcmds.c @@ -346,52 +346,6 @@ 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 -----------------------*/ /* @@ -626,54 +580,6 @@ 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 @@ -1091,52 +997,6 @@ 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 @@ -1483,54 +1343,6 @@ 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 |