Alvaro Herrera wrote:

> The attached patch should fix the problem.  I'm going to commit to 8.3
> and HEAD in a jiffy.

Really attached this time.  (Thanks Stefan.)

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/catalog/pg_shdepend.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/catalog/pg_shdepend.c,v
retrieving revision 1.23.2.1
diff -c -p -r1.23.2.1 pg_shdepend.c
*** src/backend/catalog/pg_shdepend.c	24 Mar 2008 19:12:58 -0000	1.23.2.1
--- src/backend/catalog/pg_shdepend.c	29 Apr 2008 19:08:26 -0000
***************
*** 32,37 ****
--- 32,38 ----
  #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"
*************** shdepReassignOwned(List *roleids, Oid ne
*** 1342,1347 ****
--- 1343,1352 ----
  					AlterFunctionOwner_oid(sdepForm->objid, newrole);
  					break;
  
+ 				case LanguageRelationId:
+ 					AlterLanguageOwner_oid(sdepForm->objid, newrole);
+ 					break;
+ 
  				default:
  					elog(ERROR, "unexpected classid %d", sdepForm->classid);
  					break;
Index: src/backend/commands/proclang.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/commands/proclang.c,v
retrieving revision 1.74
diff -c -p -r1.74 proclang.c
*** src/backend/commands/proclang.c	1 Jan 2008 19:45:49 -0000	1.74
--- src/backend/commands/proclang.c	29 Apr 2008 19:04:50 -0000
*************** typedef struct
*** 48,53 ****
--- 48,55 ----
  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);
  
  
  /* ---------------------------------------------------------------------
*************** AlterLanguageOwner(const char *name, Oid
*** 529,535 ****
  {
  	HeapTuple	tup;
  	Relation	rel;
- 	Form_pg_language lanForm;
  
  	/* Translate name for consistency with CREATE */
  	name = case_translate_language_name(name);
--- 531,536 ----
*************** AlterLanguageOwner(const char *name, Oid
*** 543,548 ****
--- 544,590 ----
  		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);
  
  	/*
*************** AlterLanguageOwner(const char *name, Oid
*** 600,606 ****
  		changeDependencyOnOwner(LanguageRelationId, HeapTupleGetOid(tup),
  								newOwnerId);
  	}
- 
- 	ReleaseSysCache(tup);
- 	heap_close(rel, RowExclusiveLock);
  }
--- 642,645 ----
Index: src/include/commands/proclang.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/commands/proclang.h,v
retrieving revision 1.12
diff -c -p -r1.12 proclang.h
*** src/include/commands/proclang.h	26 Mar 2007 16:58:41 -0000	1.12
--- src/include/commands/proclang.h	29 Apr 2008 19:04:50 -0000
*************** extern void DropProceduralLanguage(DropP
*** 16,21 ****
--- 16,22 ----
  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 */
-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to