]> granicus.if.org Git - postgresql/commitdiff
Fix tsvectorout() and tsqueryout() to escape backslesh, add test of that.
authorTeodor Sigaev <teodor@sigaev.ru>
Fri, 16 Nov 2007 15:05:59 +0000 (15:05 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Fri, 16 Nov 2007 15:05:59 +0000 (15:05 +0000)
Patch by Bruce Momjian <bruce@momjian.us>

Backpatch is needed, but it's impossible to apply it directly

src/backend/utils/adt/tsquery.c
src/backend/utils/adt/tsvector.c
src/test/regress/expected/tstypes.out
src/test/regress/sql/tstypes.sql

index e591b9622f9f5cd78362af8531d3fb3003ec8c8d..509998c51021de9dd21f26c0ecf31e106ab6ec41 100644 (file)
@@ -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);
index a82c6bb44d71eb049bfa90bf33b0297a891bdc7a..fb44c1224f87ddc826ee99b6ce6af9489d039921 100644 (file)
@@ -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++;
index e81c601b66f24eb3f50a02243d6fbcaddec2c023..4672f099e0ac8613e8abe14709a71283d70b51cf 100644 (file)
@@ -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 
 ------
index d058091007705f620aea53d5bd2b6f19e9b135b3..49afc3b23a285819e609f81b9d364a7c81be46a6 100644 (file)
@@ -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";