@@ -55,6 +55,7 @@ Datum to_tsquery_current(PG_FUNCTION_ARGS);
55
55
/* parser's states */
56
56
#define WAITOPERAND 1
57
57
#define WAITOPERATOR 2
58
+ #define WAITFIRSTOPERAND 3
58
59
59
60
/*
60
61
* node of query tree, also used
@@ -137,6 +138,7 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2
137
138
{
138
139
switch (state -> state )
139
140
{
141
+ case WAITFIRSTOPERAND :
140
142
case WAITOPERAND :
141
143
if (* (state -> buf ) == '!' )
142
144
{
@@ -159,14 +161,16 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2
159
161
else if (* (state -> buf ) != ' ' )
160
162
{
161
163
state -> valstate .prsbuf = state -> buf ;
162
- state -> state = WAITOPERATOR ;
163
164
if (gettoken_tsvector (& (state -> valstate )))
164
165
{
165
166
* strval = state -> valstate .word ;
166
167
* lenval = state -> valstate .curpos - state -> valstate .word ;
167
168
state -> buf = get_weight (state -> valstate .prsbuf , weight );
169
+ state -> state = WAITOPERATOR ;
168
170
return VAL ;
169
171
}
172
+ else if ( state -> state == WAITFIRSTOPERAND )
173
+ return END ;
170
174
else
171
175
ereport (ERROR ,
172
176
(errcode (ERRCODE_SYNTAX_ERROR ),
@@ -596,7 +600,7 @@ static QUERYTYPE *
596
600
597
601
/* init state */
598
602
state .buf = buf ;
599
- state .state = WAITOPERAND ;
603
+ state .state = WAITFIRSTOPERAND ;
600
604
state .count = 0 ;
601
605
state .num = 0 ;
602
606
state .str = NULL ;
@@ -616,10 +620,13 @@ static QUERYTYPE *
616
620
/* parse query & make polish notation (postfix, but in reverse order) */
617
621
makepol (& state , pushval );
618
622
pfree (state .valstate .word );
619
- if (!state .num )
620
- ereport (ERROR ,
621
- (errcode (ERRCODE_SYNTAX_ERROR ),
622
- errmsg ("empty query" )));
623
+ if (!state .num ) {
624
+ elog (NOTICE , "Query doesn't contain lexem(s)" );
625
+ query = (QUERYTYPE * )palloc ( HDRSIZEQT );
626
+ query -> len = HDRSIZEQT ;
627
+ query -> size = 0 ;
628
+ return query ;
629
+ }
623
630
624
631
/* make finish struct */
625
632
commonlen = COMPUTESIZE (state .num , state .sumlen );
@@ -905,6 +912,10 @@ to_tsquery(PG_FUNCTION_ARGS)
905
912
PG_FREE_IF_COPY (in , 1 );
906
913
907
914
query = queryin (str , pushval_morph , PG_GETARG_INT32 (0 ));
915
+
916
+ if ( query -> size == 0 )
917
+ PG_RETURN_POINTER (query );
918
+
908
919
res = clean_fakeval_v2 (GETQUERY (query ), & len );
909
920
if (!res )
910
921
{
0 commit comments