@@ -28,6 +28,7 @@ static intscanbuflen;
28
28
static void addstring (bool init,char *s,int l);
29
29
static void addchar (bool init,char s);
30
30
static int checkSpecialVal (void );/* examine scanstring for the special value */
31
+ static JsQueryHintcheckHint (void );
31
32
32
33
static void parseUnicode (char *s,int l);
33
34
@@ -58,7 +59,10 @@ unicode \\u[0-9A-Fa-f]{4}
58
59
59
60
<INITIAL>{blank}+{ /* ignore */ }
60
61
61
- <INITIAL>\/\*{ BEGIN xCOMMENT; }
62
+ <INITIAL>\/\*{
63
+ addchar(true, '\0 ');
64
+ BEGIN xCOMMENT;
65
+ }
62
66
63
67
<INITIAL>[+-]?[0-9]+(\.[0-9]+)?[eE][+-]?[0-9]+ /* float */ {
64
68
addstring(true, yytext, yyleng);
@@ -101,7 +105,7 @@ unicode \\u[0-9A-Fa-f]{4}
101
105
102
106
<INITIAL>\\ {
103
107
yyless(0);
104
- addstring (true," " , 0 );
108
+ addchar (true,' \0 ' );
105
109
BEGIN xNONQUOTED;
106
110
}
107
111
@@ -118,6 +122,7 @@ unicode \\u[0-9A-Fa-f]{4}
118
122
119
123
<xNONQUOTED>\/\*{
120
124
yylval->str = scanstring;
125
+ addchar(true, '\0 ');
121
126
BEGIN xCOMMENT;
122
127
return checkSpecialVal();
123
128
}
@@ -170,11 +175,16 @@ unicode \\u[0-9A-Fa-f]{4}
170
175
171
176
<INITIAL><<EOF>>{ yyterminate(); }
172
177
173
- <xCOMMENT>\*\/{ BEGIN INITIAL; }
178
+ <xCOMMENT>\*\/{
179
+ BEGIN INITIAL;
180
+
181
+ if ((yylval->hint = checkHint()) != jsqIndexDefault)
182
+ return HINT_P;
183
+ }
174
184
175
- <xCOMMENT>[^\*]+{/* ignore */ }
185
+ <xCOMMENT>[^\*]+{addstring(false, yytext, yyleng); }
176
186
177
- <xCOMMENT>\*{/* ignore */ }
187
+ <xCOMMENT>\*{addchar(false, '*'); }
178
188
179
189
<xCOMMENT><<EOF>>{ yyerror(" Unexpected end of comment" ); }
180
190
@@ -266,6 +276,30 @@ checkSpecialVal()
266
276
267
277
return res;
268
278
}
279
+
280
+ static JsQueryHint
281
+ checkHint ()
282
+ {
283
+ if (scanstring.len <=2 ||strncmp (scanstring.val ," --" ,2 ) !=0 )
284
+ return jsqIndexDefault;
285
+
286
+ scanstring.val +=2 ;
287
+ scanstring.len -=2 ;
288
+
289
+ while (scanstring.len >0 &&isspace (*scanstring.val ))
290
+ {
291
+ scanstring.val ++;
292
+ scanstring.len --;
293
+ }
294
+
295
+ if (scanstring.len >=5 &&pg_strncasecmp (scanstring.val ," index" ,5 ) ==0 )
296
+ return jsqForceIndex;
297
+
298
+ if (scanstring.len >=7 &&pg_strncasecmp (scanstring.val ," noindex" ,7 ) ==0 )
299
+ return jsqNoIndex;
300
+
301
+ return jsqIndexDefault;
302
+ }
269
303
/*
270
304
* Called before any actual parsing is done
271
305
*/