Skip to content

Commit ff667cc

Browse files
committedMay 30, 2024·
Make sure keywords are single upper words
The "reserved" keywords are special as they need to be always quoted and per MySQL/SQLite spec they are always single word and case insensitive.
1 parent 53833c7 commit ff667cc

File tree

5 files changed

+36
-23
lines changed

5 files changed

+36
-23
lines changed
 

‎src/Tokenizer.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ final class Tokenizer
5050
'CASE',
5151
'CHANGE',
5252
'CHANGED',
53-
'CHARACTER SET',
53+
'CHARACTER',
5454
'CHARSET',
5555
'CHECK',
5656
'CHECKSUM',
@@ -68,7 +68,7 @@ final class Tokenizer
6868
'CONVERT',
6969
'CREATE',
7070
'CROSS',
71-
'CURRENT ROW',
71+
'CURRENT',
7272
'CURRENT_TIMESTAMP',
7373
'DATABASE',
7474
'DATABASES',
@@ -186,8 +186,6 @@ final class Tokenizer
186186
'NULL',
187187
'OFFSET',
188188
'ON',
189-
'ON DELETE',
190-
'ON UPDATE',
191189
'OPEN',
192190
'OPTIMIZE',
193191
'OPTION',
@@ -241,6 +239,7 @@ final class Tokenizer
241239
'SEPARATOR',
242240
'SERIALIZABLE',
243241
'SESSION',
242+
'SET',
244243
'SHARE',
245244
'SHOW',
246245
'SHUTDOWN',

‎tests/TokenizerTest.php

+14
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
use PHPUnit\Framework\TestCase;
1010
use ReflectionClass;
1111

12+
use function array_filter;
13+
use function preg_match;
1214
use function sort;
15+
use function strtoupper;
1316

1417
final class TokenizerTest extends TestCase
1518
{
@@ -44,6 +47,17 @@ public function testInternalKeywordListsAreSortedForEasierMaintenance(): void
4447
}
4548
}
4649

50+
public function testKeywordsReservedAreSingleUpperWord(): void
51+
{
52+
$tokenizerReserved = $this->getTokenizerList('reserved');
53+
54+
$kwsDiff = array_filter($tokenizerReserved, static function ($v) {
55+
return $v !== strtoupper($v) || preg_match('~^\w+$~', $v) !== 1;
56+
});
57+
58+
self::assertSame([], $kwsDiff);
59+
}
60+
4761
#[DoesNotPerformAssertions]
4862
public function testThereAreNoRegressions(): void
4963
{

‎tests/clihighlight.txt

+7-7
Original file line numberDiff line numberDiff line change
@@ -915,31 +915,31 @@
915915
c
916916
GROUPS
917917
BETWEEN UNBOUNDED PRECEDING
918-
AND CURRENT ROW
919-
EXCLUDE NO OTHERS
918+
AND CURRENT ROW
919+
EXCLUDE NO OTHERS
920920
) AS no_others,
921921
GROUP_CONCAT(b, '.') OVER (
922922
ORDER BY
923923
c
924924
GROUPS
925925
BETWEEN UNBOUNDED PRECEDING
926-
AND CURRENT ROW
927-
EXCLUDE CURRENT ROW
926+
AND CURRENT ROW
927+
EXCLUDE CURRENT ROW
928928
) AS current_row,
929929
GROUP_CONCAT(b, '.') OVER (
930930
ORDER BY
931931
c
932932
GROUPS
933933
BETWEEN UNBOUNDED PRECEDING
934-
AND CURRENT ROW
934+
AND CURRENT ROW
935935
EXCLUDE GROUP
936936
) AS grp,
937937
GROUP_CONCAT(b, '.') OVER (
938938
ORDER BY
939939
c
940940
GROUPS
941941
BETWEEN UNBOUNDED PRECEDING
942-
AND CURRENT ROW
942+
AND CURRENT ROW
943943
EXCLUDE TIES
944944
) AS tie,
945945
GROUP_CONCAT(b, '.') FILTER (
@@ -990,7 +990,7 @@
990990
ORDER BY
991991
RevenueYear
992992
ROWS
993-
BETWEEN CURRENT ROW
993+
BETWEEN CURRENT ROW
994994
AND UNBOUNDED FOLLOWING
995995
) AS MinRevenueBeyond
996996
FROM

