Skip to content

Commit 34fcd2f

Browse files
authored
Merge pull request #72 from ndm2/common-table-expressions-and-window-functions
Add support for common table expressions and window functions
2 parents dd01fe1 + f8bfd19 commit 34fcd2f

File tree

7 files changed

+561
-1
lines changed

7 files changed

+561
-1
lines changed

src/Tokenizer.php

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ final class Tokenizer
7070
'CONVERT',
7171
'CREATE',
7272
'CROSS',
73+
'CURRENT ROW',
7374
'CURRENT_TIMESTAMP',
7475
'DATABASE',
7576
'DATABASES',
@@ -108,19 +109,22 @@ final class Tokenizer
108109
'FAST',
109110
'FIELDS',
110111
'FILE',
112+
'FILTER',
111113
'FIRST',
112114
'FIXED',
113115
'FLUSH',
114116
'FOR',
115117
'FORCE',
118+
'FOLLOWING',
116119
'FOREIGN',
117120
'FULL',
118121
'FULLTEXT',
119122
'FUNCTION',
120123
'GLOBAL',
121124
'GRANT',
122125
'GRANTS',
123-
'GROUP_CONCAT',
126+
'GROUP',
127+
'GROUPS',
124128
'HEAP',
125129
'HIGH_PRIORITY',
126130
'HOSTS',
@@ -180,6 +184,7 @@ final class Tokenizer
180184
'MYISAM',
181185
'NAMES',
182186
'NATURAL',
187+
'NO OTHERS',
183188
'NOT',
184189
'NOW()',
185190
'NULL',
@@ -192,12 +197,14 @@ final class Tokenizer
192197
'ON UPDATE',
193198
'ON DELETE',
194199
'OUTFILE',
200+
'OVER',
195201
'PACK_KEYS',
196202
'PAGE',
197203
'PARTIAL',
198204
'PARTITION',
199205
'PARTITIONS',
200206
'PASSWORD',
207+
'PRECEDING',
201208
'PRIMARY',
202209
'PRIVILEGES',
203210
'PROCEDURE',
@@ -213,6 +220,7 @@ final class Tokenizer
213220
'READ',
214221
'READ_ONLY',
215222
'READ_WRITE',
223+
'RECURSIVE',
216224
'REFERENCES',
217225
'REGEXP',
218226
'RELOAD',
@@ -277,13 +285,15 @@ final class Tokenizer
277285
'TEMPORARY',
278286
'TERMINATED',
279287
'THEN',
288+
'TIES',
280289
'TO',
281290
'TRAILING',
282291
'TRANSACTIONAL',
283292
'TRUE',
284293
'TRUNCATE',
285294
'TYPE',
286295
'TYPES',
296+
'UNBOUNDED',
287297
'UNCOMMITTED',
288298
'UNIQUE',
289299
'UNLOCK',
@@ -307,6 +317,7 @@ final class Tokenizer
307317
* @var string[]
308318
*/
309319
private $reservedToplevel = [
320+
'WITH',
310321
'SELECT',
311322
'FROM',
312323
'WHERE',
@@ -327,6 +338,11 @@ final class Tokenizer
327338
'UNION',
328339
'EXCEPT',
329340
'INTERSECT',
341+
'PARTITION BY',
342+
'ROWS',
343+
'RANGE',
344+
'GROUPS',
345+
'WINDOW',
330346
];
331347

332348
/** @var string[] */
@@ -341,6 +357,7 @@ final class Tokenizer
341357
'XOR',
342358
'OR',
343359
'AND',
360+
'EXCLUDE',
344361
];
345362

