Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 71fde05

Browse files
committedMay 22, 2024·
Keep internal lists of keywords sorted
1 parent 51e2d67 commit 71fde05

File tree

2 files changed

+86
-41
lines changed

2 files changed

+86
-41
lines changed
 

‎src/Tokenizer.php

+48-41
Original file line numberDiff line numberDiff line change
@@ -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',
@@ -726,10 +726,17 @@ final class Tokenizer
726726
public function __construct()
727727
{
728728
// 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);
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+
};
736+
$this->reserved = $sortByLengthFx($this->reserved);
737+
$this->reservedToplevel = $sortByLengthFx($this->reservedToplevel);
738+
$this->reservedNewline = $sortByLengthFx($this->reservedNewline);
739+
$this->functions = $sortByLengthFx($this->functions);
733740

734741
// Set up regular expressions
735742
$this->regexBoundaries = '(' . implode(

‎tests/TokenizerTest.php

+38
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,47 @@
77
use Doctrine\SqlFormatter\Tokenizer;
88
use PHPUnit\Framework\Attributes\DoesNotPerformAssertions;
99
use PHPUnit\Framework\TestCase;
10+
use ReflectionClass;
11+
12+
use function sort;
1013

1114
final class TokenizerTest extends TestCase
1215
{
16+
/**
17+
* @param 'reserved'|'reservedToplevel'|'reservedNewline' $propertyName
18+
*
19+
* @return list<string>
20+
*/
21+
private function getTokenizerList(string $propertyName): array
22+
{
23+
$tokenizerReflClass = new ReflectionClass(Tokenizer::class);
24+
/** @var list<string> $res */
25+
$res = $tokenizerReflClass->getProperty($propertyName)->getDefaultValue();
26+
27+
return $res;
28+
}
29+
30+
/**
31+
* For easier maintenance of internal long lists.
32+
*/
33+
public function testInternalKeywordListsAreSorted(): void
34+
{
35+
foreach (
36+
[
37+
'reserved',
38+
'reservedToplevel',
39+
'reservedNewline',
40+
'functions',
41+
] as $propertyName
42+
) {
43+
$tokenizerReserved = $this->getTokenizerList($propertyName);
44+
$tokenizerReservedOrdered = $tokenizerReserved;
45+
sort($tokenizerReservedOrdered);
46+
47+
self::assertSame($tokenizerReservedOrdered, $tokenizerReserved);
48+
}
49+
}
50+
1351
#[DoesNotPerformAssertions]
1452
public function testThereAreNoRegressions(): void
1553
{

0 commit comments

Comments
 (0)
Please sign in to comment.