*** execute.c.orig	Tue Feb 27 20:26:50 2007
--- execute.c	Tue Feb 27 20:28:15 2007
***************
*** 38,46 ****
  static char *
  quote_postgres(char *arg, bool quote, int lineno)
  {
! 	char	   *res;
! 	int			i,
! 				ri = 0;
  
  	/*
  	 * if quote is false we just need to store things in a descriptor they
--- 38,48 ----
  static char *
  quote_postgres(char *arg, bool quote, int lineno)
  {
! 	char	*res;
! 	int	error;
! 	size_t  length;
! 	size_t  escaped_len;
! 	size_t  buffer_len;
  
  	/*
  	 * if quote is false we just need to store things in a descriptor they
*************** quote_postgres(char *arg, bool quote, in
*** 50,78 ****
  		return res = ECPGstrdup(arg, lineno);
  	else
  	{
! 		res = (char *) ECPGalloc(2 * strlen(arg) + 3, lineno);
  		if (!res)
  			return (res);
  
! 		/*
! 		 * We don't know if the target database is using
! 		 * standard_conforming_strings, so we always use E'' strings.
! 		 */
! 		if (strchr(arg, '\\') != NULL)
! 			res[ri++] = ESCAPE_STRING_SYNTAX;
! 
! 		res[ri++] = '\'';
! 
! 		for (i = 0; arg[i]; i++, ri++)
  		{
! 			if (SQL_STR_DOUBLE(arg[i], true))
! 				res[ri++] = arg[i];
! 			res[ri] = arg[i];
  		}
- 
- 		res[ri++] = '\'';
- 		res[ri] = '\0';
- 
  		ECPGfree(arg);
  		return res;
  	}
--- 52,86 ----
  		return res = ECPGstrdup(arg, lineno);
  	else
  	{
! 		length = strlen(arg);
! 		buffer_len = 2 * length + 1;
! 		res = (char *) ECPGalloc(buffer_len + 3, lineno);
  		if (!res)
  			return (res);
  
! 		error = 0;
! 		escaped_len = PQescapeString(res+1, arg, buffer_len);
! 		if (error)
  		{
! 			ECPGfree(res);
! 			return NULL;
! 		}
! 		if (length == escaped_len)
! 		{
! 			res[0] = res[escaped_len+1] = '\'';
! 			res[escaped_len+2] = '\0';
! 		}
! 		else
! 		{
! 			/* 
! 			 * We don't know if the target database is using
! 			 * standard_conforming_strings, so we always use E'' strings.
! 			 */
! 			memmove(res+2, res+1, escaped_len);
! 			res[0] = ESCAPE_STRING_SYNTAX;
! 			res[1] = res[escaped_len+2] = '\'';
! 			res[escaped_len+3] = '\0';
  		}
  		ECPGfree(arg);
  		return res;
  	}
