Thread: BUG #13736: pg_dump should use E'' quotes

BUG #13736: pg_dump should use E'' quotes

From
felipe@felipegasper.com
Date:
The following bug has been logged on the website:

Bug reference:      13736
Logged by:          Felipe Gasper
Email address:      felipe@felipegasper.com
PostgreSQL version: 9.4.5
Operating system:   Linux
Description:

When dumping a DB whose name has a backslash in it, I get a warning like:

------
pg_dump: WARNING:  nonstandard use of \\ in a string literal
LINE 1: ...) AS description FROM pg_database WHERE datname = 'i have / ...
                                                             ^
HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
------

pg_dump should be using PostgreSQL’s own recommended syntax, should it not?
Is there anything that would break from making this change?

Re: BUG #13736: pg_dump should use E'' quotes

From
Tom Lane
Date:
felipe@felipegasper.com writes:
> When dumping a DB whose name has a backslash in it, I get a warning like:

> ------
> pg_dump: WARNING:  nonstandard use of \\ in a string literal
> LINE 1: ...) AS description FROM pg_database WHERE datname = 'i have / ...
>                                                              ^
> HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
> ------

It took me some time to reproduce that, but I eventually realized that
you must have standard_conforming_strings turned off in your database
settings.  This has been a deprecated setting since 9.1.

> pg_dump should be using PostgreSQL’s own recommended syntax, should it not?
> Is there anything that would break from making this change?

Yes.  For one thing, there would immediately be zero chance of loading
view definitions produced by pg_dump into any other DBMS, or even into old
versions of PG, without painstaking hand-editing to remove all the E's
(and then also fix the string contents, which would likely be actively
wrong without E).

We could avoid the problem by having pg_dump force
standard_conforming_strings to ON rather than adopting the prevailing
database setting, but again that would complicate back-porting its output
to older PG versions.  It might also annoy people who are accustomed to
seeing old-style strings in their dumps; presumably people who are still
using standard_conforming_strings = OFF are a bit set in their ways.

Basically there are a number of tradeoffs here and avoiding a purely
cosmetic warning is the consideration that loses out.

At some point we might decide that backward compatibility to old PG
versions is no longer of interest; but what we'd probably do then is have
pg_dump force standard_conforming_strings to ON, not adopt E'' syntax.

            regards, tom lane

Re: BUG #13736: pg_dump should use E'' quotes

From
"David G. Johnston"
Date:
On Mon, Oct 26, 2015 at 5:33 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> felipe@felipegasper.com writes:
> > When dumping a DB whose name has a backslash in it, I get a warning lik=
e:
>
> > ------
> > pg_dump: WARNING:  nonstandard use of \\ in a string literal
> > LINE 1: ...) AS description FROM pg_database WHERE datname =3D 'i have =
/
> ...
> >                                                              ^
> > HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
> > ------
>
> It took me some time to reproduce that, but I eventually realized that
> you must have standard_conforming_strings turned off in your database
> settings.


=E2=80=8B[...]
=E2=80=8B


>
> Yes.  For one thing, there would immediately be zero chance of loading
> view definitions produced by pg_dump into any other DBMS,


Ironic...=E2=80=8Bwe cannot write a standard conforming string out because =
we are
concerned other databases will be unable to read it.

The OP is advised to set "escape_string_warning" to "off" if they also wish
to have "standard_conforming_strings" set to "off".  The question then is
whether we should do so during restore regardless of whether the user has
done so.

David J.

Re: BUG #13736: pg_dump should use E'' quotes

From
Tom Lane
Date:
"David G. Johnston" <david.g.johnston@gmail.com> writes:
> On Mon, Oct 26, 2015 at 5:33 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Yes.  For one thing, there would immediately be zero chance of loading
>> view definitions produced by pg_dump into any other DBMS,

> Ironic...​we cannot write a standard conforming string out because we are
> concerned other databases will be unable to read it.

Hm?  The E'' syntax would specifically *not* be standard conforming.

            regards, tom lane

Re: BUG #13736: pg_dump should use E'' quotes

