*
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.26 2008/03/26 21:10:37 alvherre Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.27 2008/04/29 19:37:04 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
 #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"
                    AlterFunctionOwner_oid(sdepForm->objid, newrole);
                    break;
 
+               case LanguageRelationId:
+                   AlterLanguageOwner_oid(sdepForm->objid, newrole);
+                   break;
+
                default:
                    elog(ERROR, "unexpected classid %d", sdepForm->classid);
                    break;
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.77 2008/03/27 03:57:33 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.78 2008/04/29 19:37:04 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
 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);
 
 
 /* ---------------------------------------------------------------------
 {
    HeapTuple   tup;
    Relation    rel;
-   Form_pg_language lanForm;
 
    /* Translate name for consistency with CREATE */
    name = case_translate_language_name(name);
        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);
 
    /*
        changeDependencyOnOwner(LanguageRelationId, HeapTupleGetOid(tup),
                                newOwnerId);
    }
-
-   ReleaseSysCache(tup);
-   heap_close(rel, RowExclusiveLock);
 }