From a867b40cf45fa564810fedf892fcfbcae46a2009 Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Fri, 16 Nov 2007 15:05:59 +0000 Subject: [PATCH] Fix tsvectorout() and tsqueryout() to escape backslesh, add test of that. Patch by Bruce Momjian Backpatch is needed, but it's impossible to apply it directly --- src/backend/utils/adt/tsquery.c | 7 ++++++- src/backend/utils/adt/tsvector.c | 4 +++- src/test/regress/expected/tstypes.out | 18 ++++++++++++++++++ src/test/regress/sql/tstypes.sql | 3 +++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index e591b9622f..509998c510 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery.c,v 1.10 2007/11/15 22:25:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery.c,v 1.11 2007/11/16 15:05:59 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -614,6 +614,11 @@ infix(INFIX *in, bool first) *(in->cur) = '\''; in->cur++; } + else if (t_iseq(op, '\\')) + { + *(in->cur) = '\\'; + in->cur++; + } COPYCHAR(in->cur, op); clen = pg_mblen(op); diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c index a82c6bb44d..fb44c1224f 100644 --- a/src/backend/utils/adt/tsvector.c +++ b/src/backend/utils/adt/tsvector.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector.c,v 1.8 2007/11/15 22:25:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector.c,v 1.9 2007/11/16 15:05:59 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -345,6 +345,8 @@ tsvectorout(PG_FUNCTION_ARGS) if (t_iseq(curin, '\'')) *curout++ = '\''; + else if (t_iseq(curin, '\\')) + *curout++ = '\\'; while (len--) *curout++ = *curin++; diff --git a/src/test/regress/expected/tstypes.out b/src/test/regress/expected/tstypes.out index e81c601b66..4672f099e0 100644 --- a/src/test/regress/expected/tstypes.out +++ b/src/test/regress/expected/tstypes.out @@ -59,6 +59,18 @@ SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector; '4' ' 3' '1 ''2' (1 row) +SELECT $$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector; + tsvector +---------------------------------------- + '\\as' 'abc' 'AB\\c' 'ab\\c' 'ab\\\\c' +(1 row) + +SELECT tsvectorin(tsvectorout($$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector)); + tsvectorin +---------------------------------------- + '\\as' 'abc' 'AB\\c' 'ab\\c' 'ab\\\\c' +(1 row) + SELECT '''w'':4A,3B,2C,1D,5 a:8'; ?column? ----------------------- @@ -318,6 +330,12 @@ SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery; '1' & '2' & ' 4' & ( '|5' | '6 '' !|&' ) (1 row) +SELECT $$'\\as'$$::tsquery; + tsquery +--------- + '\\as' +(1 row) + SELECT 'a' < 'b & c'::tsquery as "true"; true ------ diff --git a/src/test/regress/sql/tstypes.sql b/src/test/regress/sql/tstypes.sql index d058091007..49afc3b23a 100644 --- a/src/test/regress/sql/tstypes.sql +++ b/src/test/regress/sql/tstypes.sql @@ -10,6 +10,8 @@ SELECT E'''1 \\''2'''::tsvector; SELECT E'''1 \\''2''3'::tsvector; SELECT E'''1 \\''2'' 3'::tsvector; SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector; +SELECT $$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector; +SELECT tsvectorin(tsvectorout($$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector)); SELECT '''w'':4A,3B,2C,1D,5 a:8'; SELECT 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; SELECT setweight('w:12B w:13* w:12,5,6 a:1,3* a:3 w asd:1dc asd zxc:81,567,222A'::tsvector, 'c'); @@ -55,6 +57,7 @@ SELECT '1&2&4&5&6'::tsquery; SELECT '1&(2&(4&(5|6)))'::tsquery; SELECT '1&(2&(4&(5|!6)))'::tsquery; SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery; +SELECT $$'\\as'$$::tsquery; SELECT 'a' < 'b & c'::tsquery as "true"; SELECT 'a' > 'b & c'::tsquery as "false";