‎tests/format-highlight.html

+7-7
Original file line numberDiff line numberDiff line change
@@ -915,31 +915,31 @@
915915
<span style="color: #333;">c</span>
916916
<span style="font-weight:bold;">GROUPS</span>
917917
<span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span>
918-
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span>
919-
<span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">NO OTHERS</span>
918+
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>
919+
<span style="font-weight:bold;">EXCLUDE</span> <span style="color: #333;">NO</span> <span style="color: #333;">OTHERS</span>
920920
) <span style="font-weight:bold;">AS</span> <span style="color: #333;">no_others</span><span >,</span>
921921
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (
922922
<span style="font-weight:bold;">ORDER BY</span>
923923
<span style="color: #333;">c</span>
924924
<span style="font-weight:bold;">GROUPS</span>
925925
<span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span>
926-
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span>
927-
<span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">CURRENT ROW</span>
926+
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>
927+
<span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>
928928
) <span style="font-weight:bold;">AS</span> <span style="color: #333;">current_row</span><span >,</span>
929929
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (
930930
<span style="font-weight:bold;">ORDER BY</span>
931931
<span style="color: #333;">c</span>
932932
<span style="font-weight:bold;">GROUPS</span>
933933
<span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span>
934-
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span>
934+
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>
935935
<span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">GROUP</span>
936936
) <span style="font-weight:bold;">AS</span> <span style="color: #333;">grp</span><span >,</span>
937937
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (
938938
<span style="font-weight:bold;">ORDER BY</span>
939939
<span style="color: #333;">c</span>
940940
<span style="font-weight:bold;">GROUPS</span>
941941
<span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span>
942-
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span>
942+
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>
943943
<span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">TIES</span>
944944
) <span style="font-weight:bold;">AS</span> <span style="color: #333;">tie</span><span >,</span>
945945
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">FILTER</span> (
@@ -990,7 +990,7 @@
990990
<span style="font-weight:bold;">ORDER BY</span>
991991
<span style="color: #333;">RevenueYear</span>
992992
<span style="font-weight:bold;">ROWS</span>
993-
<span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">CURRENT ROW</span>
993+
<span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>
994994
<span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">FOLLOWING</span>
995995
) <span style="font-weight:bold;">AS</span> <span style="color: #333;">MinRevenueBeyond</span>
996996
<span style="font-weight:bold;">FROM</span>

‎tests/highlight.html

