@@ -28,6 +28,7 @@ static int scanbuflen;
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 JsQueryHint checkHint (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
*/
0 commit comments