@@ -164,13 +164,14 @@ uniqueentry(WordEntryIN * a, int4 l, char *buf, int4 *outbuflen)
164
164
return res + 1 - a ;
165
165
}
166
166
167
- #define WAITWORD 1
168
- #define WAITENDWORD 2
167
+ #define WAITWORD 1
168
+ #define WAITENDWORD 2
169
169
#define WAITNEXTCHAR 3
170
170
#define WAITENDCMPLX 4
171
- #define WAITPOSINFO 5
172
- #define INPOSINFO 6
171
+ #define WAITPOSINFO 5
172
+ #define INPOSINFO 6
173
173
#define WAITPOSDELIM 7
174
+ #define WAITCHARCMPLX 8
174
175
175
176
#define RESIZEPRSBUF \
176
177
do { \
@@ -270,21 +271,8 @@ gettoken_tsvector(TI_IN_STATE * state)
270
271
}
271
272
else if (state -> state == WAITENDCMPLX )
272
273
{
273
- if ( t_iseq (state -> prsbuf , '\'' ) )
274
- {
275
- RESIZEPRSBUF ;
276
- * (state -> curpos ) = '\0' ;
277
- if (state -> curpos == state -> word )
278
- ereport (ERROR ,
279
- (errcode (ERRCODE_SYNTAX_ERROR ),
280
- errmsg ("syntax error" )));
281
- if (state -> oprisdelim )
282
- {
283
- state -> prsbuf += pg_mblen (state -> prsbuf );
284
- return 1 ;
285
- }
286
- else
287
- state -> state = WAITPOSINFO ;
274
+ if ( t_iseq (state -> prsbuf , '\'' ) ) {
275
+ state -> state = WAITCHARCMPLX ;
288
276
}
289
277
else if ( t_iseq (state -> prsbuf , '\\' ) )
290
278
{
@@ -302,6 +290,31 @@ gettoken_tsvector(TI_IN_STATE * state)
302
290
state -> curpos += pg_mblen (state -> prsbuf );
303
291
}
304
292
}
293
+ else if (state -> state == WAITCHARCMPLX )
294
+ {
295
+ if ( t_iseq (state -> prsbuf , '\'' ) )
296
+ {
297
+ RESIZEPRSBUF ;
298
+ COPYCHAR (state -> curpos , state -> prsbuf );
299
+ state -> curpos += pg_mblen (state -> prsbuf );
300
+ state -> state = WAITENDCMPLX ;
301
+ } else {
302
+ RESIZEPRSBUF ;
303
+ * (state -> curpos ) = '\0' ;
304
+ if (state -> curpos == state -> word )
305
+ ereport (ERROR ,
306
+ (errcode (ERRCODE_SYNTAX_ERROR ),
307
+ errmsg ("syntax error" )));
308
+ if (state -> oprisdelim )
309
+ {
310
+ /* state->prsbuf+=pg_mblen(state->prsbuf); */
311
+ return 1 ;
312
+ }
313
+ else
314
+ state -> state = WAITPOSINFO ;
315
+ continue ; /* recheck current character */
316
+ }
317
+ }
305
318
else if (state -> state == WAITPOSINFO )
306
319
{
307
320
if ( t_iseq (state -> prsbuf , ':' ) )
@@ -385,6 +398,8 @@ gettoken_tsvector(TI_IN_STATE * state)
385
398
else
386
399
/* internal error */
387
400
elog (ERROR , "internal error" );
401
+
402
+ /* get next char */
388
403
state -> prsbuf += pg_mblen (state -> prsbuf );
389
404
}
390
405
@@ -529,7 +544,7 @@ tsvector_out(PG_FUNCTION_ARGS)
529
544
530
545
outbuf = (char * ) repalloc ((void * ) outbuf , ++ lenbuf );
531
546
curout = outbuf + pos ;
532
- * curout ++ = '\\ ' ;
547
+ * curout ++ = '\' ' ;
533
548
}
534
549
while (len -- )
535
550
* curout ++ = * curin ++ ;
0 commit comments