@@ -28,6 +28,7 @@ static intscanbuflen;
2828static void addstring (bool init,char *s,int l);
2929static void addchar (bool init,char s);
3030static int checkSpecialVal (void );/* examine scanstring for the special value */
31+ static JsQueryHintcheckHint (void );
3132
3233static void parseUnicode (char *s,int l);
3334
@@ -58,7 +59,10 @@ unicode \\u[0-9A-Fa-f]{4}
5859
5960<INITIAL>{blank}+{ /* ignore */ }
6061
61- <INITIAL>\/\*{ BEGIN xCOMMENT; }
62+ <INITIAL>\/\*{
63+ addchar(true, '\0 ');
64+ BEGIN xCOMMENT;
65+ }
6266
6367<INITIAL>[+-]?[0-9]+(\.[0-9]+)?[eE][+-]?[0-9]+ /* float */ {
6468addstring(true, yytext, yyleng);
@@ -101,7 +105,7 @@ unicode \\u[0-9A-Fa-f]{4}
101105
102106<INITIAL>\\ {
103107yyless(0);
104- addstring (true," " , 0 );
108+ addchar (true,' \0 ' );
105109BEGIN xNONQUOTED;
106110}
107111
@@ -118,6 +122,7 @@ unicode \\u[0-9A-Fa-f]{4}
118122
119123<xNONQUOTED>\/\*{
120124yylval->str = scanstring;
125+ addchar(true, '\0 ');
121126BEGIN xCOMMENT;
122127return checkSpecialVal();
123128}
@@ -170,11 +175,16 @@ unicode \\u[0-9A-Fa-f]{4}
170175
171176<INITIAL><<EOF>>{ yyterminate(); }
172177
173- <xCOMMENT>\*\/{ BEGIN INITIAL; }
178+ <xCOMMENT>\*\/{
179+ BEGIN INITIAL;
180+
181+ if ((yylval->hint = checkHint()) != jsqIndexDefault)
182+ return HINT_P;
183+ }
174184
175- <xCOMMENT>[^\*]+{/* ignore */ }
185+ <xCOMMENT>[^\*]+{addstring(false, yytext, yyleng); }
176186
177- <xCOMMENT>\*{/* ignore */ }
187+ <xCOMMENT>\*{addchar(false, '*'); }
178188
179189<xCOMMENT><<EOF>>{ yyerror(" Unexpected end of comment" ); }
180190
@@ -266,6 +276,30 @@ checkSpecialVal()
266276
267277return res;
268278}
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+ }
269303/*
270304 * Called before any actual parsing is done
271305 */