diff options
author | Robert Haas <rhaas@postgresql.org> | 2010-08-05 14:45:09 +0000 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2010-08-05 14:45:09 +0000 |
commit | 2a6ef3445c73473edb222abf108b323fb7f002dc (patch) | |
tree | ca6a6f51dcf5193303f466c4072b243e3f979227 /src/backend/commands/proclang.c | |
parent | 641459f26954b04f74d098a758b716297b6554ea (diff) | |
download | postgresql-2a6ef3445c73473edb222abf108b323fb7f002dc.tar.gz postgresql-2a6ef3445c73473edb222abf108b323fb7f002dc.zip |
Standardize get_whatever_oid functions for object types with
unqualified names.
- Add a missing_ok parameter to get_tablespace_oid.
- Avoid duplicating get_tablespace_od guts in objectNamesToOids.
- Add a missing_ok parameter to get_database_oid.
- Replace get_roleid and get_role_checked with get_role_oid.
- Add get_namespace_oid, get_language_oid, get_am_oid.
- Refactor existing code to use new interfaces.
Thanks to KaiGai Kohei for the review.
Diffstat (limited to 'src/backend/commands/proclang.c')
-rw-r--r-- | src/backend/commands/proclang.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index 8292ae1f777..4fcc9dd8098 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.91 2010/02/26 02:00:39 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.92 2010/08/05 14:45:01 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -514,7 +514,7 @@ void DropProceduralLanguage(DropPLangStmt *stmt) { char *languageName; - HeapTuple langTup; + Oid oid; ObjectAddress object; /* @@ -522,34 +522,26 @@ DropProceduralLanguage(DropPLangStmt *stmt) */ languageName = case_translate_language_name(stmt->plname); - langTup = SearchSysCache1(LANGNAME, CStringGetDatum(languageName)); - if (!HeapTupleIsValid(langTup)) + oid = get_language_oid(languageName, stmt->missing_ok); + if (!OidIsValid(oid)) { - if (!stmt->missing_ok) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("language \"%s\" does not exist", languageName))); - else - ereport(NOTICE, - (errmsg("language \"%s\" does not exist, skipping", - languageName))); - + ereport(NOTICE, + (errmsg("language \"%s\" does not exist, skipping", + languageName))); return; } /* * Check permission */ - if (!pg_language_ownercheck(HeapTupleGetOid(langTup), GetUserId())) + if (!pg_language_ownercheck(oid, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_LANGUAGE, languageName); object.classId = LanguageRelationId; - object.objectId = HeapTupleGetOid(langTup); + object.objectId = oid; object.objectSubId = 0; - ReleaseSysCache(langTup); - /* * Do the deletion */ @@ -735,3 +727,22 @@ AlterLanguageOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId) newOwnerId); } } + +/* + * get_language_oid - given a language name, look up the OID + * + * If missing_ok is false, throw an error if language name not found. If + * true, just return InvalidOid. + */ +Oid +get_language_oid(const char *langname, bool missing_ok) +{ + Oid oid; + + oid = GetSysCacheOid1(LANGNAME, CStringGetDatum(langname)); + if (!OidIsValid(oid) && !missing_ok) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("language \"%s\" does not exist", langname))); + return oid; +} |