Tom Lane wrote: > Stuart Bishop <[EMAIL PROTECTED]> writes: > > The attached script creates a tsvector with a value that can be dumped using > > pg_dump, but not loaded again using pg_restore. This causes restores of a > > dump containing this value to fail. > > Hmm, sorta looks like tsvectorout should be doubling backslashes?
I think the larger question is why tsvectorin() requires double-backslashes? It seems it is for marking of single-quotes in phrases, from what I can tell from the code and regression test usage: SELECT E'''1 \\''2'' 3'::tsvector; tsvector ------------- '3' '1 ''2' (1 row) My guess is that the '' is used to start/stop phrases, and \\'' puts a literal '' in the phrase. I have developed the attached patch which doubles backslashes on output: test=> INSERT INTO Foo(bar) VALUES (E'\\\\x'); INSERT 0 1 test=> select * from foo; bar ------- '\\x' (1 row) However, I am still unclear if the dump code is correct because I don't see the backslash preserved in \\'' cases, just \\\\ cases: test=> CREATE TABLE Foo(bar tsvector); CREATE test=> INSERT INTO Foo(bar) VALUES (E'\\''x'); INSERT 0 1 test=> select * from foo; bar ------- '''x' (1 row) and pg_dump outputs: COPY foo (bar) FROM stdin; '''x' \. While the COPY will load into the table, this doesn't: test=> INSERT INTO Foo(bar) VALUES (E'''''x'); ERROR: syntax error in tsvector: "''x" I am confused. -- Bruce Momjian <[EMAIL PROTECTED]> http://momjian.us EnterpriseDB http://postgres.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/utils/adt/tsvector.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/adt/tsvector.c,v retrieving revision 1.6 diff -c -c -r1.6 tsvector.c *** src/backend/utils/adt/tsvector.c 23 Oct 2007 00:51:23 -0000 1.6 --- src/backend/utils/adt/tsvector.c 9 Nov 2007 23:59:06 -0000 *************** *** 345,350 **** --- 345,352 ---- if (t_iseq(curin, '\'')) *curout++ = '\''; + else if (t_iseq(curin, '\\')) + *curout++ = '\\'; while (len--) *curout++ = *curin++;
---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org