summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2008-04-29 19:37:13 +0000
committerAlvaro Herrera2008-04-29 19:37:13 +0000
commit36899489946ee3244f480fdb46785c7915b5bf9b (patch)
tree9fe93be1bd16484db8b4b0b632dffab447e7076b
parentd7cf4cd5ba59a6c396d059631407ad2ad3ef37b2 (diff)
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.
-rw-r--r--src/backend/catalog/pg_shdepend.c5
-rw-r--r--src/backend/commands/proclang.c47
-rw-r--r--src/include/commands/proclang.h1
3 files changed, 49 insertions, 4 deletions
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c
index 303a73ae31..62830de6e1 100644
--- a/src/backend/catalog/pg_shdepend.c
+++ b/src/backend/catalog/pg_shdepend.c
@@ -32,6 +32,7 @@
#include "catalog/pg_type.h"
#include "commands/conversioncmds.h"
#include "commands/defrem.h"
+#include "commands/proclang.h"
#include "commands/schemacmds.h"
#include "commands/tablecmds.h"
#include "commands/typecmds.h"
@@ -1313,6 +1314,10 @@ shdepReassignOwned(List *roleids, Oid newrole)
AlterFunctionOwner_oid(sdepForm->objid, newrole);
break;
+ case LanguageRelationId:
+ AlterLanguageOwner_oid(sdepForm->objid, newrole);
+ break;
+
default:
elog(ERROR, "unexpected classid %d", sdepForm->classid);
break;
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index b4f62bece1..cb027825b0 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -50,6 +50,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);
/* ---------------------------------------------------------------------
@@ -528,7 +530,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);
@@ -542,6 +543,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);
/*
@@ -599,7 +641,4 @@ AlterLanguageOwner(const char *name, Oid newOwnerId)
changeDependencyOnOwner(LanguageRelationId, HeapTupleGetOid(tup),
newOwnerId);
}
-
- ReleaseSysCache(tup);
- heap_close(rel, RowExclusiveLock);
}
diff --git a/src/include/commands/proclang.h b/src/include/commands/proclang.h
index 0ae128285d..07551dd8d5 100644
--- a/src/include/commands/proclang.h
+++ b/src/include/commands/proclang.h
@@ -16,6 +16,7 @@ extern void DropProceduralLanguage(DropPLangStmt *stmt);
extern void DropProceduralLanguageById(Oid langOid);
extern void RenameLanguage(const char *oldname, const char *newname);
extern void AlterLanguageOwner(const char *name, Oid newOwnerId);
+extern void AlterLanguageOwner_oid(Oid oid, Oid newOwnerId);
extern bool PLTemplateExists(const char *languageName);
#endif /* PROCLANG_H */