Use '' rather than \' for literal single quotes in strings in
authorBruce Momjian
Sat, 2 Sep 2006 22:03:30 +0000 (22:03 +0000)
committerBruce Momjian
Sat, 2 Sep 2006 22:03:30 +0000 (22:03 +0000)
/contrib/tsearch2.

Teodor Sigaev

contrib/tsearch2/expected/tsearch2.out
contrib/tsearch2/query.c
contrib/tsearch2/tsvector.c

index 2c1bbdb3385c516888643269bd478e46b88883ec..738ac52cd678c5d7e8a658ed094ac8464c2c6dce 100644 (file)
@@ -59,25 +59,25 @@ SELECT '''1 2'''::tsvector;
 SELECT E'''1 \\''2'''::tsvector;
  tsvector 
 ----------
- '1 \'2' 
+ '1 ''2'
 (1 row)
 
 SELECT E'''1 \\''2''3'::tsvector;
   tsvector   
 -------------
- '3' '1 \'2'
+ '3' '1 ''2'
 (1 row)
 
 SELECT E'''1 \\''2'' 3'::tsvector;
   tsvector   
 -------------
- '3' '1 \'2'
+ '3' '1 ''2'
 (1 row)
 
 SELECT E'''1 \\''2'' '' 3'' 4 '::tsvector;
      tsvector     
 ------------------
- '4' ' 3' '1 \'2'
+ '4' ' 3' '1 ''2'
 (1 row)
 
 select '''w'':4A,3B,2C,1D,5 a:8';
@@ -138,7 +138,7 @@ SELECT '''1 2'''::tsquery;
 SELECT E'''1 \\''2'''::tsquery;
  tsquery 
 ---------
- '1 \'2'
+ '1 ''2'
 (1 row)
 
 SELECT '!1'::tsquery;
@@ -336,7 +336,7 @@ SELECT '1&(2&(4&(5|!6)))'::tsquery;
 SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery;
                  tsquery                  
 ------------------------------------------
- '1' & '2' & ' 4' & ( '|5' | '6 \' !|&' )
+ '1' & '2' & ' 4' & ( '|5' | '6 '' !|&' )
 (1 row)
 
 SELECT '''the wether'':dc & '' sKies '':BC & a:d b:a';
index 9be5f451fa8658e6dc92e8be029a0bd24915f492..6aeff0078d1d687d4e1b38732bf28a3c3a7a5dfe 100644 (file)
@@ -604,7 +604,7 @@ findoprnd(ITEM * ptr, int4 *pos)
  * input
  */
 static QUERYTYPE *
-           queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain)
+queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain)
 {
    QPRS_STATE  state;
    int4        i;
@@ -748,7 +748,7 @@ infix(INFIX * in, bool first)
        {
            if ( t_iseq(op, '\'') )
            {
-               *(in->cur) = '\\';
+               *(in->cur) = '\'';
                in->cur++;
            }
            COPYCHAR(in->cur,op);
index 6cc50c35e7033386bb60d16509777741310f2e5f..7e8dd8a772bb0960eb602dee71a901362374e265 100644 (file)
@@ -164,13 +164,14 @@ uniqueentry(WordEntryIN * a, int4 l, char *buf, int4 *outbuflen)
    return res + 1 - a;
 }
 
-#define WAITWORD   1
-#define WAITENDWORD 2
+#define WAITWORD       1
+#define WAITENDWORD    2
 #define WAITNEXTCHAR   3
 #define WAITENDCMPLX   4
-#define WAITPOSINFO 5
-#define INPOSINFO  6
+#define WAITPOSINFO    5
+#define INPOSINFO      6
 #define WAITPOSDELIM   7
+#define    WAITCHARCMPLX   8
 
 #define RESIZEPRSBUF \
 do { \
@@ -270,21 +271,8 @@ gettoken_tsvector(TI_IN_STATE * state)
        }
        else if (state->state == WAITENDCMPLX)
        {
-           if ( t_iseq(state->prsbuf, '\'') )
-           {
-               RESIZEPRSBUF;
-               *(state->curpos) = '\0';
-               if (state->curpos == state->word)
-                   ereport(ERROR,
-                           (errcode(ERRCODE_SYNTAX_ERROR),
-                            errmsg("syntax error")));
-               if (state->oprisdelim)
-               {
-                   state->prsbuf+=pg_mblen(state->prsbuf);
-                   return 1;
-               }
-               else
-                   state->state = WAITPOSINFO;
+           if ( t_iseq(state->prsbuf, '\'') ) {
+               state->state = WAITCHARCMPLX; 
            }
            else if ( t_iseq(state->prsbuf, '\\') )
            {
@@ -302,6 +290,31 @@ gettoken_tsvector(TI_IN_STATE * state)
                state->curpos+=pg_mblen(state->prsbuf);
            }
        }
+       else if (state->state == WAITCHARCMPLX)
+       {
+           if ( t_iseq(state->prsbuf, '\'') ) 
+           {
+               RESIZEPRSBUF;
+               COPYCHAR(state->curpos, state->prsbuf);
+               state->curpos+=pg_mblen(state->prsbuf);
+               state->state = WAITENDCMPLX;
+           } else {
+               RESIZEPRSBUF;
+               *(state->curpos) = '\0';
+               if (state->curpos == state->word)
+                   ereport(ERROR,
+                           (errcode(ERRCODE_SYNTAX_ERROR),
+                            errmsg("syntax error")));
+               if (state->oprisdelim)
+               {
+                   /* state->prsbuf+=pg_mblen(state->prsbuf); */
+                   return 1;
+               }
+               else
+                   state->state = WAITPOSINFO;
+               continue; /* recheck current character */
+           }
+       }
        else if (state->state == WAITPOSINFO)
        {
            if ( t_iseq(state->prsbuf, ':') )
@@ -385,6 +398,8 @@ gettoken_tsvector(TI_IN_STATE * state)
        else
            /* internal error */
            elog(ERROR, "internal error");
+
+       /* get next char */
        state->prsbuf+=pg_mblen(state->prsbuf);
    }
 
@@ -529,7 +544,7 @@ tsvector_out(PG_FUNCTION_ARGS)
 
                outbuf = (char *) repalloc((void *) outbuf, ++lenbuf);
                curout = outbuf + pos;
-               *curout++ = '\\';
+               *curout++ = '\'';
            }
            while(len--)
                *curout++ = *curin++;