346363
/** @var string[] */
@@ -351,6 +368,7 @@ final class Tokenizer
351368
'ADDTIME',
352369
'AES_DECRYPT',
353370
'AES_ENCRYPT',
371+
'APPROX_COUNT_DISTINCT',
354372
'AREA',
355373
'ASBINARY',
356374
'ASCII',
@@ -380,6 +398,7 @@ final class Tokenizer
380398
'CHARACTER_LENGTH',
381399
'CHARSET',
382400
'CHAR_LENGTH',
401+
'CHECKSUM_AGG',
383402
'COALESCE',
384403
'COERCIBILITY',
385404
'COLLATION',
@@ -395,8 +414,10 @@ final class Tokenizer
395414
'COS',
396415
'COT',
397416
'COUNT',
417+
'COUNT_BIG',
398418
'CRC32',
399419
'CROSSES',
420+
'CUME_DIST',
400421
'CURDATE',
401422
'CURRENT_DATE',
402423
'CURRENT_TIME',
@@ -418,6 +439,7 @@ final class Tokenizer
418439
'DECODE',
419440
'DEFAULT',
420441
'DEGREES',
442+
'DENSE_RANK',
421443
'DES_DECRYPT',
422444
'DES_ENCRYPT',
423445
'DIFFERENCE',
@@ -437,6 +459,7 @@ final class Tokenizer
437459
'EXTRACTVALUE',
438460
'FIELD',
439461
'FIND_IN_SET',
462+
'FIRST_VALUE',
440463
'FLOOR',
441464
'FORMAT',
442465
'FOUND_ROWS',
@@ -457,6 +480,8 @@ final class Tokenizer
457480
'GET_LOCK',
458481
'GLENGTH',
459482
'GREATEST',
483+
'GROUPING',
484+
'GROUPING_ID',
460485
'GROUP_CONCAT',
461486
'GROUP_UNIQUE_USERS',
462487
'HEX',
@@ -478,9 +503,12 @@ final class Tokenizer
478503
'ISSIMPLE',
479504
'IS_FREE_LOCK',
480505
'IS_USED_LOCK',
506+
'LAG',
481507
'LAST_DAY',
482508
'LAST_INSERT_ID',
509+
'LAST_VALUE',
483510
'LCASE',
511+
'LEAD',
484512
'LEAST',
485513
'LEFT',
486514
'LENGTH',
@@ -489,6 +517,7 @@ final class Tokenizer
489517
'LINESTRING',
490518
'LINESTRINGFROMTEXT',
491519
'LINESTRINGFROMWKB',
520+
'LISTAGG',
492521
'LN',
493522
'LOAD_FILE',
494523
'LOCALTIME',
@@ -536,6 +565,8 @@ final class Tokenizer
536565
'MULTIPOLYGONFROMTEXT',
537566
'MULTIPOLYGONFROMWKB',
538567
'NAME_CONST',
568+
'NTH_VALUE',
569+
'NTILE',
539570
'NULLIF',
540571
'NUMGEOMETRIES',
541572
'NUMINTERIORRINGS',
@@ -546,6 +577,9 @@ final class Tokenizer
546577
'ORD',
547578
'OVERLAPS',
548579
'PASSWORD',
580+
'PERCENT_RANK',
581+
'PERCENTILE_CONT',
582+
'PERCENTILE_DISC',
549583
'PERIOD_ADD',
550584
'PERIOD_DIFF',
551585
'PI',
@@ -566,6 +600,7 @@ final class Tokenizer
566600
'QUOTE',
567601
'RADIANS',
568602
'RAND',
603+
'RANK',
569604
'RELATED',
570605
'RELEASE_LOCK',
571606
'REPEAT',
@@ -574,6 +609,7 @@ final class Tokenizer
574609
'RIGHT',
575610
'ROUND',
576611
'ROW_COUNT',
612+
'ROW_NUMBER',
577613
'RPAD',
578614
'RTRIM',
579615
'SCHEMA',
@@ -591,9 +627,12 @@ final class Tokenizer
591627
'SRID',
592628
'STARTPOINT',
593629
'STD',
630+
'STDEV',
631+
'STDEVP',
594632
'STDDEV',
595633
'STDDEV_POP',
596634
'STDDEV_SAMP',
635+
'STRING_AGG',
597636
'STRCMP',
598637
'STR_TO_DATE',
599638
'SUBDATE',
@@ -630,7 +669,9 @@ final class Tokenizer
630669
'UTC_TIME',
631670
'UTC_TIMESTAMP',
632671
'UUID',
672+
'VAR',
633673
'VARIANCE',
674+
'VARP',
634675
'VAR_POP',
635676
'VAR_SAMP',
636677
'VERSION',

