*** execute.c.orig	Tue Feb 27 20:26:36 2007
--- execute.c	Tue Feb 27 20:28:30 2007
***************
*** 38,64 ****
  static char *
  quote_postgres(char *arg, int lineno)
  {
! 	char	   *res = (char *) ECPGalloc(2 * strlen(arg) + 3, lineno);
! 	int			i,
! 				ri = 0;
  
  	if (!res)
  		return (res);
  
! 	if (strchr(arg, '\\') != NULL)
! 		res[ri++] = ESCAPE_STRING_SYNTAX;
! 	res[ri++] = '\'';
! 
! 	for (i = 0; arg[i]; i++, ri++)
  	{
! 		if (SQL_STR_DOUBLE(arg[i]))
! 			res[ri++] = arg[i];
! 		res[ri] = arg[i];
  	}
- 
- 	res[ri++] = '\'';
- 	res[ri] = '\0';
- 
  	ECPGfree(arg);
  	return res;
  }
--- 38,82 ----
  static char *
  quote_postgres(char *arg, 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
+ 	 * will be quoted once they are inserted in a statement
+ 	 */
+ 	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;
  }
