aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/proclang.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2008-04-29 19:37:13 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2008-04-29 19:37:13 +0000
commit6750c7a7517f293524299d23d4285a0070e165d5 (patch)
tree49076c2e6aa36a739e618dd86d3f67e5b391f428 /src/backend/commands/proclang.c
parent8209e1a9871bd07d872c0c4b2519e355d04509a8 (diff)
downloadpostgresql-6750c7a7517f293524299d23d4285a0070e165d5.tar.gz
postgresql-6750c7a7517f293524299d23d4285a0070e165d5.zip
Fix REASSIGN OWNED so that it works on procedural languages too.
The capability for changing language owners is new in 8.3, so that's how far back this needs to be backpatched. Per bug #4132 by Kirill Simonov.
Diffstat (limited to 'src/backend/commands/proclang.c')
-rw-r--r--src/backend/commands/proclang.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index fa79f55950b..fa945016738 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.74 2008/01/01 19:45:49 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.74.2.1 2008/04/29 19:37:13 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -48,6 +48,8 @@ typedef struct
static void create_proc_lang(const char *languageName,
Oid languageOwner, Oid handlerOid, Oid valOid, bool trusted);
static PLTemplate *find_language_template(const char *languageName);
+static void AlterLanguageOwner_internal(HeapTuple tup, Relation rel,
+ Oid newOwnerId);
/* ---------------------------------------------------------------------
@@ -529,7 +531,6 @@ AlterLanguageOwner(const char *name, Oid newOwnerId)
{
HeapTuple tup;
Relation rel;
- Form_pg_language lanForm;
/* Translate name for consistency with CREATE */
name = case_translate_language_name(name);
@@ -543,6 +544,47 @@ AlterLanguageOwner(const char *name, Oid newOwnerId)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("language \"%s\" does not exist", name)));
+
+ AlterLanguageOwner_internal(tup, rel, newOwnerId);
+
+ ReleaseSysCache(tup);
+
+ heap_close(rel, RowExclusiveLock);
+
+}
+
+/*
+ * Change language owner, specified by OID
+ */
+void
+AlterLanguageOwner_oid(Oid oid, Oid newOwnerId)
+{
+ HeapTuple tup;
+ Relation rel;
+
+ rel = heap_open(LanguageRelationId, RowExclusiveLock);
+
+ tup = SearchSysCache(LANGOID,
+ ObjectIdGetDatum(oid),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tup))
+ elog(ERROR, "cache lookup failed for language %u", oid);
+
+ AlterLanguageOwner_internal(tup, rel, newOwnerId);
+
+ ReleaseSysCache(tup);
+
+ heap_close(rel, RowExclusiveLock);
+}
+
+/*
+ * Workhorse for AlterLanguageOwner variants
+ */
+static void
+AlterLanguageOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
+{
+ Form_pg_language lanForm;
+
lanForm = (Form_pg_language) GETSTRUCT(tup);
/*
@@ -600,7 +642,4 @@ AlterLanguageOwner(const char *name, Oid newOwnerId)
changeDependencyOnOwner(LanguageRelationId, HeapTupleGetOid(tup),
newOwnerId);
}
-
- ReleaseSysCache(tup);
- heap_close(rel, RowExclusiveLock);
}