tests/clihighlight.html

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,3 +824,154 @@
824824
FROM
825825
b
826826
LEFT OUTER JOIN c on (d = f);
827+
---
828+
WITH
829+
cte AS (
830+
SELECT
831+
a,
832+
b
833+
FROM
834+
table
835+
),
836+
RECURSIVE fibonacci (n, fib_n, next_fib_n) AS (
837+
SELECT
838+
1,
839+
0,
840+
1
841+
UNION ALL
842+
SELECT
843+
n + 1,
844+
next_fib_n,
845+
fib_n + next_fib_n
846+
FROM
847+
fibonacci
848+
WHERE
849+
n < 10
850+
)
851+
SELECT
852+
*
853+
FROM
854+
fibonacci;
855+
---
856+
WITH
857+
cte1 AS (
858+
SELECT
859+
a,
860+
b
861+
FROM
862+
table1
863+
),
864+
cte2 AS (
865+
SELECT
866+
c,
867+
d
868+
FROM
869+
table2
870+
)
871+
SELECT
872+
b,
873+
d
874+
FROM
875+
cte1
876+
JOIN cte2
877+
WHERE
878+
cte1.a = cte2.c;
879+
---
880+
SELECT
881+
a,
882+
GROUP_CONCAT(b, '.') OVER (
883+
ORDER BY
884+
c
885+
GROUPS
886+
BETWEEN UNBOUNDED PRECEDING
887+
AND CURRENT ROW
888+
EXCLUDE NO OTHERS
889+
) AS no_others,
890+
GROUP_CONCAT(b, '.') OVER (
891+
ORDER BY
892+
c
893+
GROUPS
894+
BETWEEN UNBOUNDED PRECEDING
895+
AND CURRENT ROW
896+
EXCLUDE CURRENT ROW
897+
) AS current_row,
898+
GROUP_CONCAT(b, '.') OVER (
899+
ORDER BY
900+
c
901+
GROUPS
902+
BETWEEN UNBOUNDED PRECEDING
903+
AND CURRENT ROW
904+
EXCLUDE GROUP
905+
) AS grp,
906+
GROUP_CONCAT(b, '.') OVER (
907+
ORDER BY
908+
c
909+
GROUPS
910+
BETWEEN UNBOUNDED PRECEDING
911+
AND CURRENT ROW
912+
EXCLUDE TIES
913+
) AS tie,
914+
GROUP_CONCAT(b, '.') FILTER (
915+
WHERE
916+
c != 'two'
917+
) OVER (
918+
ORDER BY
919+
a
920+
) AS filtered,
921+
CONVERT(
922+
VARCHAR(20),
923+
AVG(SalesYTD) OVER (
924+
PARTITION BY
925+
TerritoryID
926+
ORDER BY
927+
DATEPART(yy, ModifiedDate)
928+
),
929+
1
930+
) AS MovingAvg,
931+
AVG(starting_salary) OVER w2 AVG,
932+
MIN(starting_salary) OVER w2 MIN_STARTING_SALARY,
933+
MAX(starting_salary) OVER (
934+
w1
935+
ORDER BY
936+
hire_date
937+
),
938+
LISTAGG(arg, ',') OVER (
939+
PARTITION BY
940+
part
941+
ORDER BY
942+
ord
943+
ROWS
944+
BETWEEN 1 PRECEDING
945+
AND 1 FOLLOWING
946+
) AS LISTAGG_ROWS,
947+
LISTAGG(arg, ',') OVER (
948+
PARTITION BY
949+
part
950+
ORDER BY
951+
ord
952+
RANGE
953+
BETWEEN 1 PRECEDING
954+
AND 1 FOLLOWING
955+
) AS LISTAGG_RANGE,
956+
MIN(Revenue) OVER (
957+
PARTITION BY
958+
DepartmentID
959+
ORDER BY
960+
RevenueYear
961+
ROWS
962+
BETWEEN CURRENT ROW
963+
AND UNBOUNDED FOLLOWING
964+
) AS MinRevenueBeyond
965+
FROM
966+
t1
967+
WINDOW
968+
w1 AS (
969+
PARTITION BY
970+
department,
971+
division
972+
),
973+
w2 AS (
974+
w1
975+
ORDER BY
976+
hire_date
977+
);

0 commit comments

Comments
 (0)