Backported bug fix for #2956.

This commit is contained in:
Michael Meskes 2007-02-27 13:27:13 +00:00
parent 9395aa5392
commit bde73ab21a

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.62.2.1 2007/02/06 09:41:44 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.62.2.2 2007/02/27 13:27:13 meskes Exp $ */
/* /*
* The aim is to get a simpler inteface to the database routines. * The aim is to get a simpler inteface to the database routines.
@ -38,9 +38,11 @@
static char * static char *
quote_postgres(char *arg, bool quote, int lineno) quote_postgres(char *arg, bool quote, int lineno)
{ {
char *res; char *res;
int i, int error;
ri = 0; 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 * if quote is false we just need to store things in a descriptor they
@ -50,29 +52,35 @@ quote_postgres(char *arg, bool quote, int lineno)
return res = ECPGstrdup(arg, lineno); return res = ECPGstrdup(arg, lineno);
else else
{ {
res = (char *) ECPGalloc(2 * strlen(arg) + 3, lineno); length = strlen(arg);
buffer_len = 2 * length + 1;
res = (char *) ECPGalloc(buffer_len + 3, lineno);
if (!res) if (!res)
return (res); return (res);
/* error = 0;
* We don't know if the target database is using escaped_len = PQescapeString(res+1, arg, buffer_len);
* standard_conforming_strings, so we always use E'' strings. if (error)
*/
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)) ECPGfree(res);
res[ri++] = arg[i]; return NULL;
res[ri] = arg[i]; }
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';
} }
res[ri++] = '\'';
res[ri] = '\0';
ECPGfree(arg); ECPGfree(arg);
return res; return res;
} }