aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2006-09-02 22:03:30 +0000
committerBruce Momjian <bruce@momjian.us>2006-09-02 22:03:30 +0000
commit0c4f2894f96856e353cb0d5f51478c3aff6eef53 (patch)
treed220490349665ded658347bc228b82adfb294b82
parent4b636e35a51432743caf6a0c5250f312df95e3e3 (diff)
downloadpostgresql-0c4f2894f96856e353cb0d5f51478c3aff6eef53.tar.gz
postgresql-0c4f2894f96856e353cb0d5f51478c3aff6eef53.zip
Use '' rather than \' for literal single quotes in strings in
/contrib/tsearch2. Teodor Sigaev
-rw-r--r--contrib/tsearch2/expected/tsearch2.out12
-rw-r--r--contrib/tsearch2/query.c4
-rw-r--r--contrib/tsearch2/tsvector.c55
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++;