Thread: Fwd: Bug#249036: postgresql: zero bytes cannot be entered in string literal, not even with \000 notation

Hi PostgreSQL hackers!

We recently got the Debian bug report below. Does anybody have an idea about that?

Thanks and have a nice day!

Martin

----- Forwarded message from Peter Schueller <peter.schueller@rise.tuwien.ac.at> -----

Subject: Bug#249036: postgresql: zero bytes cannot be entered in string
    literal, not even with \000 notation
Reply-To: Peter Schueller <peter.schueller@rise.tuwien.ac.at>,
   249036@bugs.debian.org
From: Peter Schueller <peter.schueller@rise.tuwien.ac.at>
To: submit@bugs.debian.org
Date: Fri, 14 May 2004 17:26:33 +0200
X-Spam-Status: No, hits=0.0 required=4.0 tests=none autolearn=no version=2.61

Package: postgresql
Severity: normal


if i issue the following query:
$ select decode(encode('\001\000\001'::bytea,'hex'),'hex');
the result will always be '\001' and not '\001\000\001' as assumable.

i think the string is handled zero-delimited and not with its given
size,
and i think in this case this is not the wanted behaviour because to
enter any bytea with zero bytes one will have to use
decode('my string in hex', 'hex'), only then the zero bytes will be
stored
correctly.

versions:
ii  postgresql     7.4.2-4        Object-relational SQL database, ...
ii  postgresql-cli 7.4.2-4        Front-end programs for PostgreSQL

thx,
Peter Schueller

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.6
Locale: LANG=C, LC_CTYPE=C





----- End forwarded message -----

--
Martin Pitt                 Debian GNU/Linux Developer
martin@piware.de                      mpitt@debian.org
http://www.piware.de             http://www.debian.org

Re: Fwd: Bug#249036: postgresql: zero bytes cannot be entered

From
Bruce Momjian
Date:
Martin Pitt wrote:
> Hi PostgreSQL hackers!
>
> We recently got the Debian bug report below. Does anybody have an idea about that?
>
> Thanks and have a nice day!
>
> if i issue the following query:
> $ select decode(encode('\001\000\001'::bytea,'hex'),'hex');
> the result will always be '\001' and not '\001\000\001' as assumable.
>
> i think the string is handled zero-delimited and not with its given
> size,
> and i think in this case this is not the wanted behaviour because to
> enter any bytea with zero bytes one will have to use
> decode('my string in hex', 'hex'), only then the zero bytes will be
> stored
> correctly.

The issue is that bytea needs double-backslashes because single
backslashes are processed by the parser into strings:

    test=> select decode(encode('\001\000\001'::bytea,'hex'),'hex');
     decode
    --------
     \001
    (1 row)

    test=> select decode(encode('\\001\\000\\001'::bytea,'hex'),'hex');
        decode
    --------------
     \001\000\001
    (1 row)

This is all in the documentation.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Hi!

On 2004-05-17  8:37 -0400, Bruce Momjian wrote:
> The issue is that bytea needs double-backslashes because single
> backslashes are processed by the parser into strings:

Indeed. Thank you for this!

Martin

--=20
Martin Pitt                 Debian GNU/Linux Developer
martin@piware.de                      mpitt@debian.org
http://www.piware.de             http://www.debian.org