[ redirecting to pgsql-hackers ]

I wrote:
> Gunnlaugur Thor Briem <gunnlau...@gmail.com> writes:
>> SET search_path = "$user"; SELECT public.unaccent('foo');
>> SET
>> ERROR:  text search dictionary "unaccent" does not exist

> Meh.  I think we need the attached, or something just about like it.
>
> It's barely possible that there's somebody out there who's relying on
> setting the search path to allow choosing among multiple "unaccent"
> dictionaries.  But there are way more people whose functions are
> broken due to the recent search-path-tightening changes.

Here's a slightly more efficient version.

                        regards, tom lane

diff --git a/contrib/unaccent/unaccent.c b/contrib/unaccent/unaccent.c
index 247c202..dbf2bb9 100644
*** a/contrib/unaccent/unaccent.c
--- b/contrib/unaccent/unaccent.c
***************
*** 20,26 ****
--- 20,28 ----
  #include "tsearch/ts_locale.h"
  #include "tsearch/ts_public.h"
  #include "utils/builtins.h"
+ #include "utils/lsyscache.h"
  #include "utils/regproc.h"
+ #include "utils/syscache.h"
  
  PG_MODULE_MAGIC;
  
*************** unaccent_dict(PG_FUNCTION_ARGS)
*** 376,382 ****
  
  	if (PG_NARGS() == 1)
  	{
! 		dictOid = get_ts_dict_oid(stringToQualifiedNameList("unaccent"), false);
  		strArg = 0;
  	}
  	else
--- 378,398 ----
  
  	if (PG_NARGS() == 1)
  	{
! 		/*
! 		 * Use the "unaccent" dictionary that is in the same schema that this
! 		 * function is in.
! 		 */
! 		Oid			procnspid = get_func_namespace(fcinfo->flinfo->fn_oid);
! 		const char *dictname = "unaccent";
! 
! 		dictOid = GetSysCacheOid2(TSDICTNAMENSP,
! 								  PointerGetDatum(dictname),
! 								  ObjectIdGetDatum(procnspid));
! 		if (!OidIsValid(dictOid))
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("text search dictionary \"%s.%s\" does not exist",
! 							get_namespace_name(procnspid), dictname)));
  		strArg = 0;
  	}
  	else

Reply via email to