From 0c4f2894f96856e353cb0d5f51478c3aff6eef53 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sat, 2 Sep 2006 22:03:30 +0000
Subject: [PATCH] Use '' rather than \' for literal single quotes in strings in
 /contrib/tsearch2.

Teodor Sigaev
---
 contrib/tsearch2/expected/tsearch2.out | 12 +++---
 contrib/tsearch2/query.c               |  4 +-
 contrib/tsearch2/tsvector.c            | 55 ++++++++++++++++----------
 3 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/contrib/tsearch2/expected/tsearch2.out b/contrib/tsearch2/expected/tsearch2.out
index 2c1bbdb3385..738ac52cd67 100644
--- a/contrib/tsearch2/expected/tsearch2.out
+++ b/contrib/tsearch2/expected/tsearch2.out
@@ -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';
diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c
index 9be5f451fa8..6aeff0078d1 100644
--- a/contrib/tsearch2/query.c
+++ b/contrib/tsearch2/query.c
@@ -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);
diff --git a/contrib/tsearch2/tsvector.c b/contrib/tsearch2/tsvector.c
index 6cc50c35e70..7e8dd8a772b 100644
--- a/contrib/tsearch2/tsvector.c
+++ b/contrib/tsearch2/tsvector.c
@@ -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++;
-- 
GitLab