2 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 lexer grammar MySQL51Lexer;
21 superClass=MySQLLexer;
25 package com.mysql.clusterj.jdbc.antlr;
30 /* These are actual reserved words that cannot be used as an identifier without quotes.
31 eventually we need to gate all these with a predicate (see nextTokenIsID) to allow the "word following a '.' character is always an identifier" rule
33 ACCESSIBLE : 'ACCESSIBLE';
41 ASENSITIVE : 'ASENSITIVE';
44 // BIGINT : 'BIGINT'; // datatype defined below
46 //BLOB : 'BLOB'; // datatype defined below
53 //CHAR : 'CHAR'; // datatype defined below
54 CHARACTER : 'CHARACTER';
58 CONDITION : 'CONDITION';
59 CONSTRAINT : 'CONSTRAINT';
60 CONTINUE : 'CONTINUE';
64 CURRENT_DATE : 'CURRENT_DATE';
65 CURRENT_TIME : 'CURRENT_TIME';
66 CURRENT_TIMESTAMP : 'CURRENT_TIMESTAMP';
67 //CURRENT_USER : 'CURRENT_USER'; //reserved, function below
69 DATABASE : 'DATABASE';
70 DATABASES : 'DATABASES';
71 DAY_HOUR : 'DAY_HOUR';
72 DAY_MICROSECOND : 'DAY_MICROSECOND';
73 DAY_MINUTE : 'DAY_MINUTE';
74 DAY_SECOND : 'DAY_SECOND';
76 //DECIMAL : 'DECIMAL'; // datatype defined below
82 DESCRIBE : 'DESCRIBE';
83 DETERMINISTIC : 'DETERMINISTIC';
84 DISTINCT : 'DISTINCT';
85 DISTINCTROW : 'DISTINCTROW';
87 //DOUBLE : 'DOUBLE'; // datatype defined below
93 ENCLOSED : 'ENCLOSED';
100 //FLOAT : 'FLOAT'; // datatype defined below
107 FULLTEXT : 'FULLTEXT';
112 HIGH_PRIORITY : 'HIGH_PRIORITY';
113 HOUR_MICROSECOND : 'HOUR_MICROSECOND';
114 HOUR_MINUTE : 'HOUR_MINUTE';
115 HOUR_SECOND : 'HOUR_SECOND';
120 INDEX_SYM : 'INDEX_SYM';
125 INSENSITIVE : 'INSENSITIVE';
126 //INSERT : 'INSERT'; // reserved keyword and function below
127 //INT : 'INT'; // datatype defined below
133 //INTEGER : 'INTEGER'; // datatype defined below
134 //INTERVAL : 'INTERVAL'; // reserved keyword and function below
145 //LEFT : 'LEFT'; // reserved keyword and function below
151 LOCALTIME : 'LOCALTIME';
152 LOCALTIMESTAMP : 'LOCALTIMESTAMP';
155 //LONGBLOB : 'LONGBLOB'; // datatype defined below
156 //LONGTEXT : 'LONGTEXT'; // datatype defined below
158 LOW_PRIORITY : 'LOW_PRIORITY';
159 MASTER_SSL_VERIFY_SERVER_CERT : 'MASTER_SSL_VERIFY_SERVER_CERT';
161 //MEDIUMBLOB : 'MEDIUMBLOB'; // datatype defined below
162 //MEDIUMINT : 'MEDIUMINT'; // datatype defined below
163 //MEDIUMTEXT : 'MEDIUMTEXT'; // datatype defined below
164 MIDDLEINT : 'MIDDLEINT'; // datatype defined below
165 MINUTE_MICROSECOND : 'MINUTE_MICROSECOND';
166 MINUTE_SECOND : 'MINUTE_SECOND';
168 MODIFIES : 'MODIFIES';
171 NO_WRITE_TO_BINLOG : 'NO_WRITE_TO_BINLOG';
173 //NUMERIC : 'NUMERIC'; // datatype defined below
175 OPTIMIZE : 'OPTIMIZE';
177 OPTIONALLY : 'OPTIONALLY';
183 PRECISION : 'PRECISION';
185 PROCEDURE : 'PROCEDURE';
190 READ_ONLY : 'READ_ONLY';
191 READ_WRITE : 'READ_WRITE';
192 //REAL : 'REAL'; // datatype defined below
193 REFERENCES : 'REFERENCES';
200 RESTRICT : 'RESTRICT';
203 //RIGHT : 'RIGHT'; // reserved keyword and function below
205 SCHEDULER : 'SCHEDULER';
208 SECOND_MICROSECOND : 'SECOND_MICROSECOND';
210 SENSITIVE : 'SENSITIVE';
211 SEPARATOR : 'SEPARATOR';
214 //SMALLINT : 'SMALLINT'; // datatype defined below
216 SPECIFIC : 'SPECIFIC';
218 SQLEXCEPTION : 'SQLEXCEPTION';
219 SQLSTATE : 'SQLSTATE';
220 SQLWARNING : 'SQLWARNING';
221 SQL_BIG_RESULT : 'SQL_BIG_RESULT';
222 SQL_CALC_FOUND_ROWS : 'SQL_CALC_FOUND_ROWS';
223 SQL_SMALL_RESULT : 'SQL_SMALL_RESULT';
225 STARTING : 'STARTING';
226 STRAIGHT_JOIN : 'STRAIGHT_JOIN';
228 TERMINATED : 'TERMINATED';
230 //TINYBLOB : 'TINYBLOB'; // datatype defined below
231 //TINYINT : 'TINYINT'; // datatype defined below
232 //TINYTEXT : 'TINYTEXT'; // datatype defined below
234 TRAILING : 'TRAILING';
241 UNSIGNED : 'UNSIGNED';
246 //UTC_DATE : 'UTC_DATE'; // next three are functions defined below
247 //UTC_TIME : 'UTC_TIME';
248 //UTC_TIMESTAMP : 'UTC_TIMESTAMP';
250 //VARBINARY : 'VARBINARY'; // datatype defined below
251 //VARCHAR : 'VARCHAR'; // datatype defined below
252 VARCHARACTER : 'VARCHARACTER';
260 YEAR_MONTH : 'YEAR_MONTH';
261 ZEROFILL : 'ZEROFILL';
266 // $< Keywords allowed as identifiers
267 /* the following two lists are taken from the official YACC grammar
268 * is contains all keywords that are allowed to be used as identifiers
269 * without quoting them.
271 /* Keyword that we allow for identifiers (except SP labels) */
273 // $< Keywords not in SP labels
281 CHECKSUM : 'CHECKSUM';
285 CONTAINS : 'CONTAINS';
286 DEALLOCATE : 'DEALLOCATE';
295 LANGUAGE : 'LANGUAGE';
301 PARTITION : 'PARTITION';
308 ROLLBACK : 'ROLLBACK';
309 SAVEPOINT : 'SAVEPOINT';
310 SECURITY : 'SECURITY';
318 TRUNCATE : 'TRUNCATE';
320 UNINSTALL : 'UNINSTALL';
325 // $> Keywords not in SP labels
327 // $< Keywords in SP labels
328 /* Keywords that we allow for labels in SPs. */
330 //ADDDATE : 'ADDDATE'; // function defined below
333 AGGREGATE : 'AGGREGATE';
334 ALGORITHM : 'ALGORITHM';
338 AUTO_INCREMENT : 'AUTO_INCREMENT';
339 AUTOEXTEND_SIZE : 'AUTOEXTEND_SIZE';
341 AVG_ROW_LENGTH : 'AVG_ROW_LENGTH';
343 // BIT : 'BIT'; // datatype defined below
348 CASCADED : 'CASCADED';
353 COALESCE : 'COALESCE';
355 COLLATION : 'COLLATION';
357 // FIELDS is a synonym for COLUMNS
359 COMMITTED : 'COMMITTED';
361 COMPLETION : 'COMPLETION';
362 COMPRESSED : 'COMPRESSED';
363 CONCURRENT : 'CONCURRENT';
364 CONNECTION : 'CONNECTION';
365 CONSISTENT : 'CONSISTENT';
367 CONTRIBUTORS : 'CONTRIBUTORS';
371 DATAFILE : 'DATAFILE';
372 // DATETIME : 'DATETIME'; // datatype defined below
373 // DATE : 'DATE'; // datatype defined below
374 //DAY : 'DAY'; // reserved, is also function below
376 DELAY_KEY_WRITE : 'DELAY_KEY_WRITE';
377 DES_KEY_FILE : 'DES_KEY_FILE';
378 DIRECTORY : 'DIRECTORY';
382 DUMPFILE : 'DUMPFILE';
383 DUPLICATE : 'DUPLICATE';
386 //ENUM : 'ENUM'; // datatype defined below
394 EXPANSION : 'EXPANSION';
395 EXTENDED : 'EXTENDED';
396 EXTENT_SIZE : 'EXTENT_SIZE';
405 FRAC_SECOND : 'FRAC_SECOND';
406 GEOMETRY : 'GEOMETRY';
407 GEOMETRYCOLLECTION : 'GEOMETRYCOLLECTION';
408 //GET_FORMAT : 'GET_FORMAT'; //function defined below
413 //HOUR : 'HOUR'; //reserved, also function below
414 IDENTIFIED : 'IDENTIFIED';
418 INITIAL_SIZE : 'INITIAL_SIZE';
421 ISOLATION : 'ISOLATION';
423 INNOBASE : 'INNOBASE';
424 INSERT_METHOD : 'INSERT_METHOD';
425 KEY_BLOCK_SIZE : 'KEY_BLOCK_SIZE';
430 LINESTRING : 'LINESTRING'; // geometry function
436 MAX_ROWS : 'MAX_ROWS';
438 MASTER_HOST : 'MASTER_HOST';
439 MASTER_PORT : 'MASTER_PORT';
440 MASTER_LOG_FILE : 'MASTER_LOG_FILE';
441 MASTER_LOG_POS : 'MASTER_LOG_POS';
442 MASTER_USER : 'MASTER_USER';
443 MASTER_PASSWORD : 'MASTER_PASSWORD';
444 MASTER_SERVER_ID : 'MASTER_SERVER_ID';
445 MASTER_CONNECT_RETRY : 'MASTER_CONNECT_RETRY';
446 MASTER_SSL : 'MASTER_SSL';
447 MASTER_SSL_CA : 'MASTER_SSL_CA';
448 MASTER_SSL_CAPATH : 'MASTER_SSL_CAPATH';
449 MASTER_SSL_CERT : 'MASTER_SSL_CERT';
450 MASTER_SSL_CIPHER : 'MASTER_SSL_CIPHER';
451 MASTER_SSL_KEY : 'MASTER_SSL_KEY';
452 MAX_CONNECTIONS_PER_HOUR : 'MAX_CONNECTIONS_PER_HOUR';
453 MAX_QUERIES_PER_HOUR : 'MAX_QUERIES_PER_HOUR';
454 MAX_SIZE : 'MAX_SIZE';
455 MAX_UPDATES_PER_HOUR : 'MAX_UPDATES_PER_HOUR';
456 MAX_USER_CONNECTIONS : 'MAX_USER_CONNECTIONS';
457 MAX_VALUE : 'MAX_VALUE';
461 MICROSECOND : 'MICROSECOND';
463 //MINUTE : 'MINUTE'; // also function
464 MIN_ROWS : 'MIN_ROWS';
467 //MONTH : 'MONTH'; // also function
468 MULTILINESTRING : 'MULTILINESTRING';
469 MULTIPOINT : 'MULTIPOINT';
470 MULTIPOLYGON : 'MULTIPOLYGON';
474 NATIONAL : 'NATIONAL';
476 NDBCLUSTER : 'NDBCLUSTER';
480 NODEGROUP : 'NODEGROUP';
482 NVARCHAR : 'NVARCHAR';
484 OLD_PASSWORD : 'OLD_PASSWORD';
485 ONE_SHOT : 'ONE_SHOT';
487 PACK_KEYS : 'PACK_KEYS';
490 PARTITIONING : 'PARTITIONING';
491 PARTITIONS : 'PARTITIONS';
492 PASSWORD : 'PASSWORD';
498 PRESERVE : 'PRESERVE';
500 PRIVILEGES : 'PRIVILEGES';
502 PROCESSLIST : 'PROCESSLIST';
504 PROFILES : 'PROFILES';
510 REDO_BUFFER_SIZE : 'REDO_BUFFER_SIZE';
511 REDOFILE : 'REDOFILE';
512 REDUNDANT : 'REDUNDANT';
513 RELAY_LOG_FILE : 'RELAY_LOG_FILE';
514 RELAY_LOG_POS : 'RELAY_LOG_POS';
515 RELAY_THREAD : 'RELAY_THREAD';
517 REORGANIZE : 'REORGANIZE';
518 REPEATABLE : 'REPEATABLE';
519 REPLICATION : 'REPLICATION';
520 RESOURCES : 'RESOURCES';
526 ROW_FORMAT : 'ROW_FORMAT';
529 SCHEDULE : 'SCHEDULE';
530 //SECOND : 'SECOND'; // also function
532 SERIALIZABLE : 'SERIALIZABLE';
536 SHUTDOWN : 'SHUTDOWN';
537 SNAPSHOT : 'SNAPSHOT';
538 SOME: 'SOME'; // alias for ANY
541 SQL_CACHE : 'SQL_CACHE';
542 SQL_BUFFER_RESULT : 'SQL_BUFFER_RESULT';
543 SQL_NO_CACHE : 'SQL_NO_CACHE';
544 SQL_THREAD : 'SQL_THREAD';
548 STRING_KEYWORD : 'STRING'; // this is not a string but the keyword STRING used as a return value for UDF
549 //SUBDATE : 'SUBDATE'; // function defined below
551 SUBPARTITION : 'SUBPARTITION';
552 SUBPARTITIONS : 'SUBPARTITIONS';
556 SWITCHES : 'SWITCHES';
558 TABLESPACE : 'TABLESPACE';
559 TEMPORARY : 'TEMPORARY';
560 TEMPTABLE : 'TEMPTABLE';
561 //TEXT : 'TEXT'; // datatype defined below
563 TRANSACTION : 'TRANSACTION';
564 TRANSACTIONAL : 'TRANSACTIONAL';
565 TRIGGERS : 'TRIGGERS';
566 //TIMESTAMP : 'TIMESTAMP'; // datatype defined below
567 //TIMESTAMP_ADD : 'TIMESTAMP_ADD'; // function defined below
568 //TIMESTAMP_DIFF : 'TIMESTAMP_DIFF'; // function defined below
569 //TIME : 'TIME'; // datatype defined below
571 TYPE : ('TYPE' (WS|EOF))=> 'TYPE';
572 UDF_RETURNS : 'UDF_RETURNS';
573 FUNCTION : 'FUNCTION';
574 UNCOMMITTED : 'UNCOMMITTED';
575 UNDEFINED : 'UNDEFINED';
576 UNDO_BUFFER_SIZE : 'UNDO_BUFFER_SIZE';
577 UNDOFILE : 'UNDOFILE';
580 //USER : 'USER'; // also function
582 VARIABLES : 'VARIABLES';
585 WARNINGS : 'WARNINGS';
587 WEEK : 'WEEK'; // also function
590 //YEAR : 'YEAR'; // datatype defined below
592 // $> Keywords in SP labels
594 // $> Keywords allowed as identifiers
606 // $< Builtin SQL Functions
608 /** functions must be directly followed by '(' to be considered a keyword (and thus a function name)
609 * TODO: this is the place to support the SQL mode IGNORE_SPACE
611 //ADDDATE : 'ADDDATE'; // duplicate from the keywords list
612 BIT_AND : 'BIT_AND' {$type = checkFunctionAsID($type);};
613 BIT_OR : 'BIT_OR' {$type = checkFunctionAsID($type);};
614 BIT_XOR : 'BIT_XOR' {$type = checkFunctionAsID($type);};
615 CAST : 'CAST' {$type = checkFunctionAsID($type);};
616 COUNT : 'COUNT' {$type = checkFunctionAsID($type);};
617 //CURDATE : 'CURDATE'; //below
618 //CURTIME : 'CURTIME'; //below
619 DATE_ADD : 'DATE_ADD' {$type = checkFunctionAsID($type);};
620 DATE_SUB : 'DATE_SUB' {$type = checkFunctionAsID($type);};
621 //EXTRACT : 'EXTRACT'; //below
622 GROUP_CONCAT : 'GROUP_CONCAT' {$type = checkFunctionAsID($type);};
623 MAX : 'MAX' {$type = checkFunctionAsID($type);};
624 MID : 'MID' {$type = checkFunctionAsID($type);};
625 MIN : 'MIN' {$type = checkFunctionAsID($type);};
626 //NOW : 'NOW'; //below
627 //POSITION : 'POSITION'; //below
628 SESSION_USER : 'SESSION_USER' {$type = checkFunctionAsID($type);};
629 STD : 'STD' {$type = checkFunctionAsID($type);};
630 STDDEV : 'STDDEV' {$type = checkFunctionAsID($type);};
631 STDDEV_POP : 'STDDEV_POP' {$type = checkFunctionAsID($type);};
632 STDDEV_SAMP : 'STDDEV_SAMP' {$type = checkFunctionAsID($type);};
633 //SUBDATE : 'SUBDATE'; // duplicate from the keywords list
634 SUBSTR : 'SUBSTR' {$type = checkFunctionAsID($type);};
635 //SUBSTRING : 'SUBSTRING'; //below
636 SUM : 'SUM' {$type = checkFunctionAsID($type);};
637 // SYSDATE : 'SYSDATE'; //below
638 SYSTEM_USER : 'SYSTEM_USER' {$type = checkFunctionAsID($type);};
639 //TRIM : 'TRIM'; //below
640 VARIANCE : 'VARIANCE' {$type = checkFunctionAsID($type);};
641 VAR_POP : 'VAR_POP' {$type = checkFunctionAsID($type);};
642 VAR_SAMP : 'VAR_SAMP' {$type = checkFunctionAsID($type);};
645 ADDDATE : 'ADDDATE' {$type = checkFunctionAsID($type);};
646 CURDATE : 'CURDATE' {$type = checkFunctionAsID($type);};
647 CURTIME : 'CURTIME' {$type = checkFunctionAsID($type);};
648 DATE_ADD_INTERVAL : 'DATE_ADD_INTERVAL' {$type = checkFunctionAsID($type);};
649 DATE_SUB_INTERVAL : 'DATE_SUB_INTERVAL' {$type = checkFunctionAsID($type);};
650 EXTRACT : 'EXTRACT' {$type = checkFunctionAsID($type);};
651 GET_FORMAT : 'GET_FORMAT' {$type = checkFunctionAsID($type);};
652 NOW : 'NOW' {$type = checkFunctionAsID($type);};
653 POSITION : 'POSITION' {$type = checkFunctionAsID($type);};
654 SUBDATE : 'SUBDATE' {$type = checkFunctionAsID($type);};
655 SUBSTRING : 'SUBSTRING' {$type = checkFunctionAsID($type);};
656 SYSDATE : 'SYSDATE' {$type = checkFunctionAsID($type);};
657 TIMESTAMP_ADD : 'TIMESTAMP_ADD' {$type = checkFunctionAsID($type);};
658 TIMESTAMP_DIFF : 'TIMESTAMP_DIFF' {$type = checkFunctionAsID($type);};
659 UTC_DATE : 'UTC_DATE' {$type = checkFunctionAsID($type);};
660 UTC_TIMESTAMP : 'UTC_TIMESTAMP' {$type = checkFunctionAsID($type);};
661 UTC_TIME : 'UTC_TIME' {$type = checkFunctionAsID($type);};
663 /* conflict with keywords, or geometry functions */
664 // the following keywords are handled by the ident parser rule where they are allowed as identifiers
665 // and are special cased in function_call
666 //ASCII : 'ASCII' {$type = checkFunctionAsID($type);}; // ascii is special in other places, too.
667 //CHARSET : 'CHARSET' {$type = checkFunctionAsID($type);};
668 //COALESCE : 'COALESCE' {$type = checkFunctionAsID($type);};
669 //COLLATION : 'COLLATION' {$type = checkFunctionAsID($type);};
670 //CONTAINS : 'CONTAINS' {$type = checkFunctionAsID($type);};
671 //DATABASE : 'DATABASE' {$type = checkFunctionAsID($type);};
672 //GEOMETRYCOLLECTION : 'GEOMETRYCOLLECTION' {$type = checkFunctionAsID($type);};
673 // IF is a function and reserved, thus it cannot appear unquoted in any other context
674 //LINESTRING : 'LINESTRING' {$type = checkFunctionAsID($type);};
675 //MICROSECOND : 'MICROSECOND' {$type = checkFunctionAsID($type);};
676 // MOD can both be a function or an operator and is reserved, thus it cannot appear unquoted in any other context
677 //MULTILINESTRING : 'MULTILINESTRING' {$type = checkFunctionAsID($type);};
678 //MULTIPOINT : 'MULTIPOINT' {$type = checkFunctionAsID($type);};
679 //MULTIPOLYGON : 'MULTIPOLYGON' {$type = checkFunctionAsID($type);};
680 //OLD_PASSWORD : 'OLD_PASSWORD' {$type = checkFunctionAsID($type);};
681 //PASSWORD : 'PASSWORD' {$type = checkFunctionAsID($type);};
682 //POINT : 'POINT' {$type = checkFunctionAsID($type);};
683 //POLYGON : 'POLYGON' {$type = checkFunctionAsID($type);};
684 //QUARTER : 'QUARTER' {$type = checkFunctionAsID($type);};
685 //REPEAT : 'REPEAT' {$type = checkFunctionAsID($type);};
686 //REPLACE : 'REPLACE' {$type = checkFunctionAsID($type);};
687 //TRUNCATE : 'TRUNCATE' {$type = checkFunctionAsID($type);};
688 //WEEK : 'WEEK' {$type = checkFunctionAsID($type);};
690 /* keywords that can also be function names */
691 CHAR : 'CHAR'; // reserved
692 CURRENT_USER : 'CURRENT_USER';// reserved
693 DATE : 'DATE' {$type = checkFunctionAsID($type);};
694 DAY : 'DAY'; // {$type = checkFunctionAsID($type);}; // not affected by IGNORE_SPACE since 5.1.13
695 HOUR : 'HOUR' {$type = checkFunctionAsID($type);};
696 INSERT : 'INSERT'; // reserved
697 INTERVAL : 'INTERVAL'; // reserved
698 LEFT : 'LEFT'; // reserved
699 MINUTE : 'MINUTE' {$type = checkFunctionAsID($type);};
700 MONTH : 'MONTH' {$type = checkFunctionAsID($type);};
701 RIGHT : 'RIGHT'; // reserved
702 SECOND : 'SECOND' {$type = checkFunctionAsID($type);};
703 TIME : 'TIME' {$type = checkFunctionAsID($type);};
704 TIMESTAMP : 'TIMESTAMP' {$type = checkFunctionAsID($type);};
705 TRIM : 'TRIM' {$type = checkFunctionAsID($type);};
706 USER : 'USER' {$type = checkFunctionAsID($type);};
707 YEAR : 'YEAR' {$type = checkFunctionAsID($type);};
710 // $> Builtin SQL Functions
715 Operator Precedence Table from the 5.1 docs:
719 - (unary minus), ~ (unary bit inversion)
726 =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
727 BETWEEN, CASE, WHEN, THEN, ELSE
742 BITWISE_INVERSION : '~';
749 LESS_THAN_EQUAL : '<=';
750 NULL_SAFE_NOT_EQUAL : '<=>';
753 NOT_EQUAL : '<>' | '!=';
756 GREATER_THAN_EQUAL : '>=';
763 //CHAR : 'CHAR'; // also function
764 //DATE : 'DATE'; // also function
765 DATETIME : 'DATETIME';
772 LONGBLOB : 'LONGBLOB';
773 LONGTEXT : 'LONGTEXT';
774 MEDIUMBLOB : 'MEDIUMBLOB';
775 MEDIUMINT : 'MEDIUMINT';
776 MEDIUMTEXT : 'MEDIUMTEXT';
779 SMALLINT : 'SMALLINT';
781 //TIME : 'TIME'; // also function
782 //TIMESTAMP : 'TIMESTAMP'; // also function
783 TINYBLOB : 'TINYBLOB';
785 TINYTEXT : 'TINYTEXT';
786 VARBINARY : 'VARBINARY';
788 //YEAR : 'YEAR'; // also function
796 * Values like b'1011' or B'1011'.
797 * Even though binary values look like strings, they are of a special data type. The initial 'b' can both upper and lower case.
798 * The quote character must be the single quote ('\''), whitespace is not allowed between 'b'|'B' and the quoted binary value.
801 : ('B' '\'')=> 'B\'' ('0'|'1')* '\''
805 : ('X' '\'')=> 'X\'' (DIGIT|'A'|'B'|'C'|'D'|'E'|'F')* '\''
809 * Character sets and collations are handled in the parser, as both allow whitespace between the string and the modifiers.
810 * The n and N 'national character set' (UTF8 for MySQL 4.1 and up) modifiers do _not_ allow whitespace and thus must be handled here.
812 * Quoting quotes: By doubling the quote character used to start the string, you can quote that character itself:
813 * Input such as "He said:""Foo!""" results in the single token STRING with the text: < He said:"Foo!" >
814 * Alternatively the quote character can be escaped using the standard escape character ('\').
816 * Binary and hexadecimal are syntactically equivalent to strings but have a different meaning and should not be tokenized as STRING. See below.
820 : 'N'? // "introducer" for the national character set (UTF8 for MySQL 4.1 and up). must immediately precede the first quote character.
823 // | (ESCAPE_SEQUENCE)=> ESCAPE_SEQUENCE
826 '"' // TODO: collapse two consecutive internal double quotes into one
829 // | (ESCAPE_SEQUENCE)=> ESCAPE_SEQUENCE
832 '\'' // TODO: same as above with single quotes
838 * UNDERSCORE_ID is a bad hack because for character sets we need an identifier which starts with '_'.
839 * The bad thing is, if the actual identifier is not a valid character set name it does not start a string, even though it looks it does.
840 * In that case, if it is a select_expr, it is specifying an alias for a column. Note that this ambiguity only arises with unquoted identifiers,
841 * as character set modifiers for strings can never be quoted.
844 : {input.LA(1) == '_'}? => REAL_ID
847 /* user@host, ID and SESSION_VARIABLES are ambiguous */
848 USER_HOST_or_ID_or_STRING
850 ( USER_HOST {$type=USER_HOST;} )?
851 | STRING {$type=STRING;} (USER_HOST {$type=USER_HOST;})?
860 ID : '`' (options{greedy=false;}: (~('`'))+) '`'
866 : ('A'..'Z'|'_') ('0'..'9'|'A'..'Z'|'_')* // TODO: what are the valid characters?
871 // TODO: these are case sensitive -> specifying them as lowercase in the grammar causes them to never be matched (because ANTLR doesn't know
872 // we are only serving uppercase letters. Add trueCaseLA predicates here (but beware of hoisting)
873 // TODO: this rule is broken; it is to parse Java source files not compiled strings.
874 // The entire rule should be removed...
882 // | 'n' // TODO currently this clashes with \N == NULL. add predicate!
885 // | 'Z' // this is UPPERCASE! -> use ANTLRNoCaseStringStream.trueCaseLA() in predicate to resolve
889 // | character=. // TODO: collapse into just $char; this might be an error
900 * alternatives are delineated because otherwise NUMBER would be an epsilon transition, matching endlessly on a syntax error
901 * unary minus|plus must be handled in the parser
906 | DOT DIGIT+ // .02343
907 | DIGIT+ DOT DIGIT* // 13212. or 12334.234234
913 // DASHDASH_COMMENTS are special in the sense that they require the '--' to be followed by whitespace. If there's no whitespace '--' should be lexed as MINUS MINUS
917 | {input.LA(3)==' ' || input.LA(3) == '\t' || input.LA(3) == '\n' || input.LA(3) == '\r'}?=> DASHDASH_COMMENT
924 : '/*' ( options {greedy=false;} : . )* '*/'
929 : '#' ~('\n'|'\r')* '\r'? '\n'
934 : '--' (' ' | '\t' | '\n' | '\r') ~('\n'|'\r')* '\r'? '\n'
940 /* todo: user variables can be quoted, thus ID is wrong here */
945 WS : (' ' | '\t' | '\n' | '\r')+ { $channel=HIDDEN; }
949 * for normalized queries all values should have been replaced with a '?' character.
950 * Tokenize that as special.