Index: src/backend/tsearch/dict_synonym.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/tsearch/dict_synonym.c,v
retrieving revision 1.4
diff -c -r1.4 dict_synonym.c
*** src/backend/tsearch/dict_synonym.c	25 Aug 2007 02:29:45 -0000	1.4
--- src/backend/tsearch/dict_synonym.c	10 Sep 2007 15:14:21 -0000
***************
*** 29,34 ****
--- 29,35 ----
  typedef struct
  {
  	int			len;	/* length of syn array */
+ 	bool		case_sensitive;
  	Syn		   *syn;
  } DictSyn;
  
***************
*** 83,88 ****
--- 84,90 ----
  			   *end = NULL;
  	int			cur = 0;
  	char	   *line = NULL;
+ 	bool		case_sensitive = false;
  
  	foreach(l, dictoptions)
  	{
***************
*** 95,100 ****
--- 97,107 ----
  					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
  					 errmsg("unrecognized synonym parameter: \"%s\"",
  							defel->defname)));
+ 
+ 		if (pg_strcasecmp("CaseSensitive", defel->defname) == 0 &&
+ 			pg_strcasecmp("True", defGetString(defel)) == 0)
+ 			case_sensitive = true;
+ 
  	}
  
  	if (!filename)
***************
*** 168,173 ****
--- 175,182 ----
  	d->len = cur;
  	qsort(d->syn, d->len, sizeof(Syn), compareSyn);
  
+ 	d->case_sensitive = case_sensitive;
+ 
  	PG_RETURN_POINTER(d);
  }
  
***************
*** 180,195 ****
  	Syn			key,
  			   *found;
  	TSLexeme   *res;
  
  	/* note: d->len test protects against Solaris bsearch-of-no-items bug */
  	if (len <= 0 || d->len <= 0)
  		PG_RETURN_POINTER(NULL);
  
! 	key.in = lowerstr_with_len(in, len);
  	key.out = NULL;
  
  	found = (Syn *) bsearch(&key, d->syn, d->len, sizeof(Syn), compareSyn);
! 	pfree(key.in);
  
  	if (!found)
  		PG_RETURN_POINTER(NULL);
--- 189,214 ----
  	Syn			key,
  			   *found;
  	TSLexeme   *res;
+ 	bool		need_pfree = false;
  
  	/* note: d->len test protects against Solaris bsearch-of-no-items bug */
  	if (len <= 0 || d->len <= 0)
  		PG_RETURN_POINTER(NULL);
  
! 	if (d->case_sensitive)
! 		key.in = in;
! 	else
! 	{
! 		key.in = lowerstr_with_len(in, len);
! 		need_pfree = true;
! 	}
! 
  	key.out = NULL;
  
  	found = (Syn *) bsearch(&key, d->syn, d->len, sizeof(Syn), compareSyn);
! 
! 	if (need_pfree)
! 		pfree(key.in);
  
  	if (!found)
  		PG_RETURN_POINTER(NULL);
