Index: src/pl/plperl/plperl.c
===================================================================
RCS file: /cvsroot/pgsql/src/pl/plperl/plperl.c,v
retrieving revision 1.132
diff -c -r1.132 plperl.c
*** src/pl/plperl/plperl.c	15 Nov 2007 22:25:17 -0000	1.132
--- src/pl/plperl/plperl.c	29 Nov 2007 05:32:22 -0000
***************
*** 149,154 ****
--- 149,156 ----
  static SV  *newSVstring(const char *str);
  static SV **hv_store_string(HV *hv, const char *key, SV *val);
  static SV **hv_fetch_string(HV *hv, const char *key);
+ static SV  *plperl_create_sub(char *proname, char *s, bool trusted);
+ static SV  *plperl_call_perl_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo);
  
  /*
   * This routine is a crock, and so is everyplace that calls it.  The problem
***************
*** 504,509 ****
--- 506,558 ----
  	else
  	{
  		eval_pv(SAFE_OK, FALSE);
+ 		if (GetDatabaseEncoding() == PG_UTF8)
+ 		{
+ 
+ 			/* 
+ 			 * Fill in just enough information to set up this perl
+ 			 * function in the safe container and call it.
+ 			 * For some reason not entirely clear, it prevents errors that
+ 			 * can arise from the regex code later trying to load
+ 			 * utf8 modules.
+ 			 */
+ 
+ 			plperl_proc_desc desc;			
+ 			FunctionCallInfoData fcinfo;
+ 			FmgrInfo outfunc;
+ 			HeapTuple   typeTup;
+ 			Form_pg_type typeStruct;
+ 			SV *ret;
+ 			SV *func;
+ 
+ 			/* make sure we don't call ourselves recursively */
+ 			plperl_safe_init_done = true;
+ 
+ 			/* compile the function */
+ 			func = plperl_create_sub(
+ 				"utf8fix",
+ 				"return shift =~ /\\xa9/i ? 'true' : 'false' ;",
+ 				true);
+ 
+ 
+ 			/* set up to call the function with a single text argument 'a' */
+ 			desc.reference = func;
+ 			desc.nargs = 1;
+ 			desc.arg_is_rowtype[0] = false;
+ 			fcinfo.argnull[0] = false;
+ 			fcinfo.arg[0] = 
+ 				DatumGetTextP(DirectFunctionCall1(textin, 
+ 												  CStringGetDatum("a")));
+ 			typeTup = SearchSysCache(TYPEOID,
+ 									 TEXTOID,
+ 									 0, 0, 0);
+ 			typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
+ 			fmgr_info(typeStruct->typoutput,&(desc.arg_out_func[0]));
+ 			ReleaseSysCache(typeTup);
+ 			
+ 			/* and make the call */
+ 			ret = plperl_call_perl_func(&desc,&fcinfo);
+ 		}
  	}
  
  	plperl_safe_init_done = true;
