Обсуждение: pg_restore silently chokes on object comments/descriptions ending in a backslash
pg_restore silently chokes on object comments/descriptions ending in a backslash
От
 
		    	Julian Mehnle
		    Дата:
		        I observe the following issue on PostgreSQL 9.0.4 on at least the
following platforms:
  * FreeBSD 6.3 (amd64)
    `uname -a`:
    FreeBSD <hostname> 6.3-STABLE FreeBSD 6.3-STABLE #1: Fri May 30 18:11:4=
7 PDT 2008
      root@<hostname>:/data/obj/data/home/<username>/symbols/builddir_amd64=
/usr/src/sys/MESSAGING_GATEWAY.amd64_INSTALL  amd64
  * Mac OS X 10.6.8 (i386)
    `uname -a`:
    Darwin joule 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 P=
DT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386 i386
  * semi-current Debian testing (amd64)
    `uname -a`:
    Linux gray 2.6.30-2-amd64 #1 SMP Mon Dec 7 05:21:45 UTC 2009 x86_64 GNU=
/Linux
If the comment/description of a database object (table, function, etc.)
ends in a backslash (which generally works fine otherwise), then
pg_restore is unable to completely restore a custom-format dump of the
schema.  pg_restore does not complain, but silently(!) stops issuing DDL
statements to the server starting with the first "COMMENT ON =E2=80=A6" sta=
tement
that would have set an object comment/description ending in a backslash.
Reproduce as follows:
    $ createdb test0
    $ createdb test1
    $ psql -c "CREATE TABLE bar (); COMMENT ON TABLE bar IS 'bar\\';" test0
    COMMENT
    $ psql -c "CREATE TABLE foo (); COMMENT ON TABLE foo IS 'foo';" test0
    COMMENT
    $ pg_dump --format custom --file test0.pg_dump --schema-only test0
    $ pg_restore -d test1 test0.pg_dump=20
    $ psql -c '\dt+' test0
                       List of relations
     Schema | Name | Type  | Owner  |  Size   | Description=20
    --------+------+-------+--------+---------+-------------
     public | bar  | table | julian | 0 bytes | bar\
     public | foo  | table | julian | 0 bytes | foo
    (2 rows)
=20=20=20=20
    $ psql -c '\dt+' test1
                       List of relations
     Schema | Name | Type  | Owner  |  Size   | Description=20
    --------+------+-------+--------+---------+-------------
     public | bar  | table | julian | 0 bytes |=20
    (1 row)
This also happens with PostgreSQL 8.4.
To demonstrate that this is not an academic issue, these are a few
functions I have defined, and their comments:
    List of functions
    -[ RECORD 1 ]-------+--------------------------------------------------=
----------------------
    Schema              | public
    Name                | escape_are
    ...                 : ...
    Description         | escape advanced regexp (ARE) special characters: =
.*+?|[](){}^$\
    -[ RECORD 2 ]-------+--------------------------------------------------=
----------------------
    Schema              | public
    Name                | escape_control
    ...                 : ...
    Description         | escape control characters: \a\b\t\n\v\f\r\e\\
    -[ RECORD 3 ]-------+--------------------------------------------------=
----------------------
    Schema              | public
    Name                | escape_like
    ...                 : ...
    Description         | escape LIKE pattern special characters: %_\
I have worked around the issue by appending a space character to each of
those function descriptions.  What makes the problem really bad is that it
silently renders your custom-format database dumps (which pg_dump creates
just fine) useless, which you notice only after you do a restore (without
an error being thrown) and your restored database being incomplete.
-Julian
			
		Julian Mehnle <julian@mehnle.net> writes:
> If the comment/description of a database object (table, function, etc.)
> ends in a backslash (which generally works fine otherwise), then
> pg_restore is unable to completely restore a custom-format dump of the
> schema.
Reproduced here against HEAD.  The problem seems to be that
pg_backup_db.c's _sendSQLLine() contains a mini SQL lexer that is not
cognizant of standard_conforming_strings.  Not sure about a simple fix,
and I rather wonder if we shouldn't try to remove that code entirely
instead of "fix" it.
As a temporary workaround, the SQL text file that pg_restore produces
by default seems to be valid, so you could pipe that into psql.
            regards, tom lane
			
		Re: pg_restore silently chokes on object comments/descriptions ending in a backslash
