Token::tokenHasLimitClause()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 1
Metric Value
c 1
b 1
f 1
dl 0
loc 6
rs 9.4286
cc 3
eloc 3
nc 2
nop 3
1
<?php
2
/**
3
 * Author: Nil Portugués Calderó <[email protected]>
4
 * Date: 12/22/14
5
 * Time: 11:38 AM.
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace NilPortugues\Sql\QueryFormatter\Helper;
12
13
use NilPortugues\Sql\QueryFormatter\Formatter;
14
use NilPortugues\Sql\QueryFormatter\Tokenizer\Tokenizer;
15
16
/**
17
 * Class Token.
18
 */
19
final class Token
20
{
21
    /**
22
     * @var array
23
     */
24
    public static $reserved = [
25
        'ACCESSIBLE',
26
        'ACTION',
27
        'AGAINST',
28
        'AGGREGATE',
29
        'ALGORITHM',
30
        'ALL',
31
        'ALTER',
32
        'ANALYSE',
33
        'ANALYZE',
34
        'AS',
35
        'ASC',
36
        'AUTOCOMMIT',
37
        'AUTO_INCREMENT',
38
        'BACKUP',
39
        'BEGIN',
40
        'BETWEEN',
41
        'BINLOG',
42
        'BOTH',
43
        'CASCADE',
44
        'CASE',
45
        'CHANGE',
46
        'CHANGED',
47
        'CHARACTER SET',
48
        'CHARSET',
49
        'CHECK',
50
        'CHECKSUM',
51
        'COLLATE',
52
        'COLLATION',
53
        'COLUMN',
54
        'COLUMNS',
55
        'COMMENT',
56
        'COMMIT',
57
        'COMMITTED',
58
        'COMPRESSED',
59
        'CONCURRENT',
60
        'CONSTRAINT',
61
        'CONTAINS',
62
        'CONVERT',
63
        'CREATE',
64
        'CROSS',
65
        'CURRENT_TIMESTAMP',
66
        'DATABASE',
67
        'DATABASES',
68
        'DAY',
69
        'DAY_HOUR',
70
        'DAY_MINUTE',
71
        'DAY_SECOND',
72
        'DEFAULT',
73
        'DEFINER',
74
        'DELAYED',
75
        'DELETE',
76
        'DESC',
77
        'DESCRIBE',
78
        'DETERMINISTIC',
79
        'DISTINCT',
80
        'DISTINCTROW',
81
        'DIV',
82
        'DO',
83
        'DUMPFILE',
84
        'DUPLICATE',
85
        'DYNAMIC',
86
        'ELSE',
87
        'ENCLOSED',
88
        'END',
89
        'ENGINE',
90
        'ENGINE_TYPE',
91
        'ENGINES',
92
        'ESCAPE',
93
        'ESCAPED',
94
        'EVENTS',
95
        'EXEC',
96
        'EXECUTE',
97
        'EXISTS',
98
        'EXPLAIN',
99
        'EXTENDED',
100
        'FAST',
101
        'FIELDS',
102
        'FILE',
103
        'FIRST',
104
        'FIXED',
105
        'FLUSH',
106
        'FOR',
107
        'FORCE',
108
        'FOREIGN',
109
        'FULL',
110
        'FULLTEXT',
111
        'FUNCTION',
112
        'GLOBAL',
113
        'GRANT',
114
        'GRANTS',
115
        'GROUP_CONCAT',
116
        'HEAP',
117
        'HIGH_PRIORITY',
118
        'HOSTS',
119
        'HOUR',
120
        'HOUR_MINUTE',
121
        'HOUR_SECOND',
122
        'IDENTIFIED',
123
        'IF',
124
        'IFNULL',
125
        'IGNORE',
126
        'IN',
127
        'INDEX',
128
        'INDEXES',
129
        'INFILE',
130
        'INSERT',
131
        'INSERT_ID',
132
        'INSERT_METHOD',
133
        'INTERVAL',
134
        'INTO',
135
        'INVOKER',
136
        'IS',
137
        'ISOLATION',
138
        'KEY',
139
        'KEYS',
140
        'KILL',
141
        'LAST_INSERT_ID',
142
        'LEADING',
143
        'LEVEL',
144
        'LIKE',
145
        'LINEAR',
146
        'LINES',
147
        'LOAD',
148
        'LOCAL',
149
        'LOCK',
150
        'LOCKS',
151
        'LOGS',
152
        'LOW_PRIORITY',
153
        'MARIA',
154
        'MASTER',
155
        'MASTER_CONNECT_RETRY',
156
        'MASTER_HOST',
157
        'MASTER_LOG_FILE',
158
        'MATCH',
159
        'MAX_CONNECTIONS_PER_HOUR',
160
        'MAX_QUERIES_PER_HOUR',
161
        'MAX_ROWS',
162
        'MAX_UPDATES_PER_HOUR',
163
        'MAX_USER_CONNECTIONS',
164
        'MEDIUM',
165
        'MERGE',
166
        'MINUTE',
167
        'MINUTE_SECOND',
168
        'MIN_ROWS',
169
        'MODE',
170
        'MODIFY',
171
        'MONTH',
172
        'MRG_MYISAM',
173
        'MYISAM',
174
        'NAMES',
175
        'NATURAL',
176
        'NOT',
177
        'NOW()',
178
        'NULL',
179
        'OFFSET',
180
        'ON',
181
        'OPEN',
182
        'OPTIMIZE',
183
        'OPTION',
184
        'OPTIONALLY',
185
        'ON UPDATE',
186
        'ON DELETE',
187
        'OUTFILE',
188
        'PACK_KEYS',
189
        'PAGE',
190
        'PARTIAL',
191
        'PARTITION',
192
        'PARTITIONS',
193
        'PASSWORD',
194
        'PRIMARY',
195
        'PRIVILEGES',
196
        'PROCEDURE',
197
        'PROCESS',
198
        'PROCESSLIST',
199
        'PURGE',
200
        'QUICK',
201
        'RANGE',
202
        'RAID0',
203
        'RAID_CHUNKS',
204
        'RAID_CHUNKSIZE',
205
        'RAID_TYPE',
206
        'READ',
207
        'READ_ONLY',
208
        'READ_WRITE',
209
        'REFERENCES',
210
        'REGEXP',
211
        'RELOAD',
212
        'RENAME',
213
        'REPAIR',
214
        'REPEATABLE',
215
        'REPLACE',
216
        'REPLICATION',
217
        'RESET',
218
        'RESTORE',
219
        'RESTRICT',
220
        'RETURN',
221
        'RETURNS',
222
        'REVOKE',
223
        'RLIKE',
224
        'ROLLBACK',
225
        'ROW',
226
        'ROWS',
227
        'ROW_FORMAT',
228
        'SECOND',
229
        'SECURITY',
230
        'SEPARATOR',
231
        'SERIALIZABLE',
232
        'SESSION',
233
        'SHARE',
234
        'SHOW',
235
        'SHUTDOWN',
236
        'SLAVE',
237
        'SONAME',
238
        'SOUNDS',
239
        'SQL',
240
        'SQL_AUTO_IS_NULL',
241
        'SQL_BIG_RESULT',
242
        'SQL_BIG_SELECTS',
243
        'SQL_BIG_TABLES',
244
        'SQL_BUFFER_RESULT',
245
        'SQL_CALC_FOUND_ROWS',
246
        'SQL_LOG_BIN',
247
        'SQL_LOG_OFF',
248
        'SQL_LOG_UPDATE',
249
        'SQL_LOW_PRIORITY_UPDATES',
250
        'SQL_MAX_JOIN_SIZE',
251
        'SQL_QUOTE_SHOW_CREATE',
252
        'SQL_SAFE_UPDATES',
253
        'SQL_SELECT_LIMIT',
254
        'SQL_SLAVE_SKIP_COUNTER',
255
        'SQL_SMALL_RESULT',
256
        'SQL_WARNINGS',
257
        'SQL_CACHE',
258
        'SQL_NO_CACHE',
259
        'START',
260
        'STARTING',
261
        'STATUS',
262
        'STOP',
263
        'STORAGE',
264
        'STRAIGHT_JOIN',
265
        'STRING',
266
        'STRIPED',
267
        'SUPER',
268
        'TABLE',
269
        'TABLES',
270
        'TEMPORARY',
271
        'TERMINATED',
272
        'THEN',
273
        'TO',
274
        'TRAILING',
275
        'TRANSACTIONAL',
276
        'TRUE',
277
        'TRUNCATE',
278
        'TYPE',
279
        'TYPES',
280
        'UNCOMMITTED',
281
        'UNIQUE',
282
        'UNLOCK',
283
        'UNSIGNED',
284
        'USAGE',
285
        'USE',
286
        'USING',
287
        'VARIABLES',
288
        'VIEW',
289
        'WHEN',
290
        'WITH',
291
        'WORK',
292
        'WRITE',
293
        'YEAR_MONTH',
294
    ];
295
296
    /**
297
     * @var array
298
     */
299
    public static $reservedTopLevel = [
300
        'SELECT',
301
        'FROM',
302
        'WHERE',
303
        'SET',
304
        'ORDER BY',
305
        'GROUP BY',
306
        'LIMIT',
307
        'DROP',
308
        'VALUES',
309
        'UPDATE',
310
        'HAVING',
311
        'ADD',
312
        'AFTER',
313
        'ALTER TABLE',
314
        'DELETE FROM',
315
        'UNION ALL',
316
        'UNION',
317
        'EXCEPT',
318
        'INTERSECT',
319
    ];
320
321
    /**
322
     * @var array
323
     */
324
    public static $reservedNewLine = [
325
        'LEFT OUTER JOIN',
326
        'RIGHT OUTER JOIN',
327
        'LEFT JOIN',
328
        'RIGHT JOIN',
329
        'OUTER JOIN',
330
        'INNER JOIN',
331
        'JOIN',
332
        'XOR',
333
        'OR',
334
        'AND',
335
    ];
336
337
    /**
338
     * @var array
339
     */
340
    public static $functions = [
341
        'ABS',
342
        'ACOS',
343
        'ADDDATE',
344
        'ADDTIME',
345
        'AES_DECRYPT',
346
        'AES_ENCRYPT',
347
        'AREA',
348
        'ASBINARY',
349
        'ASCII',
350
        'ASIN',
351
        'ASTEXT',
352
        'ATAN',
353
        'ATAN2',
354
        'AVG',
355
        'BDMPOLYFROMTEXT',
356
        'BDMPOLYFROMWKB',
357
        'BDPOLYFROMTEXT',
358
        'BDPOLYFROMWKB',
359
        'BENCHMARK',
360
        'BIN',
361
        'BIT_AND',
362
        'BIT_COUNT',
363
        'BIT_LENGTH',
364
        'BIT_OR',
365
        'BIT_XOR',
366
        'BOUNDARY',
367
        'BUFFER',
368
        'CAST',
369
        'CEIL',
370
        'CEILING',
371
        'CENTROID',
372
        'CHAR',
373
        'CHARACTER_LENGTH',
374
        'CHARSET',
375
        'CHAR_LENGTH',
376
        'COALESCE',
377
        'COERCIBILITY',
378
        'COLLATION',
379
        'COMPRESS',
380
        'CONCAT',
381
        'CONCAT_WS',
382
        'CONNECTION_ID',
383
        'CONTAINS',
384
        'CONV',
385
        'CONVERT',
386
        'CONVERT_TZ',
387
        'CONVEXHULL',
388
        'COS',
389
        'COT',
390
        'COUNT',
391
        'CRC32',
392
        'CROSSES',
393
        'CURDATE',
394
        'CURRENT_DATE',
395
        'CURRENT_TIME',
396
        'CURRENT_TIMESTAMP',
397
        'CURRENT_USER',
398
        'CURTIME',
399
        'DATABASE',
400
        'DATE',
401
        'DATEDIFF',
402
        'DATE_ADD',
403
        'DATE_DIFF',
404
        'DATE_FORMAT',
405
        'DATE_SUB',
406
        'DAY',
407
        'DAYNAME',
408
        'DAYOFMONTH',
409
        'DAYOFWEEK',
410
        'DAYOFYEAR',
411
        'DECODE',
412
        'DEFAULT',
413
        'DEGREES',
414
        'DES_DECRYPT',
415
        'DES_ENCRYPT',
416
        'DIFFERENCE',
417
        'DIMENSION',
418
        'DISJOINT',
419
        'DISTANCE',
420
        'ELT',
421
        'ENCODE',
422
        'ENCRYPT',
423
        'ENDPOINT',
424
        'ENVELOPE',
425
        'EQUALS',
426
        'EXP',
427
        'EXPORT_SET',
428
        'EXTERIORRING',
429
        'EXTRACT',
430
        'EXTRACTVALUE',
431
        'FIELD',
432
        'FIND_IN_SET',
433
        'FLOOR',
434
        'FORMAT',
435
        'FOUND_ROWS',
436
        'FROM_DAYS',
437
        'FROM_UNIXTIME',
438
        'GEOMCOLLFROMTEXT',
439
        'GEOMCOLLFROMWKB',
440
        'GEOMETRYCOLLECTION',
441
        'GEOMETRYCOLLECTIONFROMTEXT',
442
        'GEOMETRYCOLLECTIONFROMWKB',
443
        'GEOMETRYFROMTEXT',
444
        'GEOMETRYFROMWKB',
445
        'GEOMETRYN',
446
        'GEOMETRYTYPE',
447
        'GEOMFROMTEXT',
448
        'GEOMFROMWKB',
449
        'GET_FORMAT',
450
        'GET_LOCK',
451
        'GLENGTH',
452
        'GREATEST',
453
        'GROUP_CONCAT',
454
        'GROUP_UNIQUE_USERS',
455
        'HEX',
456
        'HOUR',
457
        'IF',
458
        'IFNULL',
459
        'INET_ATON',
460
        'INET_NTOA',
461
        'INSERT',
462
        'INSTR',
463
        'INTERIORRINGN',
464
        'INTERSECTION',
465
        'INTERSECTS',
466
        'INTERVAL',
467
        'ISCLOSED',
468
        'ISEMPTY',
469
        'ISNULL',
470
        'ISRING',
471
        'ISSIMPLE',
472
        'IS_FREE_LOCK',
473
        'IS_USED_LOCK',
474
        'LAST_DAY',
475
        'LAST_INSERT_ID',
476
        'LCASE',
477
        'LEAST',
478
        'LEFT',
479
        'LENGTH',
480
        'LINEFROMTEXT',
481
        'LINEFROMWKB',
482
        'LINESTRING',
483
        'LINESTRINGFROMTEXT',
484
        'LINESTRINGFROMWKB',
485
        'LN',
486
        'LOAD_FILE',
487
        'LOCALTIME',
488
        'LOCALTIMESTAMP',
489
        'LOCATE',
490
        'LOG',
491
        'LOG10',
492
        'LOG2',
493
        'LOWER',
494
        'LPAD',
495
        'LTRIM',
496
        'MAKEDATE',
497
        'MAKETIME',
498
        'MAKE_SET',
499
        'MASTER_POS_WAIT',
500
        'MAX',
501
        'MBRCONTAINS',
502
        'MBRDISJOINT',
503
        'MBREQUAL',
504
        'MBRINTERSECTS',
505
        'MBROVERLAPS',
506
        'MBRTOUCHES',
507
        'MBRWITHIN',
508
        'MD5',
509
        'MICROSECOND',
510
        'MID',
511
        'MIN',
512
        'MINUTE',
513
        'MLINEFROMTEXT',
514
        'MLINEFROMWKB',
515
        'MOD',
516
        'MONTH',
517
        'MONTHNAME',
518
        'MPOINTFROMTEXT',
519
        'MPOINTFROMWKB',
520
        'MPOLYFROMTEXT',
521
        'MPOLYFROMWKB',
522
        'MULTILINESTRING',
523
        'MULTILINESTRINGFROMTEXT',
524
        'MULTILINESTRINGFROMWKB',
525
        'MULTIPOINT',
526
        'MULTIPOINTFROMTEXT',
527
        'MULTIPOINTFROMWKB',
528
        'MULTIPOLYGON',
529
        'MULTIPOLYGONFROMTEXT',
530
        'MULTIPOLYGONFROMWKB',
531
        'NAME_CONST',
532
        'NULLIF',
533
        'NUMGEOMETRIES',
534
        'NUMINTERIORRINGS',
535
        'NUMPOINTS',
536
        'OCT',
537
        'OCTET_LENGTH',
538
        'OLD_PASSWORD',
539
        'ORD',
540
        'OVERLAPS',
541
        'PASSWORD',
542
        'PERIOD_ADD',
543
        'PERIOD_DIFF',
544
        'PI',
545
        'POINT',
546
        'POINTFROMTEXT',
547
        'POINTFROMWKB',
548
        'POINTN',
549
        'POINTONSURFACE',
550
        'POLYFROMTEXT',
551
        'POLYFROMWKB',
552
        'POLYGON',
553
        'POLYGONFROMTEXT',
554
        'POLYGONFROMWKB',
555
        'POSITION',
556
        'POW',
557
        'POWER',
558
        'QUARTER',
559
        'QUOTE',
560
        'RADIANS',
561
        'RAND',
562
        'RELATED',
563
        'RELEASE_LOCK',
564
        'REPEAT',
565
        'REPLACE',
566
        'REVERSE',
567
        'RIGHT',
568
        'ROUND',
569
        'ROW_COUNT',
570
        'RPAD',
571
        'RTRIM',
572
        'SCHEMA',
573
        'SECOND',
574
        'SEC_TO_TIME',
575
        'SESSION_USER',
576
        'SHA',
577
        'SHA1',
578
        'SIGN',
579
        'SIN',
580
        'SLEEP',
581
        'SOUNDEX',
582
        'SPACE',
583
        'SQRT',
584
        'SRID',
585
        'STARTPOINT',
586
        'STD',
587
        'STDDEV',
588
        'STDDEV_POP',
589
        'STDDEV_SAMP',
590
        'STRCMP',
591
        'STR_TO_DATE',
592
        'SUBDATE',
593
        'SUBSTR',
594
        'SUBSTRING',
595
        'SUBSTRING_INDEX',
596
        'SUBTIME',
597
        'SUM',
598
        'SYMDIFFERENCE',
599
        'SYSDATE',
600
        'SYSTEM_USER',
601
        'TAN',
602
        'TIME',
603
        'TIMEDIFF',
604
        'TIMESTAMP',
605
        'TIMESTAMPADD',
606
        'TIMESTAMPDIFF',
607
        'TIME_FORMAT',
608
        'TIME_TO_SEC',
609
        'TOUCHES',
610
        'TO_DAYS',
611
        'TRIM',
612
        'TRUNCATE',
613
        'UCASE',
614
        'UNCOMPRESS',
615
        'UNCOMPRESSED_LENGTH',
616
        'UNHEX',
617
        'UNIQUE_USERS',
618
        'UNIX_TIMESTAMP',
619
        'UPDATEXML',
620
        'UPPER',
621
        'USER',
622
        'UTC_DATE',
623
        'UTC_TIME',
624
        'UTC_TIMESTAMP',
625
        'UUID',
626
        'VARIANCE',
627
        'VAR_POP',
628
        'VAR_SAMP',
629
        'VERSION',
630
        'WEEK',
631
        'WEEKDAY',
632
        'WEEKOFYEAR',
633
        'WITHIN',
634
        'X',
635
        'Y',
636
        'YEAR',
637
        'YEARWEEK',
638
    ];
639
640
    /**
641
     * @var array
642
     */
643
    public static $boundaries = [
644
        ',',
645
        ';',
646
        ')',
647
        '(',
648
        '.',
649
        '=',
650
        '<',
651
        '>',
652
        '+',
653
        '-',
654
        '*',
655
        '/',
656
        '!',
657
        '^',
658
        '%',
659
        '|',
660
        '&',
661
        '#',
662
    ];
663
664
    /**
665
     * @param $token
666
     *
667
     * @return bool
668
     */
669
    public static function isTokenTypeReservedTopLevel($token)
670
    {
671
        return $token[Tokenizer::TOKEN_TYPE] === Tokenizer::TOKEN_TYPE_RESERVED_TOP_LEVEL;
672
    }
673
674
    /**
675
     * @param string      $token
676
     * @param Parentheses $parentheses
677
     * @param Formatter   $formatter
678
     */
679
    public static function tokenHasLimitClause($token, Parentheses $parentheses, Formatter $formatter)
680
    {
681
        if ('LIMIT' === $token[Tokenizer::TOKEN_VALUE] && false === $parentheses->getInlineParentheses()) {
682
            $formatter->setClauseLimit(true);
683
        }
684
    }
685
686
    /**
687
     * @param $token
688
     * @param $tokens
689
     * @param $i
690
     * @param $originalTokens
691
     *
692
     * @return bool
693
     */
694
    public static function tokenHasMultipleBoundaryCharactersTogether($token, &$tokens, $i, &$originalTokens)
695
    {
696
        return $token[Tokenizer::TOKEN_TYPE] === Tokenizer::TOKEN_TYPE_BOUNDARY
697
        && self::tokenPreviousCharacterIsBoundary($tokens, $i)
698
        && self::tokenPreviousCharacterIsWhiteSpace($token, $originalTokens);
699
    }
700
701
    /**
702
     * @param $tokens
703
     * @param $i
704
     *
705
     * @return bool
706
     */
707
    public static function tokenPreviousCharacterIsBoundary(&$tokens, $i)
708
    {
709
        return (isset($tokens[$i - 1]) && $tokens[$i - 1][Tokenizer::TOKEN_TYPE] === Tokenizer::TOKEN_TYPE_BOUNDARY);
710
    }
711
712
    /**
713
     * @param $token
714
     * @param $originalTokens
715
     *
716
     * @return bool
717
     */
718
    public static function tokenPreviousCharacterIsWhiteSpace($token, &$originalTokens)
719
    {
720
        return (isset($originalTokens[$token['i'] - 1])
721
            && $originalTokens[$token['i'] - 1][Tokenizer::TOKEN_TYPE] !== Tokenizer::TOKEN_TYPE_WHITESPACE);
722
    }
723
724
    /**
725
     * @param $token
726
     * @param $tokens
727
     * @param $i
728
     *
729
     * @return bool
730
     */
731
    public static function tokenIsMinusSign($token, &$tokens, $i)
732
    {
733
        return '-' === $token[Tokenizer::TOKEN_VALUE]
734
        && self::tokenNextCharacterIsNumber($tokens, $i)
735
        && isset($tokens[$i - 1]);
736
    }
737
738
    /**
739
     * @param $tokens
740
     * @param $i
741
     *
742
     * @return bool
743
     */
744
    public static function tokenNextCharacterIsNumber(&$tokens, $i)
745
    {
746
        return (isset($tokens[$i + 1])
747
            && $tokens[$i + 1][Tokenizer::TOKEN_TYPE] === Tokenizer::TOKEN_TYPE_NUMBER);
748
    }
749
}
750