@@ -28,6 +28,7 @@ static int scanbuflen;
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 JsQueryHint checkHint (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 */ {
6468 addstring(true, yytext, yyleng);
@@ -101,7 +105,7 @@ unicode \\u[0-9A-Fa-f]{4}
101105
102106<INITIAL>\\ {
103107 yyless(0);
104- addstring (true, " " , 0 );
108+ addchar (true, ' \0 ' );
105109 BEGIN xNONQUOTED;
106110 }
107111
@@ -118,6 +122,7 @@ unicode \\u[0-9A-Fa-f]{4}
118122
119123<xNONQUOTED>\/\* {
120124 yylval->str = scanstring;
125+ addchar(true, '\0 ');
121126 BEGIN xCOMMENT;
122127 return 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
267277 return 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 */
0 commit comments