От
 
		    	Julian Mehnle
		    Дата:
		        I'm subscribed to the pgsql-bugs list, so no need to CC me. :-) Tom Lane wrote: > Reproduced here against HEAD. The problem seems to be that > pg_backup_db.c's _sendSQLLine() contains a mini SQL lexer that is not > cognizant of standard_conforming_strings. Oh, right, I forgot to mention I have standard_conforming_strings enabled.= =20=20 However, I understand that is to become the new default anyway. > Not sure about a simple fix,=20 > and I rather wonder if we shouldn't try to remove that code entirely > instead of "fix" it. What would "removing that code entirely" mean? > As a temporary workaround, the SQL text file that pg_restore produces > by default seems to be valid, so you could pipe that into psql. Hmm, right. So at least my existing dumps aren't useless. Thanks. -Julian
Julian Mehnle <julian@mehnle.net> writes:
> I'm subscribed to the pgsql-bugs list, so no need to CC me. :-)
cc to people in the thread is the established practice on these lists.
It provides a bit more robustness when the lists are busy or slow.
You can set your subscription so the listserv won't send you an extra
copy, I believe, but I don't know the incantation offhand.
> Tom Lane wrote:
>> Not sure about a simple fix,
>> and I rather wonder if we shouldn't try to remove that code entirely
>> instead of "fix" it.
> What would "removing that code entirely" mean?
I was wondering why it's necessary to parse the entry in the dump file
at all, rather than just spit it out to PQexec as-is.  There's probably
a reason, but maybe we can find another way to solve whatever the
real problem is.
            regards, tom lane
			
		Re: pg_restore silently chokes on object comments/descriptions ending in a backslash
От
 
		    	Julian Mehnle
		    Дата:
		        Tom Lane wrote: > Julian Mehnle <julian@mehnle.net> writes: > > I'm subscribed to the pgsql-bugs list, so no need to CC me. :-) > > cc to people in the thread is the established practice on these lists. > It provides a bit more robustness when the lists are busy or slow. Got it. I'll try to remember that and CC others when posting, and will=20 also not take offense when receiving extra CCs. > > What would "removing that code entirely" mean? > > I was wondering why it's necessary to parse the entry in the dump file > at all, rather than just spit it out to PQexec as-is. There's probably > a reason, but maybe we can find another way to solve whatever the > real problem is. I see. Given that I'm only a Pg user, not a Pg developer, I have no=20 opinion on this. Thanks for the explanation, though! -Julian
Re: pg_restore silently chokes on object comments/descriptions ending in a backslash
От
 
		    	Alvaro Herrera
		    Дата:
		        Excerpts from Julian Mehnle's message of mié jul 27 13:28:21 -0400 2011: > Tom Lane wrote: > > > Julian Mehnle <julian@mehnle.net> writes: > > > I'm subscribed to the pgsql-bugs list, so no need to CC me. :-) > > > > cc to people in the thread is the established practice on these lists. > > It provides a bit more robustness when the lists are busy or slow. > > Got it. I'll try to remember that and CC others when posting, and will > also not take offense when receiving extra CCs. If you're on procmail, you can get very easily use a well-known de-dupe recipe and it all works wonderfully. :0 Wh: msgid.lock | formail -D 65536 $HOME/.msgid.cache I assume similar tools can use equivalent mechanisms. Note that CCing others is customary but obviously not mandatory. -- Ãlvaro Herrera <alvherre@commandprompt.com> The PostgreSQL Company - Command Prompt, Inc. PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Re: pg_restore silently chokes on object comments/descriptions ending in a backslash
От
 
		    	Julian Mehnle
		    Дата:
		        Alvaro Herrera wrote: > Note that CCing others is customary but obviously not mandatory. For the record, CCing posters who haven't explicitly requested it is=20 frowned upon on the Debian mailing lists , but apparently those have a=20 lower latency than the Pg ones. :-) I'll shut up now since this is drifting off topic. -Julian
I wrote:
> Julian Mehnle <julian@mehnle.net> writes:
>> What would "removing that code entirely" mean?
> I was wondering why it's necessary to parse the entry in the dump file
> at all, rather than just spit it out to PQexec as-is.  There's probably
> a reason, but maybe we can find another way to solve whatever the
> real problem is.
I've applied a patch along those lines.  Thanks for the report!
            regards, tom lane