From 153affd0584ed5b3b2df0dbc5b0174e91e0994a4 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Sun, 11 Feb 2007 15:18:17 +0000 Subject: [PATCH] Fixed multibyte handling as reported by . --- src/interfaces/ecpg/ChangeLog | 4 +++ src/interfaces/ecpg/ecpglib/execute.c | 52 +++++++++++++++------------ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 36c670d45f..64535e5dbc 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -2165,5 +2165,9 @@ Fr 2. Feb 09:53:48 CET 2007 - Cleaned up va_list handling. Hopefully this now works on all archs. - Applied Magnus Hagander's patch to take away some compiler warnings. + +Su 11. Feb 16:09:31 CET 2007 + + - Fixed multibyte handling as reported by . - Set ecpg library version to 5.3. - Set ecpg version to 4.3.1. diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 2331250bba..bf72920bdc 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.63 2007/02/02 08:58:23 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.64 2007/02/11 15:18:17 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. @@ -38,9 +38,11 @@ static char * quote_postgres(char *arg, bool quote, int lineno) { - char *res; - int i, - ri = 0; + 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 @@ -50,29 +52,35 @@ quote_postgres(char *arg, bool quote, int lineno) return res = ECPGstrdup(arg, lineno); 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) 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++) + error = 0; + escaped_len = PQescapeString(res+1, arg, buffer_len); + if (error) { - if (SQL_STR_DOUBLE(arg[i], true)) - res[ri++] = arg[i]; - res[ri] = arg[i]; + 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'; } - - res[ri++] = '\''; - res[ri] = '\0'; - ECPGfree(arg); return res; } -- 2.40.0