Re: PQescapeBytea* version for parameters - Mailing list pgsql-hackers

From Gregory Stark
Subject Re: PQescapeBytea* version for parameters
Date
Msg-id 87ps2z9clx.fsf@oxford.xeocode.com
Whole thread Raw
In response to Re: PQescapeBytea* version for parameters  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: PQescapeBytea* version for parameters  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
"Tom Lane" <tgl@sss.pgh.pa.us> writes:

> Gregory Stark <stark@enterprisedb.com> writes:
>> Do we want something like this which provides a PQescapeByteaParam for
>> escaping bytea strings before passing them as text-mode parameters in
>> PQexecParam?
>
> Seems a lot easier and more efficient to just pass out-of-line bytea
> parameters as binary mode.

Hm, the cause of the problem with using PQescapeBytea with
standard_comforming_strings as a cheap substitute for an actual
PQescapeByteaParam is that it currently escapes ' as '' regardless of the
setting of standard_conforming_string.

else if (*vp == '\'')
{       *rp++ = '\'';       *rp++ = '\'';
}

Shouldn't it escape ' as \' and not '' if standard_conforming_strings is
false?

What I would actually suggest is that it just escape ' and \ the same way it
does binary characters by inserting the bytea escapes \047 and \134. That
actually simplifies the code quite a bit and avoids a lot of special cases for
standard_conforming_strings.


Index: fe-exec.c
===================================================================
RCS file: /home/stark/src/REPOSITORY/pgsql/src/interfaces/libpq/fe-exec.c,v
retrieving revision 1.192
diff -u -r1.192 fe-exec.c
--- fe-exec.c    5 Jan 2007 22:20:01 -0000    1.192
+++ fe-exec.c    11 Jul 2007 15:34:25 -0000
@@ -2755,28 +2755,13 @@    vp = from;    for (i = from_length; i > 0; i--, vp++)    {
-        if (*vp < 0x20 || *vp > 0x7e)
+        if (*vp < 0x20 || *vp > 0x7e || *vp == '\'' || *vp == '\\')        {            if (!std_strings)
 *rp++ = '\\';            (void) sprintf((char *) rp, "\\%03o", *vp);            rp += 4;        }
 
-        else if (*vp == '\'')
-        {
-            *rp++ = '\'';
-            *rp++ = '\'';
-        }
-        else if (*vp == '\\')
-        {
-            if (!std_strings)
-            {
-                *rp++ = '\\';
-                *rp++ = '\\';
-            }
-            *rp++ = '\\';
-            *rp++ = '\\';
-        }        else            *rp++ = *vp;    }


--  Gregory Stark EnterpriseDB          http://www.enterprisedb.com



pgsql-hackers by date:

Previous
From: Andrew Sullivan
Date:
Subject: Re: 2PC-induced lockup
Next
From: Stefan Kaltenbrunner
Date:
Subject: minor compiler warning on OpenBSD