+5-5
Original file line numberDiff line numberDiff line change
@@ -288,18 +288,18 @@
288288
<span style="font-weight:bold;">WHERE</span> <span style="color: #333;">cte1</span><span >.</span><span style="color: #333;">a</span> <span >=</span> <span style="color: #333;">cte2</span><span >.</span><span style="color: #333;">c</span><span >;</span></pre>
289289
---
290290
<pre style="color: black; background-color: white;"><span style="font-weight:bold;">SELECT</span> <span style="color: #333;">a</span><span >,</span>
291-
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">NO OTHERS</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">no_others</span><span >,</span>
292-
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">CURRENT ROW</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">current_row</span><span >,</span>
293-
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">GROUP</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">grp</span><span >,</span>
294-
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">TIES</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">tie</span><span >,</span>
291+
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="color: #333;">NO</span> <span style="color: #333;">OTHERS</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">no_others</span><span >,</span>
292+
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">current_row</span><span >,</span>
293+
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">GROUP</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">grp</span><span >,</span>
294+
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">c</span> <span style="font-weight:bold;">GROUPS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span> <span style="font-weight:bold;">EXCLUDE</span> <span style="font-weight:bold;">TIES</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">tie</span><span >,</span>
295295
<span style="font-weight:bold;">GROUP_CONCAT</span>(<span style="color: #333;">b</span><span >,</span> <span style="color: blue;">'.'</span>) <span style="font-weight:bold;">FILTER</span> (<span style="font-weight:bold;">WHERE</span> <span style="color: #333;">c</span> <span >!</span><span >=</span> <span style="color: blue;">'two'</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">a</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">filtered</span><span >,</span>
296296
<span style="font-weight:bold;">CONVERT</span>(<span style="color: #333;">VARCHAR</span>(<span style="color: green;">20</span>)<span >,</span> <span style="font-weight:bold;">AVG</span>(<span style="color: #333;">SalesYTD</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">TerritoryID</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">DATEPART</span>(<span style="color: #333;">yy</span><span >,</span> <span style="color: #333;">ModifiedDate</span>))<span >,</span> <span style="color: green;">1</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">MovingAvg</span><span >,</span>
297297
<span style="font-weight:bold;">AVG</span>(<span style="color: #333;">starting_salary</span>) <span style="font-weight:bold;">OVER</span> <span style="color: #333;">w2</span> <span style="color: #333;">AVG</span><span >,</span>
298298
<span style="font-weight:bold;">MIN</span>(<span style="color: #333;">starting_salary</span>) <span style="font-weight:bold;">OVER</span> <span style="color: #333;">w2</span> <span style="color: #333;">MIN_STARTING_SALARY</span><span >,</span>
299299
<span style="font-weight:bold;">MAX</span>(<span style="color: #333;">starting_salary</span>) <span style="font-weight:bold;">OVER</span> (<span style="color: #333;">w1</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">hire_date</span>)<span >,</span>
300300
<span style="font-weight:bold;">LISTAGG</span>(<span style="color: #333;">arg</span><span >,</span> <span style="color: blue;">','</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">part</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">ord</span> <span style="font-weight:bold;">ROWS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="color: green;">1</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="color: green;">1</span> <span style="font-weight:bold;">FOLLOWING</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">LISTAGG_ROWS</span><span >,</span>
301301
<span style="font-weight:bold;">LISTAGG</span>(<span style="color: #333;">arg</span><span >,</span> <span style="color: blue;">','</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">part</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">ord</span> <span style="font-weight:bold;">RANGE</span> <span style="font-weight:bold;">BETWEEN</span> <span style="color: green;">1</span> <span style="font-weight:bold;">PRECEDING</span> <span style="font-weight:bold;">AND</span> <span style="color: green;">1</span> <span style="font-weight:bold;">FOLLOWING</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">LISTAGG_RANGE</span><span >,</span>
302-
<span style="font-weight:bold;">MIN</span>(<span style="color: #333;">Revenue</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">DepartmentID</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">RevenueYear</span> <span style="font-weight:bold;">ROWS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">CURRENT ROW</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">FOLLOWING</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">MinRevenueBeyond</span>
302+
<span style="font-weight:bold;">MIN</span>(<span style="color: #333;">Revenue</span>) <span style="font-weight:bold;">OVER</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">DepartmentID</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">RevenueYear</span> <span style="font-weight:bold;">ROWS</span> <span style="font-weight:bold;">BETWEEN</span> <span style="font-weight:bold;">CURRENT</span> <span style="font-weight:bold;">ROW</span> <span style="font-weight:bold;">AND</span> <span style="font-weight:bold;">UNBOUNDED</span> <span style="font-weight:bold;">FOLLOWING</span>) <span style="font-weight:bold;">AS</span> <span style="color: #333;">MinRevenueBeyond</span>
303303
<span style="font-weight:bold;">FROM</span> <span style="color: #333;">t1</span>
304304
<span style="font-weight:bold;">WINDOW</span> <span style="color: #333;">w1</span> <span style="font-weight:bold;">AS</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">department</span><span >,</span> <span style="color: #333;">division</span>)<span >,</span> <span style="color: #333;">w2</span> <span style="font-weight:bold;">AS</span> (<span style="color: #333;">w1</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">hire_date</span>)<span >;</span></pre>
305305
---

0 commit comments

Comments
 (0)
Please sign in to comment.