@@ -94,8 +94,8 @@ final class Tokenizer
9494 'ENCLOSED ' ,
9595 'END ' ,
9696 'ENGINE ' ,
97- 'ENGINE_TYPE ' ,
9897 'ENGINES ' ,
98+ 'ENGINE_TYPE ' ,
9999 'ESCAPE ' ,
100100 'ESCAPED ' ,
101101 'EVENTS ' ,
@@ -111,9 +111,9 @@ final class Tokenizer
111111 'FIRST ' ,
112112 'FIXED ' ,
113113 'FLUSH ' ,
114+ 'FOLLOWING ' ,
114115 'FOR ' ,
115116 'FORCE ' ,
116- 'FOLLOWING ' ,
117117 'FOREIGN ' ,
118118 'FULL ' ,
119119 'FULLTEXT ' ,
@@ -187,12 +187,12 @@ final class Tokenizer
187187 'NULL ' ,
188188 'OFFSET ' ,
189189 'ON ' ,
190+ 'ON DELETE ' ,
191+ 'ON UPDATE ' ,
190192 'OPEN ' ,
191193 'OPTIMIZE ' ,
192194 'OPTION ' ,
193195 'OPTIONALLY ' ,
194- 'ON UPDATE ' ,
195- 'ON DELETE ' ,
196196 'OUTFILE ' ,
197197 'OVER ' ,
198198 'PACK_KEYS ' ,
@@ -209,11 +209,11 @@ final class Tokenizer
209209 'PROCESSLIST ' ,
210210 'PURGE ' ,
211211 'QUICK ' ,
212- 'RANGE ' ,
213212 'RAID0 ' ,
214213 'RAID_CHUNKS ' ,
215214 'RAID_CHUNKSIZE ' ,
216215 'RAID_TYPE ' ,
216+ 'RANGE ' ,
217217 'READ ' ,
218218 'READ_ONLY ' ,
219219 'READ_WRITE ' ,
@@ -254,20 +254,20 @@ final class Tokenizer
254254 'SQL_BIG_SELECTS ' ,
255255 'SQL_BIG_TABLES ' ,
256256 'SQL_BUFFER_RESULT ' ,
257+ 'SQL_CACHE ' ,
257258 'SQL_CALC_FOUND_ROWS ' ,
258259 'SQL_LOG_BIN ' ,
259260 'SQL_LOG_OFF ' ,
260261 'SQL_LOG_UPDATE ' ,
261262 'SQL_LOW_PRIORITY_UPDATES ' ,
262263 'SQL_MAX_JOIN_SIZE ' ,
264+ 'SQL_NO_CACHE ' ,
263265 'SQL_QUOTE_SHOW_CREATE ' ,
264266 'SQL_SAFE_UPDATES ' ,
265267 'SQL_SELECT_LIMIT ' ,
266268 'SQL_SLAVE_SKIP_COUNTER ' ,
267269 'SQL_SMALL_RESULT ' ,
268270 'SQL_WARNINGS ' ,
269- 'SQL_CACHE ' ,
270- 'SQL_NO_CACHE ' ,
271271 'START ' ,
272272 'STARTING ' ,
273273 'STATUS ' ,
@@ -314,47 +314,47 @@ final class Tokenizer
314314 * @var list<string>
315315 */
316316 private array $ reservedToplevel = [
317- 'WITH ' ,
318- 'SELECT ' ,
319- 'FROM ' ,
320- 'WHERE ' ,
321- 'SET ' ,
322- 'ORDER BY ' ,
323- 'GROUP BY ' ,
324- 'LIMIT ' ,
325- 'DROP ' ,
326- 'VALUES ' ,
327- 'UPDATE ' ,
328- 'HAVING ' ,
329317 'ADD ' ,
330- 'CHANGE ' ,
331- 'MODIFY ' ,
332318 'ALTER TABLE ' ,
319+ 'CHANGE ' ,
333320 'DELETE FROM ' ,
334- 'UNION ALL ' ,
335- 'UNION ' ,
321+ 'DROP ' ,
336322 'EXCEPT ' ,
323+ 'FROM ' ,
324+ 'GROUP BY ' ,
325+ 'GROUPS ' ,
326+ 'HAVING ' ,
337327 'INTERSECT ' ,
328+ 'LIMIT ' ,
329+ 'MODIFY ' ,
330+ 'ORDER BY ' ,
338331 'PARTITION BY ' ,
339- 'ROWS ' ,
340332 'RANGE ' ,
341- 'GROUPS ' ,
333+ 'ROWS ' ,
334+ 'SELECT ' ,
335+ 'SET ' ,
336+ 'UNION ' ,
337+ 'UNION ALL ' ,
338+ 'UPDATE ' ,
339+ 'VALUES ' ,
340+ 'WHERE ' ,
342341 'WINDOW ' ,
342+ 'WITH ' ,
343343 ];
344344
345345 /** @var list<string> */
346346 private array $ reservedNewline = [
347- 'LEFT OUTER JOIN ' ,
348- 'RIGHT OUTER JOIN ' ,
349- 'LEFT JOIN ' ,
350- 'RIGHT JOIN ' ,
351- 'OUTER JOIN ' ,
347+ 'AND ' ,
348+ 'EXCLUDE ' ,
352349 'INNER JOIN ' ,
353350 'JOIN ' ,
354- 'XOR ' ,
351+ 'LEFT JOIN ' ,
352+ 'LEFT OUTER JOIN ' ,
355353 'OR ' ,
356- 'AND ' ,
357- 'EXCLUDE ' ,
354+ 'OUTER JOIN ' ,
355+ 'RIGHT JOIN ' ,
356+ 'RIGHT OUTER JOIN ' ,
357+ 'XOR ' ,
358358 ];
359359
360360 /** @var list<string> */
@@ -575,9 +575,9 @@ final class Tokenizer
575575 'ORD ' ,
576576 'OVERLAPS ' ,
577577 'PASSWORD ' ,
578- 'PERCENT_RANK ' ,
579578 'PERCENTILE_CONT ' ,
580579 'PERCENTILE_DISC ' ,
580+ 'PERCENT_RANK ' ,
581581 'PERIOD_ADD ' ,
582582 'PERIOD_DIFF ' ,
583583 'PI ' ,
@@ -625,13 +625,13 @@ final class Tokenizer
625625 'SRID ' ,
626626 'STARTPOINT ' ,
627627 'STD ' ,
628- 'STDEV ' ,
629- 'STDEVP ' ,
630628 'STDDEV ' ,
631629 'STDDEV_POP ' ,
632630 'STDDEV_SAMP ' ,
633- 'STRING_AGG ' ,
631+ 'STDEV ' ,
632+ 'STDEVP ' ,
634633 'STRCMP ' ,
634+ 'STRING_AGG ' ,
635635 'STR_TO_DATE ' ,
636636 'SUBDATE ' ,
637637 'SUBSTR ' ,
@@ -725,11 +725,14 @@ final class Tokenizer
725725 */
726726 public function __construct ()
727727 {
728- // Sort reserved word list from longest word to shortest, 3x faster than usort
729- $ reservedMap = array_combine ($ this ->reserved , array_map (strlen (...), $ this ->reserved ));
730- assert ($ reservedMap !== false );
731- arsort ($ reservedMap );
732- $ this ->reserved = array_keys ($ reservedMap );
728+ // Sort list from longest word to shortest, 3x faster than usort
729+ $ sortByLengthFx = static function ($ values ) {
730+ $ valuesMap = array_combine ($ values , array_map (strlen (...), $ values ));
731+ assert ($ valuesMap !== false );
732+ arsort ($ valuesMap );
733+
734+ return array_keys ($ valuesMap );
735+ };
733736
734737 // Set up regular expressions
735738 $ this ->regexBoundaries = '( ' . implode (
@@ -738,18 +741,18 @@ public function __construct()
738741 ) . ') ' ;
739742 $ this ->regexReserved = '( ' . implode (
740743 '| ' ,
741- $ this ->quoteRegex ($ this ->reserved ),
744+ $ this ->quoteRegex ($ sortByLengthFx ( $ this ->reserved ) ),
742745 ) . ') ' ;
743746 $ this ->regexReservedToplevel = str_replace (' ' , '\\s+ ' , '( ' . implode (
744747 '| ' ,
745- $ this ->quoteRegex ($ this ->reservedToplevel ),
748+ $ this ->quoteRegex ($ sortByLengthFx ( $ this ->reservedToplevel ) ),
746749 ) . ') ' );
747750 $ this ->regexReservedNewline = str_replace (' ' , '\\s+ ' , '( ' . implode (
748751 '| ' ,
749- $ this ->quoteRegex ($ this ->reservedNewline ),
752+ $ this ->quoteRegex ($ sortByLengthFx ( $ this ->reservedNewline ) ),
750753 ) . ') ' );
751754
752- $ this ->regexFunction = '( ' . implode ('| ' , $ this ->quoteRegex ($ this ->functions )) . ') ' ;
755+ $ this ->regexFunction = '( ' . implode ('| ' , $ this ->quoteRegex ($ sortByLengthFx ( $ this ->functions ) )) . ') ' ;
753756 }
754757
755758 /**
0 commit comments