aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/proclang.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2010-08-05 14:45:09 +0000
committerRobert Haas <rhaas@postgresql.org>2010-08-05 14:45:09 +0000
commit2a6ef3445c73473edb222abf108b323fb7f002dc (patch)
treeca6a6f51dcf5193303f466c4072b243e3f979227 /src/backend/commands/proclang.c
parent641459f26954b04f74d098a758b716297b6554ea (diff)
downloadpostgresql-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.c45
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;
+}