From
Felipe Gasper
Date:
On 26 Oct 2015 4:55 PM, David G. Johnston wrote:
> On Mon, Oct 26, 2015 at 5:33 PM, Tom Lane <tgl@sss.pgh.pa.us
> <mailto:tgl@sss.pgh.pa.us>>wrote:
>
>     felipe@felipegasper.com <mailto:felipe@felipegasper.com> writes:
>     > When dumping a DB whose name has a backslash in it, I get a warning like:
>
>     > ------
>     > pg_dump: WARNING:  nonstandard use of \\ in a string literal
>     > LINE 1: ...) AS description FROM pg_database WHERE datname = 'i have / ...
>     >                                                              ^
>     > HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
>     > ------
>
>     It took me some time to reproduce that, but I eventually realized that
>     you must have standard_conforming_strings turned off in your database
>     settings.
>
>
> ​[...]
> ​
>
>
>     Yes.  For one thing, there would immediately be zero chance of loading
>     view definitions produced by pg_dump into any other DBMS,
>
>
> Ironic...​we cannot write a standard conforming string out because we
> are concerned other databases will be unable to read it.
>
> The OP is advised to set "escape_string_warning" to "off" if they also
> wish to have "standard_conforming_strings" set to "off".  The question
> then is whether we should do so during restore regardless of whether the
> user has done so.

The problem is that I don’t control the DB server...

-FG

Re: BUG #13736: pg_dump should use E'' quotes

From
Andres Freund
Date:
On 2015-10-26 17:06:04 -0500, Felipe Gasper wrote:
> The problem is that I don’t control the DB server...

PGOPTIONS='-c standard_conforming_strings=on -c escape_string_warning=off' pg_dump

ought to do the trick.

Re: BUG #13736: pg_dump should use E'' quotes

From
"David G. Johnston"
Date:
On Mon, Oct 26, 2015 at 6:05 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> "David G. Johnston" <david.g.johnston@gmail.com> writes:
> > On Mon, Oct 26, 2015 at 5:33 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >> Yes.  For one thing, there would immediately be zero chance of loading
> >> view definitions produced by pg_dump into any other DBMS,
>
> > Ironic...=E2=80=8Bwe cannot write a standard conforming string out beca=
use we are
> > concerned other databases will be unable to read it.
>
> Hm?  The E'' syntax would specifically *not* be standard conforming.
>

=E2=80=8BI apparently always mis-understood what it was getting at...=E2=80=
=8B

From this I gather that standard conforming strings do not have any concept
of
=E2=80=8Bslash-=E2=80=8B
escaping
=E2=80=8B, just the=E2=80=8B
doubling-up the uni-quote
=E2=80=8B,=E2=80=8B
and so we introduced a non-standard version with an "E" prefix that
maintains the escaping behavior previously allowed?

I think part of my confusing was assuming that the normal was to allow
slash-escaping...which if we are outputting such in order to expect
external tools to accept the data for input would seem to be a reasonable
assumption.

David J.
=E2=80=8B

Re: BUG #13736: pg_dump should use E'' quotes

From
Felipe Gasper
Date:
On 26 Oct 2015 5:08 PM, Andres Freund wrote:
> On 2015-10-26 17:06:04 -0500, Felipe Gasper wrote:
>> The problem is that I don’t control the DB server...
>
> PGOPTIONS='-c standard_conforming_strings=on -c escape_string_warning=off' pg_dump
>
> ought to do the trick.
>

Confirmed -- thank you! :)

-F

Re: BUG #13736: pg_dump should use E'' quotes

From
Peter Eisentraut
Date:
On 10/26/15 5:33 PM, Tom Lane wrote:
> We could avoid the problem by having pg_dump force
> standard_conforming_strings to ON rather than adopting the prevailing
> database setting,

It does do that.

What it doesn't do is set escape_string_warning, which is really what
the reporter would need.  (There is code in pg_dump to do it, but it
apparently only runs when standard_confirming_string is not set.  I
haven't traced what that code is really meant to do.)