diff --git a/debezium-connector-mysql/pom.xml b/debezium-connector-mysql/pom.xml
index 327e307fc..b4f306e71 100644
--- a/debezium-connector-mysql/pom.xml
+++ b/debezium-connector-mysql/pom.xml
@@ -39,6 +39,11 @@
mysql
mysql-connector-java
+
+ org.antlr
+ antlr4-runtime
+ ${antlr.version}
+
@@ -104,6 +109,10 @@
debezium/mysql-server-test-database
false
ln -s /usr/share/zoneinfo/US/Samoa /etc/localtime
+
+
+ 4.7
+ ${project.basedir}/src/main/resources/antlr4
@@ -333,6 +342,21 @@
+
+ org.antlr
+ antlr4-maven-plugin
+ ${antlr.version}
+
+ ${antlr.source.dir}
+
+
+
+
+ antlr4
+
+
+
+
diff --git a/debezium-connector-mysql/src/main/resources/antlr4/io/debezium/connector/mysql/antlr/generated/MySqlLexer.g4 b/debezium-connector-mysql/src/main/resources/antlr4/io/debezium/connector/mysql/antlr/generated/MySqlLexer.g4
new file mode 100644
index 000000000..3ce6338c3
--- /dev/null
+++ b/debezium-connector-mysql/src/main/resources/antlr4/io/debezium/connector/mysql/antlr/generated/MySqlLexer.g4
@@ -0,0 +1,1168 @@
+/*
+MySQL (Positive Technologies) grammar
+The MIT License (MIT).
+Copyright (c) 2015-2017, Ivan Kochurkin (kvanttt@gmail.com), Positive Technologies.
+Copyright (c) 2017, Ivan Khudyashev (IHudyashov@ptsecurity.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+lexer grammar MySqlLexer;
+
+channels { MYSQLCOMMENT, ERRORCHANNEL }
+
+// SKIP
+
+SPACE: [ \t\r\n]+ -> channel(HIDDEN);
+SPEC_MYSQL_COMMENT: '/*!' .+? '*/' -> channel(MYSQLCOMMENT);
+COMMENT_INPUT: '/*' .*? '*/' -> channel(HIDDEN);
+LINE_COMMENT: (
+ ('-- ' | '#') ~[\r\n]* ('\r'? '\n' | EOF)
+ | '--' ('\r'? '\n' | EOF)
+ ) -> channel(HIDDEN);
+
+
+// Keywords
+// Common Keywords
+
+ADD: 'ADD';
+ALL: 'ALL';
+ALTER: 'ALTER';
+ANALYZE: 'ANALYZE';
+AND: 'AND';
+AS: 'AS';
+ASC: 'ASC';
+BEFORE: 'BEFORE';
+BETWEEN: 'BETWEEN';
+BOTH: 'BOTH';
+BY: 'BY';
+CALL: 'CALL';
+CASCADE: 'CASCADE';
+CASE: 'CASE';
+CAST: 'CAST';
+CHANGE: 'CHANGE';
+CHARACTER: 'CHARACTER';
+CHECK: 'CHECK';
+COLLATE: 'COLLATE';
+COLUMN: 'COLUMN';
+CONDITION: 'CONDITION';
+CONSTRAINT: 'CONSTRAINT';
+CONTINUE: 'CONTINUE';
+CONVERT: 'CONVERT';
+CREATE: 'CREATE';
+CROSS: 'CROSS';
+CURRENT_USER: 'CURRENT_USER';
+CURSOR: 'CURSOR';
+DATABASE: 'DATABASE';
+DATABASES: 'DATABASES';
+DECLARE: 'DECLARE';
+DEFAULT: 'DEFAULT';
+DELAYED: 'DELAYED';
+DELETE: 'DELETE';
+DESC: 'DESC';
+DESCRIBE: 'DESCRIBE';
+DETERMINISTIC: 'DETERMINISTIC';
+DISTINCT: 'DISTINCT';
+DISTINCTROW: 'DISTINCTROW';
+DROP: 'DROP';
+EACH: 'EACH';
+ELSE: 'ELSE';
+ELSEIF: 'ELSEIF';
+ENCLOSED: 'ENCLOSED';
+ESCAPED: 'ESCAPED';
+EXISTS: 'EXISTS';
+EXIT: 'EXIT';
+EXPLAIN: 'EXPLAIN';
+FALSE: 'FALSE';
+FETCH: 'FETCH';
+FOR: 'FOR';
+FORCE: 'FORCE';
+FOREIGN: 'FOREIGN';
+FROM: 'FROM';
+FULLTEXT: 'FULLTEXT';
+GRANT: 'GRANT';
+GROUP: 'GROUP';
+HAVING: 'HAVING';
+HIGH_PRIORITY: 'HIGH_PRIORITY';
+IF: 'IF';
+IGNORE: 'IGNORE';
+IN: 'IN';
+INDEX: 'INDEX';
+INFILE: 'INFILE';
+INNER: 'INNER';
+INOUT: 'INOUT';
+INSERT: 'INSERT';
+INTERVAL: 'INTERVAL';
+INTO: 'INTO';
+IS: 'IS';
+ITERATE: 'ITERATE';
+JOIN: 'JOIN';
+KEY: 'KEY';
+KEYS: 'KEYS';
+KILL: 'KILL';
+LEADING: 'LEADING';
+LEAVE: 'LEAVE';
+LEFT: 'LEFT';
+LIKE: 'LIKE';
+LIMIT: 'LIMIT';
+LINEAR: 'LINEAR';
+LINES: 'LINES';
+LOAD: 'LOAD';
+LOCK: 'LOCK';
+LOOP: 'LOOP';
+LOW_PRIORITY: 'LOW_PRIORITY';
+MASTER_BIND: 'MASTER_BIND';
+MASTER_SSL_VERIFY_SERVER_CERT: 'MASTER_SSL_VERIFY_SERVER_CERT';
+MATCH: 'MATCH';
+MAXVALUE: 'MAXVALUE';
+MODIFIES: 'MODIFIES';
+NATURAL: 'NATURAL';
+NOT: 'NOT';
+NO_WRITE_TO_BINLOG: 'NO_WRITE_TO_BINLOG';
+NULL_LITERAL: 'NULL';
+ON: 'ON';
+OPTIMIZE: 'OPTIMIZE';
+OPTION: 'OPTION';
+OPTIONALLY: 'OPTIONALLY';
+OR: 'OR';
+ORDER: 'ORDER';
+OUT: 'OUT';
+OUTER: 'OUTER';
+OUTFILE: 'OUTFILE';
+PARTITION: 'PARTITION';
+PRIMARY: 'PRIMARY';
+PROCEDURE: 'PROCEDURE';
+PURGE: 'PURGE';
+RANGE: 'RANGE';
+READ: 'READ';
+READS: 'READS';
+REFERENCES: 'REFERENCES';
+REGEXP: 'REGEXP';
+RELEASE: 'RELEASE';
+RENAME: 'RENAME';
+REPEAT: 'REPEAT';
+REPLACE: 'REPLACE';
+REQUIRE: 'REQUIRE';
+RESTRICT: 'RESTRICT';
+RETURN: 'RETURN';
+REVOKE: 'REVOKE';
+RIGHT: 'RIGHT';
+RLIKE: 'RLIKE';
+SCHEMA: 'SCHEMA';
+SCHEMAS: 'SCHEMAS';
+SELECT: 'SELECT';
+SET: 'SET';
+SEPARATOR: 'SEPARATOR';
+SHOW: 'SHOW';
+SPATIAL: 'SPATIAL';
+SQL: 'SQL';
+SQLEXCEPTION: 'SQLEXCEPTION';
+SQLSTATE: 'SQLSTATE';
+SQLWARNING: 'SQLWARNING';
+SQL_BIG_RESULT: 'SQL_BIG_RESULT';
+SQL_CALC_FOUND_ROWS: 'SQL_CALC_FOUND_ROWS';
+SQL_SMALL_RESULT: 'SQL_SMALL_RESULT';
+SSL: 'SSL';
+STARTING: 'STARTING';
+STRAIGHT_JOIN: 'STRAIGHT_JOIN';
+TABLE: 'TABLE';
+TERMINATED: 'TERMINATED';
+THEN: 'THEN';
+TO: 'TO';
+TRAILING: 'TRAILING';
+TRIGGER: 'TRIGGER';
+TRUE: 'TRUE';
+UNDO: 'UNDO';
+UNION: 'UNION';
+UNIQUE: 'UNIQUE';
+UNLOCK: 'UNLOCK';
+UNSIGNED: 'UNSIGNED';
+UPDATE: 'UPDATE';
+USAGE: 'USAGE';
+USE: 'USE';
+USING: 'USING';
+VALUES: 'VALUES';
+WHEN: 'WHEN';
+WHERE: 'WHERE';
+WHILE: 'WHILE';
+WITH: 'WITH';
+WRITE: 'WRITE';
+XOR: 'XOR';
+ZEROFILL: 'ZEROFILL';
+
+
+// DATA TYPE Keywords
+
+TINYINT: 'TINYINT';
+SMALLINT: 'SMALLINT';
+MEDIUMINT: 'MEDIUMINT';
+INT: 'INT';
+INTEGER: 'INTEGER';
+BIGINT: 'BIGINT';
+REAL: 'REAL';
+DOUBLE: 'DOUBLE';
+FLOAT: 'FLOAT';
+DECIMAL: 'DECIMAL';
+NUMERIC: 'NUMERIC';
+DATE: 'DATE';
+TIME: 'TIME';
+TIMESTAMP: 'TIMESTAMP';
+DATETIME: 'DATETIME';
+YEAR: 'YEAR';
+CHAR: 'CHAR';
+VARCHAR: 'VARCHAR';
+BINARY: 'BINARY';
+VARBINARY: 'VARBINARY';
+TINYBLOB: 'TINYBLOB';
+BLOB: 'BLOB';
+MEDIUMBLOB: 'MEDIUMBLOB';
+LONGBLOB: 'LONGBLOB';
+TINYTEXT: 'TINYTEXT';
+TEXT: 'TEXT';
+MEDIUMTEXT: 'MEDIUMTEXT';
+LONGTEXT: 'LONGTEXT';
+ENUM: 'ENUM';
+
+
+// Interval type Keywords
+
+YEAR_MONTH: 'YEAR_MONTH';
+DAY_HOUR: 'DAY_HOUR';
+DAY_MINUTE: 'DAY_MINUTE';
+DAY_SECOND: 'DAY_SECOND';
+HOUR_MINUTE: 'HOUR_MINUTE';
+HOUR_SECOND: 'HOUR_SECOND';
+MINUTE_SECOND: 'MINUTE_SECOND';
+SECOND_MICROSECOND: 'SECOND_MICROSECOND';
+MINUTE_MICROSECOND: 'MINUTE_MICROSECOND';
+HOUR_MICROSECOND: 'HOUR_MICROSECOND';
+DAY_MICROSECOND: 'DAY_MICROSECOND';
+
+
+// Group function Keywords
+
+AVG: 'AVG';
+BIT_AND: 'BIT_AND';
+BIT_OR: 'BIT_OR';
+BIT_XOR: 'BIT_XOR';
+COUNT: 'COUNT';
+GROUP_CONCAT: 'GROUP_CONCAT';
+MAX: 'MAX';
+MIN: 'MIN';
+STD: 'STD';
+STDDEV: 'STDDEV';
+STDDEV_POP: 'STDDEV_POP';
+STDDEV_SAMP: 'STDDEV_SAMP';
+SUM: 'SUM';
+VAR_POP: 'VAR_POP';
+VAR_SAMP: 'VAR_SAMP';
+VARIANCE: 'VARIANCE';
+
+
+// Common function Keywords
+
+CURRENT_DATE: 'CURRENT_DATE';
+CURRENT_TIME: 'CURRENT_TIME';
+CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP';
+LOCALTIME: 'LOCALTIME';
+CURDATE: 'CURDATE';
+CURTIME: 'CURTIME';
+DATE_ADD: 'DATE_ADD';
+DATE_SUB: 'DATE_SUB';
+EXTRACT: 'EXTRACT';
+LOCALTIMESTAMP: 'LOCALTIMESTAMP';
+NOW: 'NOW';
+POSITION: 'POSITION';
+SUBSTR: 'SUBSTR';
+SUBSTRING: 'SUBSTRING';
+SYSDATE: 'SYSDATE';
+TRIM: 'TRIM';
+UTC_DATE: 'UTC_DATE';
+UTC_TIME: 'UTC_TIME';
+UTC_TIMESTAMP: 'UTC_TIMESTAMP';
+
+
+
+// Keywords, but can be ID
+// Common Keywords, but can be ID
+
+ACCOUNT: 'ACCOUNT';
+ACTION: 'ACTION';
+AFTER: 'AFTER';
+AGGREGATE: 'AGGREGATE';
+ALGORITHM: 'ALGORITHM';
+ANY: 'ANY';
+AT: 'AT';
+AUTHORS: 'AUTHORS';
+AUTOCOMMIT: 'AUTOCOMMIT';
+AUTOEXTEND_SIZE: 'AUTOEXTEND_SIZE';
+AUTO_INCREMENT: 'AUTO_INCREMENT';
+AVG_ROW_LENGTH: 'AVG_ROW_LENGTH';
+BEGIN: 'BEGIN';
+BINLOG: 'BINLOG';
+BIT: 'BIT';
+BLOCK: 'BLOCK';
+BOOL: 'BOOL';
+BOOLEAN: 'BOOLEAN';
+BTREE: 'BTREE';
+CACHE: 'CACHE';
+CASCADED: 'CASCADED';
+CHAIN: 'CHAIN';
+CHANGED: 'CHANGED';
+CHANNEL: 'CHANNEL';
+CHECKSUM: 'CHECKSUM';
+CIPHER: 'CIPHER';
+CLIENT: 'CLIENT';
+CLOSE: 'CLOSE';
+COALESCE: 'COALESCE';
+CODE: 'CODE';
+COLUMNS: 'COLUMNS';
+COLUMN_FORMAT: 'COLUMN_FORMAT';
+COMMENT: 'COMMENT';
+COMMIT: 'COMMIT';
+COMPACT: 'COMPACT';
+COMPLETION: 'COMPLETION';
+COMPRESSED: 'COMPRESSED';
+COMPRESSION: 'COMPRESSION';
+CONCURRENT: 'CONCURRENT';
+CONNECTION: 'CONNECTION';
+CONSISTENT: 'CONSISTENT';
+CONTAINS: 'CONTAINS';
+CONTEXT: 'CONTEXT';
+CONTRIBUTORS: 'CONTRIBUTORS';
+COPY: 'COPY';
+CPU: 'CPU';
+DATA: 'DATA';
+DATAFILE: 'DATAFILE';
+DEALLOCATE: 'DEALLOCATE';
+DEFAULT_AUTH: 'DEFAULT_AUTH';
+DEFINER: 'DEFINER';
+DELAY_KEY_WRITE: 'DELAY_KEY_WRITE';
+DES_KEY_FILE: 'DES_KEY_FILE';
+DIRECTORY: 'DIRECTORY';
+DISABLE: 'DISABLE';
+DISCARD: 'DISCARD';
+DISK: 'DISK';
+DO: 'DO';
+DUMPFILE: 'DUMPFILE';
+DUPLICATE: 'DUPLICATE';
+DYNAMIC: 'DYNAMIC';
+ENABLE: 'ENABLE';
+ENCRYPTION: 'ENCRYPTION';
+END: 'END';
+ENDS: 'ENDS';
+ENGINE: 'ENGINE';
+ENGINES: 'ENGINES';
+ERROR: 'ERROR';
+ERRORS: 'ERRORS';
+ESCAPE: 'ESCAPE';
+EVEN: 'EVEN';
+EVENT: 'EVENT';
+EVENTS: 'EVENTS';
+EVERY: 'EVERY';
+EXCHANGE: 'EXCHANGE';
+EXCLUSIVE: 'EXCLUSIVE';
+EXPIRE: 'EXPIRE';
+EXPORT: 'EXPORT';
+EXTENDED: 'EXTENDED';
+EXTENT_SIZE: 'EXTENT_SIZE';
+FAST: 'FAST';
+FAULTS: 'FAULTS';
+FIELDS: 'FIELDS';
+FILE_BLOCK_SIZE: 'FILE_BLOCK_SIZE';
+FILTER: 'FILTER';
+FIRST: 'FIRST';
+FIXED: 'FIXED';
+FLUSH: 'FLUSH';
+FOLLOWS: 'FOLLOWS';
+FOUND: 'FOUND';
+FULL: 'FULL';
+FUNCTION: 'FUNCTION';
+GENERAL: 'GENERAL';
+GLOBAL: 'GLOBAL';
+GRANTS: 'GRANTS';
+GROUP_REPLICATION: 'GROUP_REPLICATION';
+HANDLER: 'HANDLER';
+HASH: 'HASH';
+HELP: 'HELP';
+HOST: 'HOST';
+HOSTS: 'HOSTS';
+IDENTIFIED: 'IDENTIFIED';
+IGNORE_SERVER_IDS: 'IGNORE_SERVER_IDS';
+IMPORT: 'IMPORT';
+INDEXES: 'INDEXES';
+INITIAL_SIZE: 'INITIAL_SIZE';
+INPLACE: 'INPLACE';
+INSERT_METHOD: 'INSERT_METHOD';
+INSTALL: 'INSTALL';
+INSTANCE: 'INSTANCE';
+INVOKER: 'INVOKER';
+IO: 'IO';
+IO_THREAD: 'IO_THREAD';
+IPC: 'IPC';
+ISOLATION: 'ISOLATION';
+ISSUER: 'ISSUER';
+JSON: 'JSON';
+KEY_BLOCK_SIZE: 'KEY_BLOCK_SIZE';
+LANGUAGE: 'LANGUAGE';
+LAST: 'LAST';
+LEAVES: 'LEAVES';
+LESS: 'LESS';
+LEVEL: 'LEVEL';
+LIST: 'LIST';
+LOCAL: 'LOCAL';
+LOGFILE: 'LOGFILE';
+LOGS: 'LOGS';
+MASTER: 'MASTER';
+MASTER_AUTO_POSITION: 'MASTER_AUTO_POSITION';
+MASTER_CONNECT_RETRY: 'MASTER_CONNECT_RETRY';
+MASTER_DELAY: 'MASTER_DELAY';
+MASTER_HEARTBEAT_PERIOD: 'MASTER_HEARTBEAT_PERIOD';
+MASTER_HOST: 'MASTER_HOST';
+MASTER_LOG_FILE: 'MASTER_LOG_FILE';
+MASTER_LOG_POS: 'MASTER_LOG_POS';
+MASTER_PASSWORD: 'MASTER_PASSWORD';
+MASTER_PORT: 'MASTER_PORT';
+MASTER_RETRY_COUNT: 'MASTER_RETRY_COUNT';
+MASTER_SSL: 'MASTER_SSL';
+MASTER_SSL_CA: 'MASTER_SSL_CA';
+MASTER_SSL_CAPATH: 'MASTER_SSL_CAPATH';
+MASTER_SSL_CERT: 'MASTER_SSL_CERT';
+MASTER_SSL_CIPHER: 'MASTER_SSL_CIPHER';
+MASTER_SSL_CRL: 'MASTER_SSL_CRL';
+MASTER_SSL_CRLPATH: 'MASTER_SSL_CRLPATH';
+MASTER_SSL_KEY: 'MASTER_SSL_KEY';
+MASTER_TLS_VERSION: 'MASTER_TLS_VERSION';
+MASTER_USER: 'MASTER_USER';
+MAX_CONNECTIONS_PER_HOUR: 'MAX_CONNECTIONS_PER_HOUR';
+MAX_QUERIES_PER_HOUR: 'MAX_QUERIES_PER_HOUR';
+MAX_ROWS: 'MAX_ROWS';
+MAX_SIZE: 'MAX_SIZE';
+MAX_UPDATES_PER_HOUR: 'MAX_UPDATES_PER_HOUR';
+MAX_USER_CONNECTIONS: 'MAX_USER_CONNECTIONS';
+MEDIUM: 'MEDIUM';
+MERGE: 'MERGE';
+MID: 'MID';
+MIGRATE: 'MIGRATE';
+MIN_ROWS: 'MIN_ROWS';
+MODE: 'MODE';
+MODIFY: 'MODIFY';
+MUTEX: 'MUTEX';
+MYSQL: 'MYSQL';
+NAME: 'NAME';
+NAMES: 'NAMES';
+NCHAR: 'NCHAR';
+NEVER: 'NEVER';
+NEXT: 'NEXT';
+NO: 'NO';
+NODEGROUP: 'NODEGROUP';
+NONE: 'NONE';
+OFFLINE: 'OFFLINE';
+OFFSET: 'OFFSET';
+OJ: 'OJ';
+OLD_PASSWORD: 'OLD_PASSWORD';
+ONE: 'ONE';
+ONLINE: 'ONLINE';
+ONLY: 'ONLY';
+OPEN: 'OPEN';
+OPTIMIZER_COSTS: 'OPTIMIZER_COSTS';
+OPTIONS: 'OPTIONS';
+OWNER: 'OWNER';
+PACK_KEYS: 'PACK_KEYS';
+PAGE: 'PAGE';
+PARSER: 'PARSER';
+PARTIAL: 'PARTIAL';
+PARTITIONING: 'PARTITIONING';
+PARTITIONS: 'PARTITIONS';
+PASSWORD: 'PASSWORD';
+PHASE: 'PHASE';
+PLUGIN: 'PLUGIN';
+PLUGIN_DIR: 'PLUGIN_DIR';
+PLUGINS: 'PLUGINS';
+PORT: 'PORT';
+PRECEDES: 'PRECEDES';
+PREPARE: 'PREPARE';
+PRESERVE: 'PRESERVE';
+PREV: 'PREV';
+PROCESSLIST: 'PROCESSLIST';
+PROFILE: 'PROFILE';
+PROFILES: 'PROFILES';
+PROXY: 'PROXY';
+QUERY: 'QUERY';
+QUICK: 'QUICK';
+REBUILD: 'REBUILD';
+RECOVER: 'RECOVER';
+REDO_BUFFER_SIZE: 'REDO_BUFFER_SIZE';
+REDUNDANT: 'REDUNDANT';
+RELAY: 'RELAY';
+RELAY_LOG_FILE: 'RELAY_LOG_FILE';
+RELAY_LOG_POS: 'RELAY_LOG_POS';
+RELAYLOG: 'RELAYLOG';
+REMOVE: 'REMOVE';
+REORGANIZE: 'REORGANIZE';
+REPAIR: 'REPAIR';
+REPLICATE_DO_DB: 'REPLICATE_DO_DB';
+REPLICATE_DO_TABLE: 'REPLICATE_DO_TABLE';
+REPLICATE_IGNORE_DB: 'REPLICATE_IGNORE_DB';
+REPLICATE_IGNORE_TABLE: 'REPLICATE_IGNORE_TABLE';
+REPLICATE_REWRITE_DB: 'REPLICATE_REWRITE_DB';
+REPLICATE_WILD_DO_TABLE: 'REPLICATE_WILD_DO_TABLE';
+REPLICATE_WILD_IGNORE_TABLE: 'REPLICATE_WILD_IGNORE_TABLE';
+REPLICATION: 'REPLICATION';
+RESET: 'RESET';
+RESUME: 'RESUME';
+RETURNS: 'RETURNS';
+ROLLBACK: 'ROLLBACK';
+ROLLUP: 'ROLLUP';
+ROTATE: 'ROTATE';
+ROW: 'ROW';
+ROWS: 'ROWS';
+ROW_FORMAT: 'ROW_FORMAT';
+SAVEPOINT: 'SAVEPOINT';
+SCHEDULE: 'SCHEDULE';
+SECURITY: 'SECURITY';
+SERVER: 'SERVER';
+SESSION: 'SESSION';
+SHARE: 'SHARE';
+SHARED: 'SHARED';
+SIGNED: 'SIGNED';
+SIMPLE: 'SIMPLE';
+SLAVE: 'SLAVE';
+SLOW: 'SLOW';
+SNAPSHOT: 'SNAPSHOT';
+SOCKET: 'SOCKET';
+SOME: 'SOME';
+SONAME: 'SONAME';
+SOUNDS: 'SOUNDS';
+SOURCE: 'SOURCE';
+SQL_AFTER_GTIDS: 'SQL_AFTER_GTIDS';
+SQL_AFTER_MTS_GAPS: 'SQL_AFTER_MTS_GAPS';
+SQL_BEFORE_GTIDS: 'SQL_BEFORE_GTIDS';
+SQL_BUFFER_RESULT: 'SQL_BUFFER_RESULT';
+SQL_CACHE: 'SQL_CACHE';
+SQL_NO_CACHE: 'SQL_NO_CACHE';
+SQL_THREAD: 'SQL_THREAD';
+START: 'START';
+STARTS: 'STARTS';
+STATS_AUTO_RECALC: 'STATS_AUTO_RECALC';
+STATS_PERSISTENT: 'STATS_PERSISTENT';
+STATS_SAMPLE_PAGES: 'STATS_SAMPLE_PAGES';
+STATUS: 'STATUS';
+STOP: 'STOP';
+STORAGE: 'STORAGE';
+STRING: 'STRING';
+SUBJECT: 'SUBJECT';
+SUBPARTITION: 'SUBPARTITION';
+SUBPARTITIONS: 'SUBPARTITIONS';
+SUSPEND: 'SUSPEND';
+SWAPS: 'SWAPS';
+SWITCHES: 'SWITCHES';
+TABLESPACE: 'TABLESPACE';
+TEMPORARY: 'TEMPORARY';
+TEMPTABLE: 'TEMPTABLE';
+THAN: 'THAN';
+TRADITIONAL: 'TRADITIONAL';
+TRANSACTION: 'TRANSACTION';
+TRIGGERS: 'TRIGGERS';
+TRUNCATE: 'TRUNCATE';
+UNDEFINED: 'UNDEFINED';
+UNDOFILE: 'UNDOFILE';
+UNDO_BUFFER_SIZE: 'UNDO_BUFFER_SIZE';
+UNINSTALL: 'UNINSTALL';
+UNKNOWN: 'UNKNOWN';
+UNTIL: 'UNTIL';
+UPGRADE: 'UPGRADE';
+USER: 'USER';
+USE_FRM: 'USE_FRM';
+USER_RESOURCES: 'USER_RESOURCES';
+VALIDATION: 'VALIDATION';
+VALUE: 'VALUE';
+VARIABLES: 'VARIABLES';
+VIEW: 'VIEW';
+WAIT: 'WAIT';
+WARNINGS: 'WARNINGS';
+WITHOUT: 'WITHOUT';
+WORK: 'WORK';
+WRAPPER: 'WRAPPER';
+X509: 'X509';
+XA: 'XA';
+XML: 'XML';
+
+
+// Date format Keywords
+
+EUR: 'EUR';
+USA: 'USA';
+JIS: 'JIS';
+ISO: 'ISO';
+INTERNAL: 'INTERNAL';
+
+
+// Interval type Keywords
+
+QUARTER: 'QUARTER';
+MONTH: 'MONTH';
+DAY: 'DAY';
+HOUR: 'HOUR';
+MINUTE: 'MINUTE';
+WEEK: 'WEEK';
+SECOND: 'SECOND';
+MICROSECOND: 'MICROSECOND';
+
+
+// PRIVILEGES
+
+TABLES: 'TABLES';
+ROUTINE: 'ROUTINE';
+EXECUTE: 'EXECUTE';
+FILE: 'FILE';
+PROCESS: 'PROCESS';
+RELOAD: 'RELOAD';
+SHUTDOWN: 'SHUTDOWN';
+SUPER: 'SUPER';
+PRIVILEGES: 'PRIVILEGES';
+
+
+// Charsets
+
+ARMSCII8: 'ARMSCII8';
+ASCII: 'ASCII';
+BIG5: 'BIG5';
+CP1250: 'CP1250';
+CP1251: 'CP1251';
+CP1256: 'CP1256';
+CP1257: 'CP1257';
+CP850: 'CP850';
+CP852: 'CP852';
+CP866: 'CP866';
+CP932: 'CP932';
+DEC8: 'DEC8';
+EUCJPMS: 'EUCJPMS';
+EUCKR: 'EUCKR';
+GB2312: 'GB2312';
+GBK: 'GBK';
+GEOSTD8: 'GEOSTD8';
+GREEK: 'GREEK';
+HEBREW: 'HEBREW';
+HP8: 'HP8';
+KEYBCS2: 'KEYBCS2';
+KOI8R: 'KOI8R';
+KOI8U: 'KOI8U';
+LATIN1: 'LATIN1';
+LATIN2: 'LATIN2';
+LATIN5: 'LATIN5';
+LATIN7: 'LATIN7';
+MACCE: 'MACCE';
+MACROMAN: 'MACROMAN';
+SJIS: 'SJIS';
+SWE7: 'SWE7';
+TIS620: 'TIS620';
+UCS2: 'UCS2';
+UJIS: 'UJIS';
+UTF16: 'UTF16';
+UTF16LE: 'UTF16LE';
+UTF32: 'UTF32';
+UTF8: 'UTF8';
+UTF8MB3: 'UTF8MB3';
+UTF8MB4: 'UTF8MB4';
+
+
+// DB Engines
+
+ARCHIVE: 'ARCHIVE';
+BLACKHOLE: 'BLACKHOLE';
+CSV: 'CSV';
+FEDERATED: 'FEDERATED';
+INNODB: 'INNODB';
+MEMORY: 'MEMORY';
+MRG_MYISAM: 'MRG_MYISAM';
+MYISAM: 'MYISAM';
+NDB: 'NDB';
+NDBCLUSTER: 'NDBCLUSTER';
+PERFOMANCE_SCHEMA: 'PERFOMANCE_SCHEMA';
+
+
+// Transaction Levels
+
+REPEATABLE: 'REPEATABLE';
+COMMITTED: 'COMMITTED';
+UNCOMMITTED: 'UNCOMMITTED';
+SERIALIZABLE: 'SERIALIZABLE';
+
+
+// Spatial data types
+
+GEOMETRYCOLLECTION: 'GEOMETRYCOLLECTION';
+LINESTRING: 'LINESTRING';
+MULTILINESTRING: 'MULTILINESTRING';
+MULTIPOINT: 'MULTIPOINT';
+MULTIPOLYGON: 'MULTIPOLYGON';
+POINT: 'POINT';
+POLYGON: 'POLYGON';
+
+
+// Common function names
+
+ABS: 'ABS';
+ACOS: 'ACOS';
+ADDDATE: 'ADDDATE';
+ADDTIME: 'ADDTIME';
+AES_DECRYPT: 'AES_DECRYPT';
+AES_ENCRYPT: 'AES_ENCRYPT';
+AREA: 'AREA';
+ASBINARY: 'ASBINARY';
+ASIN: 'ASIN';
+ASTEXT: 'ASTEXT';
+ASWKB: 'ASWKB';
+ASWKT: 'ASWKT';
+ASYMMETRIC_DECRYPT: 'ASYMMETRIC_DECRYPT';
+ASYMMETRIC_DERIVE: 'ASYMMETRIC_DERIVE';
+ASYMMETRIC_ENCRYPT: 'ASYMMETRIC_ENCRYPT';
+ASYMMETRIC_SIGN: 'ASYMMETRIC_SIGN';
+ASYMMETRIC_VERIFY: 'ASYMMETRIC_VERIFY';
+ATAN: 'ATAN';
+ATAN2: 'ATAN2';
+BENCHMARK: 'BENCHMARK';
+BIN: 'BIN';
+BIT_COUNT: 'BIT_COUNT';
+BIT_LENGTH: 'BIT_LENGTH';
+BUFFER: 'BUFFER';
+CEIL: 'CEIL';
+CEILING: 'CEILING';
+CENTROID: 'CENTROID';
+CHARACTER_LENGTH: 'CHARACTER_LENGTH';
+CHARSET: 'CHARSET';
+CHAR_LENGTH: 'CHAR_LENGTH';
+COERCIBILITY: 'COERCIBILITY';
+COLLATION: 'COLLATION';
+COMPRESS: 'COMPRESS';
+CONCAT: 'CONCAT';
+CONCAT_WS: 'CONCAT_WS';
+CONNECTION_ID: 'CONNECTION_ID';
+CONV: 'CONV';
+CONVERT_TZ: 'CONVERT_TZ';
+COS: 'COS';
+COT: 'COT';
+CRC32: 'CRC32';
+CREATE_ASYMMETRIC_PRIV_KEY: 'CREATE_ASYMMETRIC_PRIV_KEY';
+CREATE_ASYMMETRIC_PUB_KEY: 'CREATE_ASYMMETRIC_PUB_KEY';
+CREATE_DH_PARAMETERS: 'CREATE_DH_PARAMETERS';
+CREATE_DIGEST: 'CREATE_DIGEST';
+CROSSES: 'CROSSES';
+DATEDIFF: 'DATEDIFF';
+DATE_FORMAT: 'DATE_FORMAT';
+DAYNAME: 'DAYNAME';
+DAYOFMONTH: 'DAYOFMONTH';
+DAYOFWEEK: 'DAYOFWEEK';
+DAYOFYEAR: 'DAYOFYEAR';
+DECODE: 'DECODE';
+DEGREES: 'DEGREES';
+DES_DECRYPT: 'DES_DECRYPT';
+DES_ENCRYPT: 'DES_ENCRYPT';
+DIMENSION: 'DIMENSION';
+DISJOINT: 'DISJOINT';
+ELT: 'ELT';
+ENCODE: 'ENCODE';
+ENCRYPT: 'ENCRYPT';
+ENDPOINT: 'ENDPOINT';
+ENVELOPE: 'ENVELOPE';
+EQUALS: 'EQUALS';
+EXP: 'EXP';
+EXPORT_SET: 'EXPORT_SET';
+EXTERIORRING: 'EXTERIORRING';
+EXTRACTVALUE: 'EXTRACTVALUE';
+FIELD: 'FIELD';
+FIND_IN_SET: 'FIND_IN_SET';
+FLOOR: 'FLOOR';
+FORMAT: 'FORMAT';
+FOUND_ROWS: 'FOUND_ROWS';
+FROM_BASE64: 'FROM_BASE64';
+FROM_DAYS: 'FROM_DAYS';
+FROM_UNIXTIME: 'FROM_UNIXTIME';
+GEOMCOLLFROMTEXT: 'GEOMCOLLFROMTEXT';
+GEOMCOLLFROMWKB: 'GEOMCOLLFROMWKB';
+GEOMETRYCOLLECTIONFROMTEXT: 'GEOMETRYCOLLECTIONFROMTEXT';
+GEOMETRYCOLLECTIONFROMWKB: 'GEOMETRYCOLLECTIONFROMWKB';
+GEOMETRYFROMTEXT: 'GEOMETRYFROMTEXT';
+GEOMETRYFROMWKB: 'GEOMETRYFROMWKB';
+GEOMETRYN: 'GEOMETRYN';
+GEOMETRYTYPE: 'GEOMETRYTYPE';
+GEOMFROMTEXT: 'GEOMFROMTEXT';
+GEOMFROMWKB: 'GEOMFROMWKB';
+GET_FORMAT: 'GET_FORMAT';
+GET_LOCK: 'GET_LOCK';
+GLENGTH: 'GLENGTH';
+GREATEST: 'GREATEST';
+GTID_SUBSET: 'GTID_SUBSET';
+GTID_SUBTRACT: 'GTID_SUBTRACT';
+HEX: 'HEX';
+IFNULL: 'IFNULL';
+INET6_ATON: 'INET6_ATON';
+INET6_NTOA: 'INET6_NTOA';
+INET_ATON: 'INET_ATON';
+INET_NTOA: 'INET_NTOA';
+INSTR: 'INSTR';
+INTERIORRINGN: 'INTERIORRINGN';
+INTERSECTS: 'INTERSECTS';
+ISCLOSED: 'ISCLOSED';
+ISEMPTY: 'ISEMPTY';
+ISNULL: 'ISNULL';
+ISSIMPLE: 'ISSIMPLE';
+IS_FREE_LOCK: 'IS_FREE_LOCK';
+IS_IPV4: 'IS_IPV4';
+IS_IPV4_COMPAT: 'IS_IPV4_COMPAT';
+IS_IPV4_MAPPED: 'IS_IPV4_MAPPED';
+IS_IPV6: 'IS_IPV6';
+IS_USED_LOCK: 'IS_USED_LOCK';
+LAST_INSERT_ID: 'LAST_INSERT_ID';
+LCASE: 'LCASE';
+LEAST: 'LEAST';
+LENGTH: 'LENGTH';
+LINEFROMTEXT: 'LINEFROMTEXT';
+LINEFROMWKB: 'LINEFROMWKB';
+LINESTRINGFROMTEXT: 'LINESTRINGFROMTEXT';
+LINESTRINGFROMWKB: 'LINESTRINGFROMWKB';
+LN: 'LN';
+LOAD_FILE: 'LOAD_FILE';
+LOCATE: 'LOCATE';
+LOG: 'LOG';
+LOG10: 'LOG10';
+LOG2: 'LOG2';
+LOWER: 'LOWER';
+LPAD: 'LPAD';
+LTRIM: 'LTRIM';
+MAKEDATE: 'MAKEDATE';
+MAKETIME: 'MAKETIME';
+MAKE_SET: 'MAKE_SET';
+MASTER_POS_WAIT: 'MASTER_POS_WAIT';
+MBRCONTAINS: 'MBRCONTAINS';
+MBRDISJOINT: 'MBRDISJOINT';
+MBREQUAL: 'MBREQUAL';
+MBRINTERSECTS: 'MBRINTERSECTS';
+MBROVERLAPS: 'MBROVERLAPS';
+MBRTOUCHES: 'MBRTOUCHES';
+MBRWITHIN: 'MBRWITHIN';
+MD5: 'MD5';
+MLINEFROMTEXT: 'MLINEFROMTEXT';
+MLINEFROMWKB: 'MLINEFROMWKB';
+MONTHNAME: 'MONTHNAME';
+MPOINTFROMTEXT: 'MPOINTFROMTEXT';
+MPOINTFROMWKB: 'MPOINTFROMWKB';
+MPOLYFROMTEXT: 'MPOLYFROMTEXT';
+MPOLYFROMWKB: 'MPOLYFROMWKB';
+MULTILINESTRINGFROMTEXT: 'MULTILINESTRINGFROMTEXT';
+MULTILINESTRINGFROMWKB: 'MULTILINESTRINGFROMWKB';
+MULTIPOINTFROMTEXT: 'MULTIPOINTFROMTEXT';
+MULTIPOINTFROMWKB: 'MULTIPOINTFROMWKB';
+MULTIPOLYGONFROMTEXT: 'MULTIPOLYGONFROMTEXT';
+MULTIPOLYGONFROMWKB: 'MULTIPOLYGONFROMWKB';
+NAME_CONST: 'NAME_CONST';
+NULLIF: 'NULLIF';
+NUMGEOMETRIES: 'NUMGEOMETRIES';
+NUMINTERIORRINGS: 'NUMINTERIORRINGS';
+NUMPOINTS: 'NUMPOINTS';
+OCT: 'OCT';
+OCTET_LENGTH: 'OCTET_LENGTH';
+ORD: 'ORD';
+OVERLAPS: 'OVERLAPS';
+PERIOD_ADD: 'PERIOD_ADD';
+PERIOD_DIFF: 'PERIOD_DIFF';
+PI: 'PI';
+POINTFROMTEXT: 'POINTFROMTEXT';
+POINTFROMWKB: 'POINTFROMWKB';
+POINTN: 'POINTN';
+POLYFROMTEXT: 'POLYFROMTEXT';
+POLYFROMWKB: 'POLYFROMWKB';
+POLYGONFROMTEXT: 'POLYGONFROMTEXT';
+POLYGONFROMWKB: 'POLYGONFROMWKB';
+POW: 'POW';
+POWER: 'POWER';
+QUOTE: 'QUOTE';
+RADIANS: 'RADIANS';
+RAND: 'RAND';
+RANDOM_BYTES: 'RANDOM_BYTES';
+RELEASE_LOCK: 'RELEASE_LOCK';
+REVERSE: 'REVERSE';
+ROUND: 'ROUND';
+ROW_COUNT: 'ROW_COUNT';
+RPAD: 'RPAD';
+RTRIM: 'RTRIM';
+SEC_TO_TIME: 'SEC_TO_TIME';
+SESSION_USER: 'SESSION_USER';
+SHA: 'SHA';
+SHA1: 'SHA1';
+SHA2: 'SHA2';
+SIGN: 'SIGN';
+SIN: 'SIN';
+SLEEP: 'SLEEP';
+SOUNDEX: 'SOUNDEX';
+SQL_THREAD_WAIT_AFTER_GTIDS: 'SQL_THREAD_WAIT_AFTER_GTIDS';
+SQRT: 'SQRT';
+SRID: 'SRID';
+STARTPOINT: 'STARTPOINT';
+STRCMP: 'STRCMP';
+STR_TO_DATE: 'STR_TO_DATE';
+ST_AREA: 'ST_AREA';
+ST_ASBINARY: 'ST_ASBINARY';
+ST_ASTEXT: 'ST_ASTEXT';
+ST_ASWKB: 'ST_ASWKB';
+ST_ASWKT: 'ST_ASWKT';
+ST_BUFFER: 'ST_BUFFER';
+ST_CENTROID: 'ST_CENTROID';
+ST_CONTAINS: 'ST_CONTAINS';
+ST_CROSSES: 'ST_CROSSES';
+ST_DIFFERENCE: 'ST_DIFFERENCE';
+ST_DIMENSION: 'ST_DIMENSION';
+ST_DISJOINT: 'ST_DISJOINT';
+ST_DISTANCE: 'ST_DISTANCE';
+ST_ENDPOINT: 'ST_ENDPOINT';
+ST_ENVELOPE: 'ST_ENVELOPE';
+ST_EQUALS: 'ST_EQUALS';
+ST_EXTERIORRING: 'ST_EXTERIORRING';
+ST_GEOMCOLLFROMTEXT: 'ST_GEOMCOLLFROMTEXT';
+ST_GEOMCOLLFROMTXT: 'ST_GEOMCOLLFROMTXT';
+ST_GEOMCOLLFROMWKB: 'ST_GEOMCOLLFROMWKB';
+ST_GEOMETRYCOLLECTIONFROMTEXT: 'ST_GEOMETRYCOLLECTIONFROMTEXT';
+ST_GEOMETRYCOLLECTIONFROMWKB: 'ST_GEOMETRYCOLLECTIONFROMWKB';
+ST_GEOMETRYFROMTEXT: 'ST_GEOMETRYFROMTEXT';
+ST_GEOMETRYFROMWKB: 'ST_GEOMETRYFROMWKB';
+ST_GEOMETRYN: 'ST_GEOMETRYN';
+ST_GEOMETRYTYPE: 'ST_GEOMETRYTYPE';
+ST_GEOMFROMTEXT: 'ST_GEOMFROMTEXT';
+ST_GEOMFROMWKB: 'ST_GEOMFROMWKB';
+ST_INTERIORRINGN: 'ST_INTERIORRINGN';
+ST_INTERSECTION: 'ST_INTERSECTION';
+ST_INTERSECTS: 'ST_INTERSECTS';
+ST_ISCLOSED: 'ST_ISCLOSED';
+ST_ISEMPTY: 'ST_ISEMPTY';
+ST_ISSIMPLE: 'ST_ISSIMPLE';
+ST_LINEFROMTEXT: 'ST_LINEFROMTEXT';
+ST_LINEFROMWKB: 'ST_LINEFROMWKB';
+ST_LINESTRINGFROMTEXT: 'ST_LINESTRINGFROMTEXT';
+ST_LINESTRINGFROMWKB: 'ST_LINESTRINGFROMWKB';
+ST_NUMGEOMETRIES: 'ST_NUMGEOMETRIES';
+ST_NUMINTERIORRING: 'ST_NUMINTERIORRING';
+ST_NUMINTERIORRINGS: 'ST_NUMINTERIORRINGS';
+ST_NUMPOINTS: 'ST_NUMPOINTS';
+ST_OVERLAPS: 'ST_OVERLAPS';
+ST_POINTFROMTEXT: 'ST_POINTFROMTEXT';
+ST_POINTFROMWKB: 'ST_POINTFROMWKB';
+ST_POINTN: 'ST_POINTN';
+ST_POLYFROMTEXT: 'ST_POLYFROMTEXT';
+ST_POLYFROMWKB: 'ST_POLYFROMWKB';
+ST_POLYGONFROMTEXT: 'ST_POLYGONFROMTEXT';
+ST_POLYGONFROMWKB: 'ST_POLYGONFROMWKB';
+ST_SRID: 'ST_SRID';
+ST_STARTPOINT: 'ST_STARTPOINT';
+ST_SYMDIFFERENCE: 'ST_SYMDIFFERENCE';
+ST_TOUCHES: 'ST_TOUCHES';
+ST_UNION: 'ST_UNION';
+ST_WITHIN: 'ST_WITHIN';
+ST_X: 'ST_X';
+ST_Y: 'ST_Y';
+SUBDATE: 'SUBDATE';
+SUBSTRING_INDEX: 'SUBSTRING_INDEX';
+SUBTIME: 'SUBTIME';
+SYSTEM_USER: 'SYSTEM_USER';
+TAN: 'TAN';
+TIMEDIFF: 'TIMEDIFF';
+TIMESTAMPADD: 'TIMESTAMPADD';
+TIMESTAMPDIFF: 'TIMESTAMPDIFF';
+TIME_FORMAT: 'TIME_FORMAT';
+TIME_TO_SEC: 'TIME_TO_SEC';
+TOUCHES: 'TOUCHES';
+TO_BASE64: 'TO_BASE64';
+TO_DAYS: 'TO_DAYS';
+TO_SECONDS: 'TO_SECONDS';
+UCASE: 'UCASE';
+UNCOMPRESS: 'UNCOMPRESS';
+UNCOMPRESSED_LENGTH: 'UNCOMPRESSED_LENGTH';
+UNHEX: 'UNHEX';
+UNIX_TIMESTAMP: 'UNIX_TIMESTAMP';
+UPDATEXML: 'UPDATEXML';
+UPPER: 'UPPER';
+UUID: 'UUID';
+UUID_SHORT: 'UUID_SHORT';
+VALIDATE_PASSWORD_STRENGTH: 'VALIDATE_PASSWORD_STRENGTH';
+VERSION: 'VERSION';
+WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS: 'WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS';
+WEEKDAY: 'WEEKDAY';
+WEEKOFYEAR: 'WEEKOFYEAR';
+WEIGHT_STRING: 'WEIGHT_STRING';
+WITHIN: 'WITHIN';
+YEARWEEK: 'YEARWEEK';
+Y_FUNCTION: 'Y';
+X_FUNCTION: 'X';
+
+
+
+// Operators
+// Operators. Assigns
+
+VAR_ASSIGN: ':=';
+PLUS_ASSIGN: '+=';
+MINUS_ASSIGN: '-=';
+MULT_ASSIGN: '*=';
+DIV_ASSIGN: '/=';
+MOD_ASSIGN: '%=';
+AND_ASSIGN: '&=';
+XOR_ASSIGN: '^=';
+OR_ASSIGN: '|=';
+
+
+// Operators. Arithmetics
+
+STAR: '*';
+DIVIDE: '/';
+MODULE: '%';
+PLUS: '+';
+MINUSMINUS: '--';
+MINUS: '-';
+DIV: 'DIV';
+MOD: 'MOD';
+
+
+// Operators. Comparation
+
+EQUAL_SYMBOL: '=';
+GREATER_SYMBOL: '>';
+LESS_SYMBOL: '<';
+EXCLAMATION_SYMBOL: '!';
+
+
+// Operators. Bit
+
+BIT_NOT_OP: '~';
+BIT_OR_OP: '|';
+BIT_AND_OP: '&';
+BIT_XOR_OP: '^';
+
+
+// Constructors symbols
+
+DOT: '.';
+LR_BRACKET: '(';
+RR_BRACKET: ')';
+COMMA: ',';
+SEMI: ';';
+AT_SIGN: '@';
+ZERO_DECIMAL: '0';
+ONE_DECIMAL: '1';
+TWO_DECIMAL: '2';
+SINGLE_QUOTE_SYMB: '\'';
+DOUBLE_QUOTE_SYMB: '"';
+REVERSE_QUOTE_SYMB: '`';
+COLON_SYMB: ':';
+
+
+
+// Charsets
+
+CHARSET_REVERSE_QOUTE_STRING: '`' CHARSET_NAME '`';
+
+
+
+// File's sizes
+
+
+FILESIZE_LITERAL: DEC_DIGIT+ ('K'|'M'|'G'|'T');
+
+
+
+// Literal Primitives
+
+
+START_NATIONAL_STRING_LITERAL: 'N' SQUOTA_STRING;
+STRING_LITERAL: DQUOTA_STRING | SQUOTA_STRING;
+DECIMAL_LITERAL: DEC_DIGIT+;
+HEXADECIMAL_LITERAL: 'X' '\'' (HEX_DIGIT HEX_DIGIT)+ '\''
+ | '0X' HEX_DIGIT+;
+
+REAL_LITERAL: (DEC_DIGIT+)? '.' DEC_DIGIT+
+ | DEC_DIGIT+ '.' EXPONENT_NUM_PART
+ | (DEC_DIGIT+)? '.' (DEC_DIGIT+ EXPONENT_NUM_PART)
+ | DEC_DIGIT+ EXPONENT_NUM_PART;
+NULL_SPEC_LITERAL: '\\' 'N';
+BIT_STRING: BIT_STRING_L;
+STRING_CHARSET_NAME: '_' CHARSET_NAME;
+
+
+
+
+// Hack for dotID
+// Prevent recognize string: .123somelatin AS ((.123), FLOAT_LITERAL), ((somelatin), ID)
+// it must recoginze: .123somelatin AS ((.), DOT), (123somelatin, ID)
+
+DOT_ID: '.' ID_LITERAL;
+
+
+
+// Identifiers
+
+ID: ID_LITERAL;
+// DOUBLE_QUOTE_ID: '"' ~'"'+ '"';
+REVERSE_QUOTE_ID: '`' ~'`'+ '`';
+STRING_USER_NAME: (
+ SQUOTA_STRING | DQUOTA_STRING
+ | BQUOTA_STRING | ID_LITERAL
+ ) '@'
+ (
+ SQUOTA_STRING | DQUOTA_STRING
+ | BQUOTA_STRING | ID_LITERAL
+ );
+LOCAL_ID: '@'
+ (
+ [A-Z0-9._$]+
+ | SQUOTA_STRING
+ | DQUOTA_STRING
+ | BQUOTA_STRING
+ );
+GLOBAL_ID: '@' '@'
+ (
+ [A-Z0-9._$]+
+ | BQUOTA_STRING
+ );
+
+
+// Fragments for Literal primitives
+
+fragment CHARSET_NAME: ARMSCII8 | ASCII | BIG5 | BINARY | CP1250
+ | CP1251 | CP1256 | CP1257 | CP850
+ | CP852 | CP866 | CP932 | DEC8 | EUCJPMS
+ | EUCKR | GB2312 | GBK | GEOSTD8 | GREEK
+ | HEBREW | HP8 | KEYBCS2 | KOI8R | KOI8U
+ | LATIN1 | LATIN2 | LATIN5 | LATIN7
+ | MACCE | MACROMAN | SJIS | SWE7 | TIS620
+ | UCS2 | UJIS | UTF16 | UTF16LE | UTF32
+ | UTF8 | UTF8MB4;
+
+fragment EXPONENT_NUM_PART: 'E' '-'? DEC_DIGIT+;
+fragment ID_LITERAL: [A-Z_$0-9]*?[A-Z_$]+?[A-Z_$0-9]*;
+fragment DQUOTA_STRING: '"' ( '\\'. | '""' | ~('"'| '\\') )* '"';
+fragment SQUOTA_STRING: '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'';
+fragment BQUOTA_STRING: '`' ( '\\'. | '``' | ~('`'|'\\'))* '`';
+fragment HEX_DIGIT: [0-9A-F];
+fragment DEC_DIGIT: [0-9];
+fragment BIT_STRING_L: 'B' '\'' [01]+ '\'';
+
+
+
+// Last tokens must generate Errors
+
+ERROR_RECONGNIGION: . -> channel(ERRORCHANNEL);
\ No newline at end of file
diff --git a/debezium-connector-mysql/src/main/resources/antlr4/io/debezium/connector/mysql/antlr/generated/MySqlParser.g4 b/debezium-connector-mysql/src/main/resources/antlr4/io/debezium/connector/mysql/antlr/generated/MySqlParser.g4
new file mode 100644
index 000000000..a0865aee3
--- /dev/null
+++ b/debezium-connector-mysql/src/main/resources/antlr4/io/debezium/connector/mysql/antlr/generated/MySqlParser.g4
@@ -0,0 +1,2464 @@
+/*
+MySQL (Positive Technologies) grammar
+The MIT License (MIT).
+Copyright (c) 2015-2017, Ivan Kochurkin (kvanttt@gmail.com), Positive Technologies.
+Copyright (c) 2017, Ivan Khudyashev (IHudyashov@ptsecurity.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+parser grammar MySqlParser;
+
+options { tokenVocab=MySqlLexer; }
+
+
+// Top Level Description
+
+root
+ : sqlStatements? MINUSMINUS? EOF
+ ;
+
+sqlStatements
+ : (sqlStatement MINUSMINUS? SEMI | emptyStatement)*
+ (sqlStatement (MINUSMINUS? SEMI)? | emptyStatement)
+ ;
+
+sqlStatement
+ : ddlStatement | dmlStatement | transactionStatement
+ | replicationStatement | preparedStatement
+ | administrationStatement | utilityStatement
+ ;
+
+emptyStatement
+ : SEMI
+ ;
+
+ddlStatement
+ : createDatabase | createEvent | createIndex
+ | createLogfileGroup | createProcedure | createFunction
+ | createServer | createTable | createTablespaceInnodb
+ | createTablespaceNdb | createTrigger | createView
+ | alterDatabase | alterEvent | alterFunction
+ | alterInstance | alterLogfileGroup | alterProcedure
+ | alterServer | alterTable | alterTablespace | alterView
+ | dropDatabase | dropEvent | dropIndex
+ | dropLogfileGroup | dropProcedure | dropFunction
+ | dropServer | dropTable | dropTablespace
+ | dropTrigger | dropView
+ | renameTable | truncateTable
+ ;
+
+dmlStatement
+ : selectStatement | insertStatement | updateStatement
+ | deleteStatement | replaceStatement | callStatement
+ | loadDataStatement | loadXmlStatement | doStatement
+ | handlerStatement
+ ;
+
+transactionStatement
+ : startTransaction
+ | beginWork | commitWork | rollbackWork
+ | savepointStatement | rollbackStatement
+ | releaseStatement | lockTables | unlockTables
+ ;
+
+replicationStatement
+ : changeMaster | changeReplicationFilter | purgeBinaryLogs
+ | resetMaster | resetSlave | startSlave | stopSlave
+ | startGroupReplication | stopGroupReplication
+ | xaStartTransaction | xaEndTransaction | xaPrepareStatement
+ | xaCommitWork | xaRollbackWork | xaRecoverWork
+ ;
+
+preparedStatement
+ : prepareStatement | executeStatement | deallocatePrepare
+ ;
+
+// remark: NOT INCLUDED IN sqlStatement, but include in body
+// of routine's statements
+compoundStatement
+ : blockStatement
+ | caseStatement | ifStatement | leaveStatement
+ | loopStatement | repeatStatement | whileStatement
+ | iterateStatement | returnStatement | cursorStatement
+ ;
+
+administrationStatement
+ : alterUser | createUser | dropUser | grantStatement
+ | grantProxy | renameUser | revokeStatement
+ | revokeProxy | analyzeTable | checkTable
+ | checksumTable | optimizeTable | repairTable
+ | createUdfunction | installPlugin | uninstallPlugin
+ | setStatement | showStatement | binlogStatement
+ | cacheIndexStatement | flushStatement | killStatement
+ | loadIndexIntoCache | resetStatement
+ | shutdownStatement
+ ;
+
+utilityStatement
+ : simpleDescribeStatement | fullDescribeStatement
+ | helpStatement | useStatement
+ ;
+
+
+// Data Definition Language
+
+// Create statements
+
+createDatabase
+ : CREATE dbFormat=(DATABASE | SCHEMA)
+ ifNotExists? uid createDatabaseOption*
+ ;
+
+createEvent
+ : CREATE ownerStatement? EVENT ifNotExists? fullId
+ ON SCHEDULE scheduleExpression
+ (ON COMPLETION NOT? PRESERVE)? enableType?
+ (COMMENT STRING_LITERAL)?
+ DO routineBody
+ ;
+
+createIndex
+ : CREATE
+ intimeAction=(ONLINE | OFFLINE)?
+ indexCategory=(UNIQUE | FULLTEXT | SPATIAL)?
+ INDEX uid indexType?
+ ON tableName indexColumnNames
+ indexOption*
+ (
+ ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY)
+ | LOCK '='?
+ lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE)
+ )?
+ ;
+
+createLogfileGroup
+ : CREATE LOGFILE GROUP uid
+ ADD UNDOFILE undoFile=STRING_LITERAL
+ (INITIAL_SIZE '='? initSize=fileSizeLiteral)?
+ (UNDO_BUFFER_SIZE '='? undoSize=fileSizeLiteral)?
+ (REDO_BUFFER_SIZE '='? redoSize=fileSizeLiteral)?
+ (NODEGROUP '='? uid)?
+ WAIT?
+ (COMMENT '='? comment=STRING_LITERAL)?
+ ENGINE '='? engineName
+ ;
+
+createProcedure
+ : CREATE ownerStatement?
+ PROCEDURE fullId
+ '(' procedureParameter? (',' procedureParameter)* ')'
+ routineOption*
+ routineBody
+ ;
+
+createFunction
+ : CREATE ownerStatement?
+ FUNCTION fullId
+ '(' functionParameter? (',' functionParameter)* ')'
+ RETURNS dataType
+ routineOption*
+ routineBody
+ ;
+
+createServer
+ : CREATE SERVER uid
+ FOREIGN DATA WRAPPER wrapperName=(MYSQL | STRING_LITERAL)
+ OPTIONS '(' serverOption (',' serverOption)* ')'
+ ;
+
+createTable
+ : CREATE TEMPORARY? TABLE ifNotExists?
+ tableName
+ (
+ LIKE tableName
+ | '(' LIKE parenthesisTable=tableName ')'
+ ) #copyCreateTable
+ | CREATE TEMPORARY? TABLE ifNotExists?
+ tableName createDefinitions?
+ ( tableOption (','? tableOption)* )?
+ partitionDefinitions? keyViolate=(IGNORE | REPLACE)?
+ AS? selectStatement #queryCreateTable
+ | CREATE TEMPORARY? TABLE ifNotExists?
+ tableName createDefinitions
+ ( tableOption (','? tableOption)* )?
+ partitionDefinitions? #columnCreateTable
+ ;
+
+createTablespaceInnodb
+ : CREATE TABLESPACE uid
+ ADD DATAFILE datafile=STRING_LITERAL
+ (FILE_BLOCK_SIZE '=' fileBlockSize=fileSizeLiteral)?
+ (ENGINE '='? engineName)?
+ ;
+
+createTablespaceNdb
+ : CREATE TABLESPACE uid
+ ADD DATAFILE datafile=STRING_LITERAL
+ USE LOGFILE GROUP uid
+ (EXTENT_SIZE '='? extentSize=fileSizeLiteral)?
+ (INITIAL_SIZE '='? initialSize=fileSizeLiteral)?
+ (AUTOEXTEND_SIZE '='? autoextendSize=fileSizeLiteral)?
+ (MAX_SIZE '='? maxSize=fileSizeLiteral)?
+ (NODEGROUP '='? uid)?
+ WAIT?
+ (COMMENT '='? comment=STRING_LITERAL)?
+ ENGINE '='? engineName
+ ;
+
+createTrigger
+ : CREATE ownerStatement?
+ TRIGGER thisTrigger=fullId
+ triggerTime=(BEFORE | AFTER)
+ triggerEvent=(INSERT | UPDATE | DELETE)
+ ON tableName FOR EACH ROW
+ (triggerPlace=(FOLLOWS | PRECEDES) otherTrigger=fullId)?
+ routineBody
+ ;
+
+createView
+ : CREATE (OR REPLACE)?
+ (
+ ALGORITHM '=' algType=(UNDEFINED | MERGE | TEMPTABLE)
+ )?
+ ownerStatement?
+ (SQL SECURITY secContext=(DEFINER | INVOKER))?
+ VIEW fullId ('(' uidList ')')? AS selectStatement
+ (WITH checkOption=(CASCADED | LOCAL)? CHECK OPTION)?
+ ;
+
+// details
+
+createDatabaseOption
+ : DEFAULT? CHARACTER SET '='? charsetName
+ | DEFAULT? COLLATE '='? collationName
+ ;
+
+ownerStatement
+ : DEFINER '=' (userName | CURRENT_USER ( '(' ')')?)
+ ;
+
+scheduleExpression
+ : AT timestampValue intervalExpr* #preciseSchedule
+ | EVERY (decimalLiteral | expression) intervalType
+ (
+ STARTS start=timestampValue
+ (startIntervals+=intervalExpr)*
+ )?
+ (
+ ENDS end=timestampValue
+ (endIntervals+=intervalExpr)*
+ )? #intervalSchedule
+ ;
+
+timestampValue
+ : CURRENT_TIMESTAMP
+ | stringLiteral
+ | decimalLiteral
+ | expression
+ ;
+
+intervalExpr
+ : '+' INTERVAL (decimalLiteral | expression) intervalType
+ ;
+
+intervalType
+ : intervalTypeBase
+ | YEAR | YEAR_MONTH | DAY_HOUR | DAY_MINUTE
+ | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
+ | SECOND_MICROSECOND | MINUTE_MICROSECOND
+ | HOUR_MICROSECOND | DAY_MICROSECOND
+ ;
+
+enableType
+ : ENABLE | DISABLE | DISABLE ON SLAVE
+ ;
+
+indexType
+ : USING (BTREE | HASH)
+ ;
+
+indexOption
+ : KEY_BLOCK_SIZE '='? fileSizeLiteral
+ | indexType
+ | WITH PARSER uid
+ | COMMENT STRING_LITERAL
+ ;
+
+procedureParameter
+ : direction=(IN | OUT | INOUT) uid dataType
+ ;
+
+functionParameter
+ : uid dataType
+ ;
+
+routineOption
+ : COMMENT STRING_LITERAL #routineComment
+ | LANGUAGE SQL #routineLanguage
+ | NOT? DETERMINISTIC #routineBehavior
+ | (
+ CONTAINS SQL | NO SQL | READS SQL DATA
+ | MODIFIES SQL DATA
+ ) #routineData
+ | SQL SECURITY context=(DEFINER | INVOKER) #routineSecurity
+ ;
+
+serverOption
+ : HOST STRING_LITERAL
+ | DATABASE STRING_LITERAL
+ | USER STRING_LITERAL
+ | PASSWORD STRING_LITERAL
+ | SOCKET STRING_LITERAL
+ | OWNER STRING_LITERAL
+ | PORT decimalLiteral
+ ;
+
+createDefinitions
+ : '(' createDefinition (',' createDefinition)* ')'
+ ;
+
+createDefinition
+ : uid columnDefinition #columnDeclaration
+ | tableConstraint #constraintDeclaration
+ | indexColumnDefinition #indexDeclaration
+ ;
+
+columnDefinition
+ : dataType columnConstraint*
+ ;
+
+columnConstraint
+ : nullNotnull #nullColumnConstraint
+ | DEFAULT defaultValue #defaultColumnConstraint
+ | AUTO_INCREMENT #autoIncrementColumnConstraint
+ | PRIMARY? KEY #primaryKeyColumnConstraint
+ | UNIQUE KEY? #uniqueKeyColumnConstraint
+ | COMMENT STRING_LITERAL #commentColumnConstraint
+ | COLUMN_FORMAT colformat=(FIXED | DYNAMIC | DEFAULT) #formatColumnConstraint
+ | STORAGE storageval=(DISK | MEMORY | DEFAULT) #storageColumnConstraint
+ | referenceDefinition #referenceColumnConstraint
+ ;
+
+tableConstraint
+ : (CONSTRAINT name=uid?)?
+ PRIMARY KEY indexType? indexColumnNames indexOption* #primaryKeyTableConstraint
+ | (CONSTRAINT name=uid?)?
+ UNIQUE indexFormat=(INDEX | KEY)? index=uid?
+ indexType? indexColumnNames indexOption* #uniqueKeyTableConstraint
+ | (CONSTRAINT name=uid?)?
+ FOREIGN KEY index=uid? indexColumnNames
+ referenceDefinition #foreignKeyTableConstraint
+ | CHECK '(' expression ')' #checkTableConstraint
+ ;
+
+referenceDefinition
+ : REFERENCES tableName indexColumnNames
+ (MATCH matchType=(FULL | PARTIAL | SIMPLE))?
+ referenceAction?
+ ;
+
+referenceAction
+ : ON DELETE onDelete=referenceControlType
+ (
+ ON UPDATE onUpdate=referenceControlType
+ )?
+ | ON UPDATE onUpdate=referenceControlType
+ (
+ ON DELETE onDelete=referenceControlType
+ )?
+ ;
+
+referenceControlType
+ : RESTRICT | CASCADE | SET NULL_LITERAL | NO ACTION
+ ;
+
+indexColumnDefinition
+ : indexFormat=(INDEX | KEY) uid? indexType?
+ indexColumnNames indexOption* #simpleIndexDeclaration
+ | (FULLTEXT | SPATIAL)
+ indexFormat=(INDEX | KEY)? uid?
+ indexColumnNames indexOption* #specialIndexDeclaration
+ ;
+
+tableOption
+ : ENGINE '='? engineName #tableOptionEngine
+ | AUTO_INCREMENT '='? decimalLiteral #tableOptionAutoIncrement
+ | AVG_ROW_LENGTH '='? decimalLiteral #tableOptionAverage
+ | DEFAULT? (CHARACTER SET | CHARSET) '='? charsetName #tableOptionCharset
+ | CHECKSUM '='? boolValue=('0' | '1') #tableOptionChecksum
+ | DEFAULT? COLLATE '='? collationName #tableOptionCollate
+ | COMMENT '='? STRING_LITERAL #tableOptionComment
+ | COMPRESSION '='? STRING_LITERAL #tableOptionCompression
+ | CONNECTION '='? STRING_LITERAL #tableOptionConnection
+ | DATA DIRECTORY '='? STRING_LITERAL #tableOptionDataDirectory
+ | DELAY_KEY_WRITE '='? boolValue=('0' | '1') #tableOptionDelay
+ | ENCRYPTION '='? STRING_LITERAL #tableOptionEncryption
+ | INDEX DIRECTORY '='? STRING_LITERAL #tableOptionIndexDirectory
+ | INSERT_METHOD '='? insertMethod=(NO | FIRST | LAST) #tableOptionInsertMethod
+ | KEY_BLOCK_SIZE '='? fileSizeLiteral #tableOptionKeyBlockSize
+ | MAX_ROWS '='? decimalLiteral #tableOptionMaxRows
+ | MIN_ROWS '='? decimalLiteral #tableOptionMinRows
+ | PACK_KEYS '='? extBoolValue=('0' | '1' | DEFAULT) #tableOptionPackKeys
+ | PASSWORD '='? STRING_LITERAL #tableOptionPassword
+ | ROW_FORMAT '='?
+ rowFormat=(
+ DEFAULT | DYNAMIC | FIXED | COMPRESSED
+ | REDUNDANT | COMPACT
+ ) #tableOptionRowFormat
+ | STATS_AUTO_RECALC '='? extBoolValue=(DEFAULT | '0' | '1') #tableOptionRecalculation
+ | STATS_PERSISTENT '='? extBoolValue=(DEFAULT | '0' | '1') #tableOptionPersistent
+ | STATS_SAMPLE_PAGES '='? decimalLiteral #tableOptionSamplePage
+ | TABLESPACE uid tablespaceStorage? #tableOptionTablespace
+ | UNION '='? '(' tables ')' #tableOptionUnion
+ ;
+
+tablespaceStorage
+ : STORAGE (DISK | MEMORY | DEFAULT)
+ ;
+
+partitionDefinitions
+ : PARTITION BY partitionFunctionDefinition
+ (PARTITIONS count=decimalLiteral)?
+ (
+ SUBPARTITION BY subpartitionFunctionDefinition
+ (SUBPARTITIONS subCount=decimalLiteral)?
+ )?
+ ('(' partitionDefinition (',' partitionDefinition)* ')')?
+ ;
+
+partitionFunctionDefinition
+ : LINEAR? HASH '(' expression ')' #partitionFunctionHash
+ | LINEAR? KEY (ALGORITHM '=' algType=('1' | '2'))?
+ '(' uidList ')' #partitionFunctionKey
+ | RANGE ( '(' expression ')' | COLUMNS '(' uidList ')' ) #partitionFunctionRange
+ | LIST ( '(' expression ')' | COLUMNS '(' uidList ')' ) #partitionFunctionList
+ ;
+
+subpartitionFunctionDefinition
+ : LINEAR? HASH '(' expression ')' #subPartitionFunctionHash
+ | LINEAR? KEY (ALGORITHM '=' algType=('1' | '2'))?
+ '(' uidList ')' #subPartitionFunctionKey
+ ;
+
+partitionDefinition
+ : PARTITION uid VALUES LESS THAN
+ '('
+ partitionDefinerAtom (',' partitionDefinerAtom)*
+ ')'
+ partitionOption*
+ (subpartitionDefinition (',' subpartitionDefinition)*)? #partitionComparision
+ | PARTITION uid VALUES IN
+ '('
+ partitionDefinerAtom (',' partitionDefinerAtom)*
+ ')'
+ partitionOption*
+ (subpartitionDefinition (',' subpartitionDefinition)*)? #partitionListAtom
+ | PARTITION uid VALUES IN
+ '('
+ partitionDefinerVector (',' partitionDefinerVector)*
+ ')'
+ partitionOption*
+ (subpartitionDefinition (',' subpartitionDefinition)*)? #partitionListVector
+ | PARTITION uid partitionOption*
+ (subpartitionDefinition (',' subpartitionDefinition)*)? #partitionSimple
+ ;
+
+partitionDefinerAtom
+ : constant | MAXVALUE | expression
+ ;
+
+partitionDefinerVector
+ : '(' partitionDefinerAtom (',' partitionDefinerAtom)+ ')'
+ ;
+
+subpartitionDefinition
+ : SUBPARTITION uid partitionOption*
+ ;
+
+partitionOption
+ : STORAGE? ENGINE '='? engineName #partitionOptionEngine
+ | COMMENT '='? comment=STRING_LITERAL #partitionOptionComment
+ | DATA DIRECTORY '='? dataDirectory=STRING_LITERAL #partitionOptionDataDirectory
+ | INDEX DIRECTORY '='? indexDirectory=STRING_LITERAL #partitionOptionIndexDirectory
+ | MAX_ROWS '='? maxRows=decimalLiteral #partitionOptionMaxRows
+ | MIN_ROWS '='? minRows=decimalLiteral #partitionOptionMinRows
+ | TABLESPACE '='? tablespace=uid #partitionOptionTablespace
+ | NODEGROUP '='? nodegroup=uid #partitionOptionNodeGroup
+ ;
+
+// Alter statements
+
+alterDatabase
+ : ALTER dbFormat=(DATABASE | SCHEMA) uid?
+ createDatabaseOption+ #alterSimpleDatabase
+ | ALTER dbFormat=(DATABASE | SCHEMA) uid
+ UPGRADE DATA DIRECTORY NAME #alterUpgradeName
+ ;
+
+alterEvent
+ : ALTER ownerStatement?
+ EVENT fullId
+ (ON SCHEDULE scheduleExpression)?
+ (ON COMPLETION NOT? PRESERVE)?
+ (RENAME TO fullId)? enableType?
+ (COMMENT STRING_LITERAL)?
+ (DO routineBody)?
+ ;
+
+alterFunction
+ : ALTER FUNCTION fullId routineOption*
+ ;
+
+alterInstance
+ : ALTER INSTANCE ROTATE INNODB MASTER KEY
+ ;
+
+alterLogfileGroup
+ : ALTER LOGFILE GROUP uid
+ ADD UNDOFILE STRING_LITERAL
+ (INITIAL_SIZE '='? fileSizeLiteral)?
+ WAIT? ENGINE '='? engineName
+ ;
+
+alterProcedure
+ : ALTER PROCEDURE fullId routineOption*
+ ;
+
+alterServer
+ : ALTER SERVER uid OPTIONS
+ '(' serverOption (',' serverOption)* ')'
+ ;
+
+alterTable
+ : ALTER intimeAction=(ONLINE | OFFLINE)?
+ IGNORE? TABLE tableName
+ alterSpecification (',' alterSpecification)*
+ partitionDefinitions?
+ ;
+
+alterTablespace
+ : ALTER TABLESPACE uid
+ objectAction=(ADD | DROP) DATAFILE STRING_LITERAL
+ (INITIAL_SIZE '=' fileSizeLiteral)?
+ WAIT?
+ ENGINE '='? engineName
+ ;
+
+alterView
+ : ALTER
+ (
+ ALGORITHM '=' algType=(UNDEFINED | MERGE | TEMPTABLE)
+ )?
+ ownerStatement?
+ (SQL SECURITY secContext=(DEFINER | INVOKER))?
+ VIEW fullId ('(' uidList ')')? AS selectStatement
+ (WITH checkOpt=(CASCADED | LOCAL)? CHECK OPTION)?
+ ;
+
+// details
+
+alterSpecification
+ : tableOption #alterByTableOption
+ | ADD COLUMN? uid columnDefinition (FIRST | AFTER uid)? #alterByAddColumn
+ | ADD COLUMN?
+ '('
+ uid columnDefinition ( ',' uid columnDefinition)*
+ ')' #alterByAddColumns
+ | ADD indexFormat=(INDEX | KEY) uid? indexType?
+ indexColumnNames indexOption* #alterByAddIndex
+ | ADD (CONSTRAINT name=uid?)? PRIMARY KEY
+ indexType? indexColumnNames indexOption* #alterByAddPrimaryKey
+ | ADD (CONSTRAINT name=uid?)? UNIQUE
+ indexFormat=(INDEX | KEY)? indexName=uid?
+ indexType? indexColumnNames indexOption* #alterByAddUniqueKey
+ | ADD keyType=(FULLTEXT | SPATIAL)
+ indexFormat=(INDEX | KEY)? uid?
+ indexColumnNames indexOption* #alterByAddSpecialIndex
+ | ADD (CONSTRAINT name=uid?)? FOREIGN KEY
+ indexName=uid? indexColumnNames referenceDefinition #alterByAddForeignKey
+ | ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY) #alterBySetAlgorithm
+ | ALTER COLUMN? uid
+ (SET DEFAULT defaultValue | DROP DEFAULT) #alterByChangeDefault
+ | CHANGE COLUMN? oldColumn=uid
+ newColumn=uid columnDefinition
+ (FIRST | AFTER afterColumn=uid)? #alterByChangeColumn
+ | LOCK '='? lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE) #alterByLock
+ | MODIFY COLUMN?
+ uid columnDefinition (FIRST | AFTER uid)? #alterByModifyColumn
+ | DROP COLUMN? uid #alterByDropColumn
+ | DROP PRIMARY KEY #alterByDropPrimaryKey
+ | DROP indexFormat=(INDEX | KEY) uid #alterByDropIndex
+ | DROP FOREIGN KEY uid #alterByDropForeignKey
+ | DISABLE KEYS #alterByDisableKeys
+ | ENABLE KEYS #alterByEnableKeys
+ | RENAME renameFormat=(TO | AS)? uid #alterByRename
+ | ORDER BY uidList #alterByOrder
+ | CONVERT TO CHARACTER SET charsetName
+ (COLLATE collationName)? #alterByConvertCharset
+ | DEFAULT? CHARACTER SET '=' charsetName
+ (COLLATE '=' collationName)? #alterByDefaultCharset
+ | DISCARD TABLESPACE #alterByDiscardTablespace
+ | IMPORT TABLESPACE #alterByImportTablespace
+ | FORCE #alterByForce
+ | validationFormat=(WITHOUT | WITH) VALIDATION #alterByValidate
+ | ADD PARTITION partitionDefinition #alterByAddPartition
+ | DROP PARTITION uidList #alterByDropPartition
+ | DISCARD PARTITION (uidList | ALL) TABLESPACE #alterByDiscardPartition
+ | IMPORT PARTITION (uidList | ALL) TABLESPACE #alterByImportPartition
+ | TRUNCATE PARTITION (uidList | ALL) #alterByTruncatePartition
+ | COALESCE PARTITION decimalLiteral #alterByCoalescePartition
+ | REORGANIZE PARTITION uidList
+ INTO '('
+ partitionDefinition (',' partitionDefinition)*
+ ')' #alterByReorganizePartition
+ | EXCHANGE PARTITION uid WITH TABLE tableName
+ (validationFormat=(WITH | WITHOUT) VALIDATION)? #alterByExchangePartition
+ | ANALYZE PARTITION (uidList | ALL) #alterByAnalyzePartitiion
+ | CHECK PARTITION (uidList | ALL) #alterByCheckPartition
+ | OPTIMIZE PARTITION (uidList | ALL) #alterByOptimizePartition
+ | REBUILD PARTITION (uidList | ALL) #alterByRebuildPartition
+ | REPAIR PARTITION (uidList | ALL) #alterByRepairPartition
+ | REMOVE PARTITIONING #alterByRemovePartitioning
+ | UPGRADE PARTITIONING #alterByUpgradePartitioning
+ ;
+
+
+// Drop statements
+
+dropDatabase
+ : DROP dbFormat=(DATABASE | SCHEMA) ifExists? uid
+ ;
+
+dropEvent
+ : DROP EVENT ifExists? fullId
+ ;
+
+dropIndex
+ : DROP INDEX intimeAction=(ONLINE | OFFLINE)?
+ uid ON tableName
+ (
+ ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY)
+ )?
+ (
+ LOCK '='? lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE)
+ )?
+ ;
+
+dropLogfileGroup
+ : DROP LOGFILE GROUP uid ENGINE '=' engineName
+ ;
+
+dropProcedure
+ : DROP PROCEDURE ifExists? fullId
+ ;
+
+dropFunction
+ : DROP FUNCTION ifExists? fullId
+ ;
+
+dropServer
+ : DROP SERVER ifExists? uid
+ ;
+
+dropTable
+ : DROP TEMPORARY? TABLE ifExists?
+ tables dropType=(RESTRICT | CASCADE)?
+ ;
+
+dropTablespace
+ : DROP TABLESPACE uid (ENGINE '='? engineName)?
+ ;
+
+dropTrigger
+ : DROP TRIGGER ifExists? fullId
+ ;
+
+dropView
+ : DROP VIEW ifExists?
+ fullId (',' fullId)* dropType=(RESTRICT | CASCADE)?
+ ;
+
+
+// Other DDL statements
+
+renameTable
+ : RENAME TABLE
+ renameTableClause (',' renameTableClause)*
+ ;
+
+renameTableClause
+ : tableName TO tableName
+ ;
+
+truncateTable
+ : TRUNCATE TABLE? tableName
+ ;
+
+
+// Data Manipulation Language
+
+// Primary DML Statements
+
+
+callStatement
+ : CALL fullId
+ (
+ '(' (constants | expressions)? ')'
+ )?
+ ;
+
+deleteStatement
+ : singleDeleteStatement | multipleDeleteStatement
+ ;
+
+doStatement
+ : DO expressions
+ ;
+
+handlerStatement
+ : handlerOpenStatement
+ | handlerReadIndexStatement
+ | handlerReadStatement
+ | handlerCloseStatement
+ ;
+
+insertStatement
+ : INSERT
+ priority=(LOW_PRIORITY | DELAYED | HIGH_PRIORITY)?
+ IGNORE? INTO? tableName
+ (PARTITION '(' partitions=uidList ')' )?
+ (
+ ('(' columns=uidList ')')? insertStatementValue
+ | SET
+ setFirst=updatedElement
+ (',' setElements+=updatedElement)*
+ )
+ (
+ ON DUPLICATE KEY UPDATE
+ duplicatedFirst=updatedElement
+ (',' duplicatedElements+=updatedElement)*
+ )?
+ ;
+
+loadDataStatement
+ : LOAD DATA
+ priority=(LOW_PRIORITY | CONCURRENT)?
+ LOCAL? INFILE filename=STRING_LITERAL
+ violation=(REPLACE | IGNORE)?
+ INTO TABLE tableName
+ (PARTITION '(' uidList ')' )?
+ (CHARACTER SET charset=charsetName)?
+ (
+ fieldsFormat=(FIELDS | COLUMNS)
+ selectFieldsInto+
+ )?
+ (
+ LINES
+ selectLinesInto+
+ )?
+ (
+ IGNORE decimalLiteral linesFormat=(LINES | ROWS)
+ )?
+ ( '(' assignmentField (',' assignmentField)* ')' )?
+ (SET updatedElement (',' updatedElement)*)?
+ ;
+
+loadXmlStatement
+ : LOAD XML
+ priority=(LOW_PRIORITY | CONCURRENT)?
+ LOCAL? INFILE filename=STRING_LITERAL
+ violation=(REPLACE | IGNORE)?
+ INTO TABLE tableName
+ (CHARACTER SET charset=charsetName)?
+ (ROWS IDENTIFIED BY '<' tag=STRING_LITERAL '>')?
+ ( IGNORE decimalLiteral linesFormat=(LINES | ROWS) )?
+ ( '(' assignmentField (',' assignmentField)* ')' )?
+ (SET updatedElement (',' updatedElement)*)?
+ ;
+
+replaceStatement
+ : REPLACE priority=(LOW_PRIORITY | DELAYED)?
+ INTO? tableName
+ (PARTITION '(' partitions=uidList ')' )?
+ (
+ ('(' columns=uidList ')')? insertStatementValue
+ | SET
+ setFirst=updatedElement
+ (',' setElements+=updatedElement)*
+ )
+ ;
+
+selectStatement
+ : querySpecification lockClause? #simpleSelect
+ | queryExpression lockClause? #parenthesisSelect
+ | querySpecificationNointo unionStatement+
+ (
+ UNION unionType=(ALL | DISTINCT)?
+ (querySpecification | queryExpression)
+ )?
+ orderByClause? limitClause? lockClause? #unionSelect
+ | queryExpressionNointo unionParenthesis+
+ (
+ UNION unionType=(ALL | DISTINCT)?
+ queryExpression
+ )?
+ orderByClause? limitClause? lockClause? #unionParenthesisSelect
+ ;
+
+updateStatement
+ : singleUpdateStatement | multipleUpdateStatement
+ ;
+
+// details
+
+insertStatementValue
+ : selectStatement
+ | insertFormat=(VALUES | VALUE)
+ '(' expressionsWithDefaults ')'
+ (',' '(' expressionsWithDefaults ')')*
+ ;
+
+updatedElement
+ : fullColumnName '=' (expression | DEFAULT)
+ ;
+
+assignmentField
+ : uid | LOCAL_ID
+ ;
+
+lockClause
+ : FOR UPDATE | LOCK IN SHARE MODE
+ ;
+
+// Detailed DML Statements
+
+singleDeleteStatement
+ : DELETE priority=LOW_PRIORITY? QUICK? IGNORE?
+ FROM tableName
+ (PARTITION '(' uidList ')' )?
+ (WHERE expression)?
+ orderByClause? (LIMIT decimalLiteral)?
+ ;
+
+multipleDeleteStatement
+ : DELETE priority=LOW_PRIORITY? QUICK? IGNORE?
+ (
+ tableName ('.' '*')? ( ',' tableName ('.' '*')? )*
+ FROM tableSources
+ | FROM
+ tableName ('.' '*')? ( ',' tableName ('.' '*')? )*
+ USING tableSources
+ )
+ (WHERE expression)?
+ ;
+
+handlerOpenStatement
+ : HANDLER tableName OPEN (AS? uid)?
+ ;
+
+handlerReadIndexStatement
+ : HANDLER tableName READ index=uid
+ (
+ comparisonOperator '(' constants ')'
+ | moveOrder=(FIRST | NEXT | PREV | LAST)
+ )
+ (WHERE expression)? (LIMIT decimalLiteral)?
+ ;
+
+handlerReadStatement
+ : HANDLER tableName READ moveOrder=(FIRST | NEXT)
+ (WHERE expression)? (LIMIT decimalLiteral)?
+ ;
+
+handlerCloseStatement
+ : HANDLER tableName CLOSE
+ ;
+
+singleUpdateStatement
+ : UPDATE priority=LOW_PRIORITY? IGNORE? tableName (AS? uid)?
+ SET updatedElement (',' updatedElement)*
+ (WHERE expression)? orderByClause? limitClause?
+ ;
+
+multipleUpdateStatement
+ : UPDATE priority=LOW_PRIORITY? IGNORE? tableSources
+ SET updatedElement (',' updatedElement)*
+ (WHERE expression)?
+ ;
+
+// details
+
+orderByClause
+ : ORDER BY orderByExpression (',' orderByExpression)*
+ ;
+
+orderByExpression
+ : expression order=(ASC | DESC)?
+ ;
+
+tableSources
+ : tableSource (',' tableSource)*
+ ;
+
+tableSource
+ : tableSourceItem joinPart* #tableSourceBase
+ | '(' tableSourceItem joinPart* ')' #tableSourceNested
+ ;
+
+tableSourceItem
+ : tableName
+ (PARTITION '(' uidList ')' )? (AS? alias=uid)?
+ (indexHint (',' indexHint)* )? #atomTableItem
+ | (
+ selectStatement
+ | '(' parenthesisSubquery=selectStatement ')'
+ )
+ AS? alias=uid #subqueryTableItem
+ | '(' tableSources ')' #tableSourcesItem
+ ;
+
+indexHint
+ : indexHintAction=(USE | IGNORE | FORCE)
+ keyFormat=(INDEX|KEY) ( FOR indexHintType)?
+ '(' uidList ')'
+ ;
+
+indexHintType
+ : JOIN | ORDER BY | GROUP BY
+ ;
+
+joinPart
+ : (INNER | CROSS)? JOIN tableSourceItem
+ (
+ ON expression
+ | USING '(' uidList ')'
+ )? #innerJoin
+ | STRAIGHT_JOIN tableSourceItem (ON expression)? #straightJoin
+ | (LEFT | RIGHT) OUTER? JOIN tableSourceItem
+ (
+ ON expression
+ | USING '(' uidList ')'
+ ) #outerJoin
+ | NATURAL ((LEFT | RIGHT) OUTER?)? JOIN tableSourceItem #naturalJoin
+ ;
+
+// Select Statement's Details
+
+queryExpression
+ : '(' querySpecification ')'
+ | '(' queryExpression ')'
+ ;
+
+queryExpressionNointo
+ : '(' querySpecificationNointo ')'
+ | '(' queryExpressionNointo ')'
+ ;
+
+querySpecification
+ : SELECT selectSpec* selectElements selectIntoExpression?
+ fromClause? orderByClause? limitClause?
+ | SELECT selectSpec* selectElements
+ fromClause? orderByClause? limitClause? selectIntoExpression?
+ ;
+
+querySpecificationNointo
+ : SELECT selectSpec* selectElements
+ fromClause? orderByClause? limitClause?
+ ;
+
+unionParenthesis
+ : UNION unionType=(ALL | DISTINCT)? queryExpressionNointo
+ ;
+
+unionStatement
+ : UNION unionType=(ALL | DISTINCT)?
+ (querySpecificationNointo | queryExpressionNointo)
+ ;
+
+// details
+
+selectSpec
+ : (ALL | DISTINCT | DISTINCTROW)
+ | HIGH_PRIORITY | STRAIGHT_JOIN | SQL_SMALL_RESULT
+ | SQL_BIG_RESULT | SQL_BUFFER_RESULT
+ | (SQL_CACHE | SQL_NO_CACHE)
+ | SQL_CALC_FOUND_ROWS
+ ;
+
+selectElements
+ : (star='*' | selectElement ) (',' selectElement)*
+ ;
+
+selectElement
+ : fullId '.' '*' #selectStarElement
+ | fullColumnName (AS? uid)? #selectColumnElement
+ | functionCall (AS? uid)? #selectFunctionElement
+ | (LOCAL_ID VAR_ASSIGN)? expression (AS? uid)? #selectExpressionElement
+ ;
+
+selectIntoExpression
+ : INTO assignmentField (',' assignmentField )* #selectIntoVariables
+ | INTO DUMPFILE STRING_LITERAL #selectIntoDumpFile
+ | (
+ INTO OUTFILE filename=STRING_LITERAL
+ (CHARACTER SET charset=charsetName)?
+ (
+ fieldsFormat=(FIELDS | COLUMNS)
+ selectFieldsInto+
+ )?
+ (
+ LINES selectLinesInto+
+ )?
+ ) #selectIntoTextFile
+ ;
+
+selectFieldsInto
+ : TERMINATED BY terminationField=STRING_LITERAL
+ | OPTIONALLY? ENCLOSED BY enclosion=STRING_LITERAL
+ | ESCAPED BY escaping=STRING_LITERAL
+ ;
+
+selectLinesInto
+ : STARTING BY starting=STRING_LITERAL
+ | TERMINATED BY terminationLine=STRING_LITERAL
+ ;
+
+fromClause
+ : FROM tableSources
+ (WHERE whereExpr=expression)?
+ (
+ GROUP BY
+ groupByItem (',' groupByItem)*
+ (WITH ROLLUP)?
+ )?
+ (HAVING havingExpr=expression)?
+ ;
+
+groupByItem
+ : expression order=(ASC | DESC)?
+ ;
+
+limitClause
+ : LIMIT
+ (
+ (offset=decimalLiteral ',')? limit=decimalLiteral
+ | limit=decimalLiteral OFFSET offset=decimalLiteral
+ )
+ ;
+
+
+// Transaction's Statements
+
+startTransaction
+ : START TRANSACTION (transactionMode (',' transactionMode)* )?
+ ;
+
+beginWork
+ : BEGIN WORK?
+ ;
+
+commitWork
+ : COMMIT WORK?
+ (AND nochain=NO? CHAIN)?
+ (norelease=NO? RELEASE)?
+ ;
+
+rollbackWork
+ : ROLLBACK WORK?
+ (AND nochain=NO? CHAIN)?
+ (norelease=NO? RELEASE)?
+ ;
+
+savepointStatement
+ : SAVEPOINT uid
+ ;
+
+rollbackStatement
+ : ROLLBACK WORK? TO SAVEPOINT? uid
+ ;
+
+releaseStatement
+ : RELEASE SAVEPOINT uid
+ ;
+
+lockTables
+ : LOCK TABLES lockTableElement (',' lockTableElement)*
+ ;
+
+unlockTables
+ : UNLOCK TABLES
+ ;
+
+
+// details
+
+setAutocommitStatement
+ : SET AUTOCOMMIT '=' autocommitValue=('0' | '1')
+ ;
+
+setTransactionStatement
+ : SET transactionContext=(GLOBAL | SESSION)? TRANSACTION
+ transactionOption (',' transactionOption)*
+ ;
+
+transactionMode
+ : WITH CONSISTENT SNAPSHOT
+ | READ WRITE
+ | READ ONLY
+ ;
+
+lockTableElement
+ : tableName (AS? uid)? lockAction
+ ;
+
+lockAction
+ : READ LOCAL? | LOW_PRIORITY? WRITE
+ ;
+
+transactionOption
+ : ISOLATION LEVEL transactionLevel
+ | READ WRITE
+ | READ ONLY
+ ;
+
+transactionLevel
+ : REPEATABLE READ
+ | READ COMMITTED
+ | READ UNCOMMITTED
+ | SERIALIZABLE
+ ;
+
+
+// Replication's Statements
+
+// Base Replication
+
+changeMaster
+ : CHANGE MASTER TO
+ masterOption (',' masterOption)* channelOption?
+ ;
+
+changeReplicationFilter
+ : CHANGE REPLICATION FILTER
+ replicationFilter (',' replicationFilter)*
+ ;
+
+purgeBinaryLogs
+ : PURGE purgeFormat=(BINARY | MASTER) LOGS
+ (
+ TO fileName=STRING_LITERAL
+ | BEFORE timeValue=STRING_LITERAL
+ )
+ ;
+
+resetMaster
+ : RESET MASTER
+ ;
+
+resetSlave
+ : RESET SLAVE ALL? channelOption?
+ ;
+
+startSlave
+ : START SLAVE (threadType (',' threadType)*)?
+ (UNTIL untilOption)?
+ connectionOption* channelOption?
+ ;
+
+stopSlave
+ : STOP SLAVE (threadType (',' threadType)*)?
+ ;
+
+startGroupReplication
+ : START GROUP_REPLICATION
+ ;
+
+stopGroupReplication
+ : STOP GROUP_REPLICATION
+ ;
+
+// details
+
+masterOption
+ : stringMasterOption '=' STRING_LITERAL #masterStringOption
+ | decimalMasterOption '=' decimalLiteral #masterDecimalOption
+ | boolMasterOption '=' boolVal=('0' | '1') #masterBoolOption
+ | MASTER_HEARTBEAT_PERIOD '=' REAL_LITERAL #masterRealOption
+ | IGNORE_SERVER_IDS '=' '(' (uid (',' uid)*)? ')' #masterUidListOption
+ ;
+
+stringMasterOption
+ : MASTER_BIND | MASTER_HOST | MASTER_USER | MASTER_PASSWORD
+ | MASTER_LOG_FILE | RELAY_LOG_FILE | MASTER_SSL_CA
+ | MASTER_SSL_CAPATH | MASTER_SSL_CERT | MASTER_SSL_CRL
+ | MASTER_SSL_CRLPATH | MASTER_SSL_KEY | MASTER_SSL_CIPHER
+ | MASTER_TLS_VERSION
+ ;
+decimalMasterOption
+ : MASTER_PORT | MASTER_CONNECT_RETRY | MASTER_RETRY_COUNT
+ | MASTER_DELAY | MASTER_LOG_POS | RELAY_LOG_POS
+ ;
+
+boolMasterOption
+ : MASTER_AUTO_POSITION | MASTER_SSL
+ | MASTER_SSL_VERIFY_SERVER_CERT
+ ;
+
+channelOption
+ : FOR CHANNEL STRING_LITERAL
+ ;
+
+replicationFilter
+ : REPLICATE_DO_DB '=' '(' uidList ')' #doDbReplication
+ | REPLICATE_IGNORE_DB '=' '(' uidList ')' #ignoreDbReplication
+ | REPLICATE_DO_TABLE '=' '(' tables ')' #doTableReplication
+ | REPLICATE_IGNORE_TABLE '=' '(' tables ')' #ignoreTableReplication
+ | REPLICATE_WILD_DO_TABLE '=' '(' simpleStrings ')' #wildDoTableReplication
+ | REPLICATE_WILD_IGNORE_TABLE
+ '=' '(' simpleStrings ')' #wildIgnoreTableReplication
+ | REPLICATE_REWRITE_DB '='
+ '(' tablePair (',' tablePair)* ')' #rewriteDbReplication
+ ;
+
+tablePair
+ : '(' firstTable=tableName ',' secondTable=tableName ')'
+ ;
+
+threadType
+ : IO_THREAD | SQL_THREAD
+ ;
+
+untilOption
+ : gtids=(SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS)
+ '=' gtuidSet #gtidsUntilOption
+ | MASTER_LOG_FILE '=' STRING_LITERAL
+ ',' MASTER_LOG_POS '=' decimalLiteral #masterLogUntilOption
+ | RELAY_LOG_FILE '=' STRING_LITERAL
+ ',' RELAY_LOG_POS '=' decimalLiteral #relayLogUntilOption
+ | SQL_AFTER_MTS_GAPS #sqlGapsUntilOption
+ ;
+
+connectionOption
+ : USER '=' conOptUser=STRING_LITERAL #userConnectionOption
+ | PASSWORD '=' conOptPassword=STRING_LITERAL #passwordConnectionOption
+ | DEFAULT_AUTH '=' conOptDefAuth=STRING_LITERAL #defaultAuthConnectionOption
+ | PLUGIN_DIR '=' conOptPluginDir=STRING_LITERAL #pluginDirConnectionOption
+ ;
+
+gtuidSet
+ : uuidSet (',' uuidSet)*
+ | STRING_LITERAL
+ ;
+
+
+// XA Transactions
+
+xaStartTransaction
+ : XA xaStart=(START | BEGIN) xid xaAction=(JOIN | RESUME)?
+ ;
+
+xaEndTransaction
+ : XA END xid (SUSPEND (FOR MIGRATE)?)?
+ ;
+
+xaPrepareStatement
+ : XA PREPARE xid
+ ;
+
+xaCommitWork
+ : XA COMMIT xid (ONE PHASE)?
+ ;
+
+xaRollbackWork
+ : XA ROLLBACK xid
+ ;
+
+xaRecoverWork
+ : XA RECOVER (CONVERT xid)?
+ ;
+
+
+// Prepared Statements
+
+prepareStatement
+ : PREPARE uid FROM
+ (query=STRING_LITERAL | variable=LOCAL_ID)
+ ;
+
+executeStatement
+ : EXECUTE uid (USING userVariables)?
+ ;
+
+deallocatePrepare
+ : dropFormat=(DEALLOCATE | DROP) PREPARE uid
+ ;
+
+
+// Compound Statements
+
+routineBody
+ : blockStatement | sqlStatement
+ ;
+
+// details
+
+blockStatement
+ : (uid ':')? BEGIN
+ (
+ (declareVariable SEMI)*
+ (declareCondition SEMI)*
+ (declareCursor SEMI)*
+ (declareHandler SEMI)*
+ procedureSqlStatement+
+ )?
+ END uid?
+ ;
+
+caseStatement
+ : CASE (uid | expression)? caseAlternative+
+ (ELSE procedureSqlStatement+)?
+ END CASE
+ ;
+
+ifStatement
+ : IF expression
+ THEN thenStatements+=procedureSqlStatement+
+ elifAlternative*
+ (ELSE elseStatements+=procedureSqlStatement+ )?
+ END IF
+ ;
+
+iterateStatement
+ : ITERATE uid
+ ;
+
+leaveStatement
+ : LEAVE uid
+ ;
+
+loopStatement
+ : (uid ':')?
+ LOOP procedureSqlStatement+
+ END LOOP uid?
+ ;
+
+repeatStatement
+ : (uid ':')?
+ REPEAT procedureSqlStatement+
+ UNTIL expression
+ END REPEAT uid?
+ ;
+
+returnStatement
+ : RETURN expression
+ ;
+
+whileStatement
+ : (uid ':')?
+ WHILE expression
+ DO procedureSqlStatement+
+ END WHILE uid?
+ ;
+
+cursorStatement
+ : CLOSE uid #CloseCursor
+ | FETCH (NEXT? FROM)? uid INTO uidList #FetchCursor
+ | OPEN uid #OpenCursor
+ ;
+
+// details
+
+declareVariable
+ : DECLARE uidList dataType (DEFAULT defaultValue)?
+ ;
+
+declareCondition
+ : DECLARE uid CONDITION FOR
+ ( decimalLiteral | SQLSTATE VALUE? STRING_LITERAL)
+ ;
+
+declareCursor
+ : DECLARE uid CURSOR FOR selectStatement
+ ;
+
+declareHandler
+ : DECLARE handlerAction=(CONTINUE | EXIT | UNDO)
+ HANDLER FOR
+ handlerConditionValue (',' handlerConditionValue)*
+ routineBody
+ ;
+
+handlerConditionValue
+ : decimalLiteral #handlerConditionCode
+ | SQLSTATE VALUE? STRING_LITERAL #handlerConditionState
+ | uid #handlerConditionName
+ | SQLWARNING #handlerConditionWarning
+ | NOT FOUND #handlerConditionNotfound
+ | SQLEXCEPTION #handlerConditionException
+ ;
+
+procedureSqlStatement
+ : (compoundStatement | sqlStatement) SEMI
+ ;
+
+caseAlternative
+ : WHEN (constant | expression)
+ THEN procedureSqlStatement+
+ ;
+
+elifAlternative
+ : ELSEIF expression
+ THEN procedureSqlStatement+
+ ;
+
+// Administration Statements
+
+// Account management statements
+
+alterUser
+ : ALTER USER
+ userSpecification (',' userSpecification)* #alterUserMysqlV56
+ | ALTER USER ifExists?
+ userAuthOption (',' userAuthOption)*
+ (
+ REQUIRE
+ (tlsNone=NONE | tlsOption (AND? tlsOption)* )
+ )?
+ (WITH userResourceOption+)?
+ (userPasswordOption | userLockOption)* #alterUserMysqlV57
+ ;
+
+createUser
+ : CREATE USER userAuthOption (',' userAuthOption)* #createUserMysqlV56
+ | CREATE USER ifNotExists?
+ userAuthOption (',' userAuthOption)*
+ (
+ REQUIRE
+ (tlsNone=NONE | tlsOption (AND? tlsOption)* )
+ )?
+ (WITH userResourceOption+)?
+ (userPasswordOption | userLockOption)* #createUserMysqlV57
+ ;
+
+dropUser
+ : DROP USER ifExists? userName (',' userName)*
+ ;
+
+grantStatement
+ : GRANT privelegeClause (',' privelegeClause)*
+ ON
+ privilegeObject=(TABLE | FUNCTION | PROCEDURE)?
+ privilegeLevel
+ TO userAuthOption (',' userAuthOption)*
+ (
+ REQUIRE
+ (tlsNone=NONE | tlsOption (AND? tlsOption)* )
+ )?
+ (WITH (GRANT OPTION | userResourceOption)* )?
+ ;
+
+grantProxy
+ : GRANT PROXY ON fromFirst=userName
+ TO toFirst=userName (',' toOther+=userName)*
+ (WITH GRANT OPTION)?
+ ;
+
+renameUser
+ : RENAME USER
+ renameUserClause (',' renameUserClause)*
+ ;
+
+revokeStatement
+ : REVOKE privelegeClause (',' privelegeClause)*
+ ON
+ privilegeObject=(TABLE | FUNCTION | PROCEDURE)?
+ privilegeLevel
+ FROM userName (',' userName)* #detailRevoke
+ | REVOKE ALL PRIVILEGES? ',' GRANT OPTION
+ FROM userName (',' userName)* #shortRevoke
+ ;
+
+revokeProxy
+ : REVOKE PROXY ON onUser=userName
+ FROM fromFirst=userName (',' fromOther+=userName)*
+ ;
+
+setPasswordStatement
+ : SET PASSWORD (FOR userName)?
+ '=' ( passwordFunctionClause | STRING_LITERAL)
+ ;
+
+// details
+
+userSpecification
+ : userName userPasswordOption
+ ;
+
+userAuthOption
+ : userName IDENTIFIED BY PASSWORD hashed=STRING_LITERAL #passwordAuthOption
+ | userName
+ IDENTIFIED (WITH authPlugin)? BY STRING_LITERAL #stringAuthOption
+ | userName
+ IDENTIFIED WITH authPlugin
+ (AS STRING_LITERAL)? #hashAuthOption
+ | userName #simpleAuthOption
+ ;
+
+tlsOption
+ : SSL
+ | X509
+ | CIPHER STRING_LITERAL
+ | ISSUER STRING_LITERAL
+ | SUBJECT STRING_LITERAL
+ ;
+
+userResourceOption
+ : MAX_QUERIES_PER_HOUR decimalLiteral
+ | MAX_UPDATES_PER_HOUR decimalLiteral
+ | MAX_CONNECTIONS_PER_HOUR decimalLiteral
+ | MAX_USER_CONNECTIONS decimalLiteral
+ ;
+
+userPasswordOption
+ : PASSWORD EXPIRE
+ (expireType=DEFAULT
+ | expireType=NEVER
+ | expireType=INTERVAL decimalLiteral DAY
+ )?
+ ;
+
+userLockOption
+ : ACCOUNT lockType=(LOCK | UNLOCK)
+ ;
+
+privelegeClause
+ : privilege ( '(' uidList ')' )?
+ ;
+
+privilege
+ : ALL PRIVILEGES?
+ | ALTER ROUTINE?
+ | CREATE
+ (TEMPORARY TABLES | ROUTINE | VIEW | USER | TABLESPACE)?
+ | DELETE | DROP | EVENT | EXECUTE | FILE | GRANT OPTION
+ | INDEX | INSERT | LOCK TABLES | PROCESS | PROXY
+ | REFERENCES | RELOAD
+ | REPLICATION (CLIENT | SLAVE)
+ | SELECT
+ | SHOW (VIEW | DATABASES)
+ | SHUTDOWN | SUPER | TRIGGER | UPDATE | USAGE
+ ;
+
+privilegeLevel
+ : '*' #currentSchemaPriviLevel
+ | '*' '.' '*' #globalPrivLevel
+ | uid '.' '*' #definiteSchemaPrivLevel
+ | uid '.' uid #definiteFullTablePrivLevel
+ | uid #definiteTablePrivLevel
+ ;
+
+renameUserClause
+ : fromFirst=userName TO toFirst=userName
+ ;
+
+// Table maintenance statements
+
+analyzeTable
+ : ANALYZE actionOption=(NO_WRITE_TO_BINLOG | LOCAL)?
+ TABLE tables
+ ;
+
+checkTable
+ : CHECK TABLE tables checkTableOption*
+ ;
+
+checksumTable
+ : CHECKSUM TABLE tables actionOption=(QUICK | EXTENDED)?
+ ;
+
+optimizeTable
+ : OPTIMIZE actionOption=(NO_WRITE_TO_BINLOG | LOCAL)?
+ TABLE tables
+ ;
+
+repairTable
+ : REPAIR actionOption=(NO_WRITE_TO_BINLOG | LOCAL)?
+ TABLE tables
+ QUICK? EXTENDED? USE_FRM?
+ ;
+
+// details
+
+checkTableOption
+ : FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED
+ ;
+
+
+// Plugin and udf statements
+
+createUdfunction
+ : CREATE AGGREGATE? FUNCTION uid
+ RETURNS returnType=(STRING | INTEGER | REAL | DECIMAL)
+ SONAME STRING_LITERAL
+ ;
+
+installPlugin
+ : INSTALL PLUGIN uid SONAME STRING_LITERAL
+ ;
+
+uninstallPlugin
+ : UNINSTALL PLUGIN uid
+ ;
+
+
+// Set and show statements
+
+setStatement
+ : SET variableClause '=' expression
+ (',' variableClause '=' expression)* #setVariable
+ | SET (CHARACTER SET | CHARSET) (charsetName | DEFAULT) #setCharset
+ | SET NAMES
+ (charsetName (COLLATE collationName)? | DEFAULT) #setNames
+ | setPasswordStatement #setPassword
+ | setTransactionStatement #setTransaction
+ | setAutocommitStatement #setAutocommit
+ ;
+
+showStatement
+ : SHOW logFormat=(BINARY | MASTER) LOGS #showMasterLogs
+ | SHOW logFormat=(BINLOG | RELAYLOG)
+ EVENTS (IN filename=STRING_LITERAL)?
+ (FROM fromPosition=decimalLiteral)?
+ (LIMIT
+ (offset=decimalLiteral ',')?
+ rowCount=decimalLiteral
+ )? #showLogEvents
+ | SHOW showCommonEntity showFilter? #showObjectFilter
+ | SHOW FULL? columnsFormat=(COLUMNS | FIELDS)
+ tableFormat=(FROM | IN) tableName
+ (schemaFormat=(FROM | IN) uid)? showFilter? #showColumns
+ | SHOW CREATE schemaFormat=(DATABASE | SCHEMA)
+ ifNotExists? uid #showCreateDb
+ | SHOW CREATE
+ namedEntity=(
+ EVENT | FUNCTION | PROCEDURE
+ | TABLE | TRIGGER | VIEW
+ )
+ fullId #showCreateFullIdObject
+ | SHOW CREATE USER userName #showCreateUser
+ | SHOW ENGINE engineName engineOption=(STATUS | MUTEX) #showEngine
+ | SHOW showGlobalInfoClause #showGlobalInfo
+ | SHOW errorFormat=(ERRORS | WARNINGS)
+ (LIMIT
+ (offset=decimalLiteral ',')?
+ rowCount=decimalLiteral
+ ) #showErrors
+ | SHOW COUNT '(' '*' ')' errorFormat=(ERRORS | WARNINGS) #showCountErrors
+ | SHOW showSchemaEntity
+ (schemaFormat=(FROM | IN) uid)? showFilter? #showSchemaFilter
+ | SHOW routine=(FUNCTION | PROCEDURE) CODE fullId #showRoutine
+ | SHOW GRANTS (FOR userName)? #showGrants
+ | SHOW indexFormat=(INDEX | INDEXES | KEYS)
+ tableFormat=(FROM | IN) tableName
+ (schemaFormat=(FROM | IN) uid)? (WHERE expression)? #showIndexes
+ | SHOW OPEN TABLES ( schemaFormat=(FROM | IN) uid)?
+ showFilter? #showOpenTables
+ | SHOW PROFILE showProfileType (',' showProfileType)*
+ (FOR QUERY queryCount=decimalLiteral)?
+ (LIMIT
+ (offset=decimalLiteral ',')?
+ rowCount=decimalLiteral
+ ) #showProfile
+ | SHOW SLAVE STATUS (FOR CHANNEL STRING_LITERAL)? #showSlaveStatus
+ ;
+
+// details
+
+variableClause
+ : LOCAL_ID | GLOBAL_ID | ( ('@' '@')? (GLOBAL | SESSION) )? uid
+ ;
+
+showCommonEntity
+ : CHARACTER SET | COLLATION | DATABASES | SCHEMAS
+ | FUNCTION STATUS | PROCEDURE STATUS
+ | (GLOBAL | SESSION)? (STATUS | VARIABLES)
+ ;
+
+showFilter
+ : LIKE STRING_LITERAL
+ | WHERE expression
+ ;
+
+showGlobalInfoClause
+ : STORAGE? ENGINES | MASTER STATUS | PLUGINS
+ | PRIVILEGES | FULL? PROCESSLIST | PROFILES
+ | SLAVE HOSTS | AUTHORS | CONTRIBUTORS
+ ;
+
+showSchemaEntity
+ : EVENTS | TABLE STATUS | FULL? TABLES | TRIGGERS
+ ;
+
+showProfileType
+ : ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY
+ | PAGE FAULTS | SOURCE | SWAPS
+ ;
+
+
+// Other administrative statements
+
+binlogStatement
+ : BINLOG STRING_LITERAL
+ ;
+
+cacheIndexStatement
+ : CACHE INDEX tableIndexes (',' tableIndexes)*
+ ( PARTITION '(' (uidList | ALL) ')' )?
+ IN schema=uid
+ ;
+
+flushStatement
+ : FLUSH flushFormat=(NO_WRITE_TO_BINLOG | LOCAL)?
+ flushOption (',' flushOption)*
+ ;
+
+killStatement
+ : KILL connectionFormat=(CONNECTION | QUERY)?
+ decimalLiteral+
+ ;
+
+loadIndexIntoCache
+ : LOAD INDEX INTO CACHE
+ loadedTableIndexes (',' loadedTableIndexes)*
+ ;
+
+// remark reset (maser | slave) describe in replication's
+// statements section
+resetStatement
+ : RESET QUERY CACHE
+ ;
+
+shutdownStatement
+ : SHUTDOWN
+ ;
+
+// details
+
+tableIndexes
+ : tableName ( indexFormat=(INDEX | KEY)? '(' uidList ')' )?
+ ;
+
+flushOption
+ : (
+ DES_KEY_FILE | HOSTS
+ | (
+ BINARY | ENGINE | ERROR | GENERAL | RELAY | SLOW
+ )? LOGS
+ | OPTIMIZER_COSTS | PRIVILEGES | QUERY CACHE | STATUS
+ | USER_RESOURCES | TABLES (WITH READ LOCK)?
+ ) #simpleFlushOption
+ | RELAY LOGS channelOption? #channelFlushOption
+ | TABLES tables flushTableOption? #tableFlushOption
+ ;
+
+flushTableOption
+ : WITH READ LOCK
+ | FOR EXPORT
+ ;
+
+loadedTableIndexes
+ : tableName
+ ( PARTITION '(' (partitionList=uidList | ALL) ')' )?
+ ( indexFormat=(INDEX | KEY)? '(' indexList=uidList ')' )?
+ (IGNORE LEAVES)?
+ ;
+
+
+// Utility Statements
+
+
+simpleDescribeStatement
+ : command=(EXPLAIN | DESCRIBE | DESC) tableName
+ (column=uid | pattern=STRING_LITERAL)?
+ ;
+
+fullDescribeStatement
+ : command=(EXPLAIN | DESCRIBE | DESC)
+ (
+ formatType=(EXTENDED | PARTITIONS | FORMAT )
+ '='
+ formatValue=(TRADITIONAL | JSON)
+ )?
+ describeObjectClause
+ ;
+
+helpStatement
+ : HELP STRING_LITERAL
+ ;
+
+useStatement
+ : USE uid
+ ;
+
+// details
+
+describeObjectClause
+ : (
+ selectStatement | deleteStatement | insertStatement
+ | replaceStatement | updateStatement
+ ) #describeStatements
+ | FOR CONNECTION uid #describeConnection
+ ;
+
+
+// Common Clauses
+
+// DB Objects
+
+fullId
+ : uid (DOT_ID | '.' uid)?
+ ;
+
+tableName
+ : fullId
+ ;
+
+fullColumnName
+ : uid (dottedId dottedId? )?
+ ;
+
+indexColumnName
+ : uid ('(' decimalLiteral ')')? sortType=(ASC | DESC)?
+ ;
+
+userName
+ : STRING_USER_NAME | ID;
+
+mysqlVariable
+ : LOCAL_ID
+ | GLOBAL_ID
+ ;
+
+charsetName
+ : BINARY
+ | charsetNameBase
+ | STRING_LITERAL
+ | CHARSET_REVERSE_QOUTE_STRING
+ ;
+
+collationName
+ : uid | STRING_LITERAL;
+
+engineName
+ : ARCHIVE | BLACKHOLE | CSV | FEDERATED | INNODB | MEMORY
+ | MRG_MYISAM | MYISAM | NDB | NDBCLUSTER | PERFOMANCE_SCHEMA
+ ;
+
+uuidSet
+ : decimalLiteral '-' decimalLiteral '-' decimalLiteral
+ '-' decimalLiteral '-' decimalLiteral
+ (':' decimalLiteral '-' decimalLiteral)+
+ ;
+
+xid
+ : globalTableUid=xuidStringId
+ (
+ ',' qualifier=xuidStringId
+ (',' idFormat=decimalLiteral)?
+ )?
+ ;
+
+xuidStringId
+ : STRING_LITERAL
+ | BIT_STRING
+ | HEXADECIMAL_LITERAL+
+ ;
+
+authPlugin
+ : uid | STRING_LITERAL
+ ;
+
+uid
+ : simpleId
+ //| DOUBLE_QUOTE_ID
+ | REVERSE_QUOTE_ID
+ | CHARSET_REVERSE_QOUTE_STRING
+ ;
+
+simpleId
+ : ID
+ | charsetNameBase
+ | transactionLevelBase
+ | engineName
+ | privilegesBase
+ | intervalTypeBase
+ | dataTypeBase
+ | keywordsCanBeId
+ | functionNameBase
+ ;
+
+dottedId
+ : DOT_ID
+ | '.' uid
+ ;
+
+
+// Literals
+
+decimalLiteral
+ : DECIMAL_LITERAL | ZERO_DECIMAL | ONE_DECIMAL | TWO_DECIMAL
+ ;
+
+fileSizeLiteral
+ : FILESIZE_LITERAL | decimalLiteral;
+
+stringLiteral
+ : (
+ STRING_CHARSET_NAME? STRING_LITERAL
+ | START_NATIONAL_STRING_LITERAL
+ ) STRING_LITERAL+
+ | (
+ STRING_CHARSET_NAME? STRING_LITERAL
+ | START_NATIONAL_STRING_LITERAL
+ ) (COLLATE collationName)?
+ ;
+
+booleanLiteral
+ : TRUE | FALSE;
+
+hexadecimalLiteral
+ : STRING_CHARSET_NAME? HEXADECIMAL_LITERAL;
+
+nullNotnull
+ : NOT? (NULL_LITERAL | NULL_SPEC_LITERAL)
+ ;
+
+constant
+ : stringLiteral | decimalLiteral
+ | hexadecimalLiteral | booleanLiteral
+ | REAL_LITERAL | BIT_STRING
+ | NOT? nullLiteral=(NULL_LITERAL | NULL_SPEC_LITERAL)
+ ;
+
+
+// Data Types
+
+dataType
+ : typeName=(
+ CHAR | VARCHAR | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT
+ )
+ lengthOneDimension? BINARY?
+ (CHARACTER SET charsetName)? (COLLATE collationName)? #stringDataType
+ | typeName=(
+ TINYINT | SMALLINT | MEDIUMINT | INT | INTEGER | BIGINT
+ )
+ lengthOneDimension? UNSIGNED? ZEROFILL? #dimensionDataType
+ | typeName=(REAL | DOUBLE | FLOAT)
+ lengthTwoDimension? UNSIGNED? ZEROFILL? #dimensionDataType
+ | typeName=(DECIMAL | NUMERIC)
+ lengthTwoOptionalDimension? UNSIGNED? ZEROFILL? #dimensionDataType
+ | typeName=(
+ DATE | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB
+ | BOOL | BOOLEAN
+ ) #simpleDataType
+ | typeName=(
+ BIT | TIME | TIMESTAMP | DATETIME | BINARY
+ | VARBINARY | YEAR
+ )
+ lengthOneDimension? #dimensionDataType
+ | typeName=(ENUM | SET)
+ '(' STRING_LITERAL (',' STRING_LITERAL)* ')' BINARY?
+ (CHARACTER SET charsetName)? (COLLATE collationName)? #collectionDataType
+ | typeName=(
+ GEOMETRYCOLLECTION | LINESTRING | MULTILINESTRING
+ | MULTIPOINT | MULTIPOLYGON | POINT | POLYGON
+ ) #spatialDataType
+ ;
+
+convertedDataType
+ : typeName=(BINARY| NCHAR) lengthOneDimension?
+ | typeName=CHAR lengthOneDimension? (CHARACTER SET charsetName)?
+ | typeName=(DATE | DATETIME | TIME)
+ | typeName=DECIMAL lengthTwoDimension?
+ | (SIGNED | UNSIGNED) INTEGER?
+ ;
+
+lengthOneDimension
+ : '(' decimalLiteral ')'
+ ;
+
+lengthTwoDimension
+ : '(' decimalLiteral ',' decimalLiteral ')'
+ ;
+
+lengthTwoOptionalDimension
+ : '(' decimalLiteral (',' decimalLiteral)? ')'
+ ;
+
+
+// Common Lists
+
+uidList
+ : uid (',' uid)*
+ ;
+
+tables
+ : tableName (',' tableName)*
+ ;
+
+indexColumnNames
+ : '(' indexColumnName (',' indexColumnName)* ')'
+ ;
+
+expressions
+ : expression (',' expression)*
+ ;
+
+expressionsWithDefaults
+ : expressionOrDefault (',' expressionOrDefault)*
+ ;
+
+constants
+ : constant (',' constant)*
+ ;
+
+simpleStrings
+ : STRING_LITERAL (',' STRING_LITERAL)*
+ ;
+
+userVariables
+ : LOCAL_ID (',' LOCAL_ID)*
+ ;
+
+
+// Common Expressons
+
+defaultValue
+ : NULL_LITERAL
+ | constant
+ | CURRENT_TIMESTAMP (ON UPDATE LOCALTIMESTAMP)?
+ ;
+
+expressionOrDefault
+ : expression | DEFAULT
+ ;
+
+ifExists
+ : IF EXISTS;
+
+ifNotExists
+ : IF NOT EXISTS;
+
+
+// Functions
+
+functionCall
+ : specificFunction #specificFunctionCall
+ | aggregateWindowedFunction #aggregateFunctionCall
+ | scalarFunctionName '(' functionArgs? ')' #scalarFunctionCall
+ | fullId '(' functionArgs? ')' #udfFunctionCall
+ | passwordFunctionClause #passwordFunctionCall
+ ;
+
+specificFunction
+ : (
+ CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP
+ | CURRENT_USER | LOCALTIME
+ ) #simpleFunctionCall
+ | CONVERT '(' expression separator=',' convertedDataType ')' #dataTypeFunctionCall
+ | CONVERT '(' expression USING charsetName ')' #dataTypeFunctionCall
+ | CAST '(' expression AS convertedDataType ')' #dataTypeFunctionCall
+ | VALUES '(' fullColumnName ')' #valuesFunctionCall
+ | CASE expression caseFuncAlternative+
+ (ELSE elseArg=functionArg)? END #caseFunctionCall
+ | CASE caseFuncAlternative+
+ (ELSE elseArg=functionArg)? END #caseFunctionCall
+ | CHAR '(' functionArgs (USING charsetName)? ')' #charFunctionCall
+ | POSITION
+ '('
+ (
+ positionString=stringLiteral
+ | positionExpression=expression
+ )
+ IN
+ (
+ inString=stringLiteral
+ | inExpression=expression
+ )
+ ')' #positionFunctionCall
+ | (SUBSTR | SUBSTRING)
+ '('
+ (
+ sourceString=stringLiteral
+ | sourceExpression=expression
+ ) FROM
+ (
+ fromDecimal=decimalLiteral
+ | fromExpression=expression
+ )
+ (
+ FOR
+ (
+ forDecimal=decimalLiteral
+ | forExpression=expression
+ )
+ )?
+ ')' #substrFunctionCall
+ | TRIM
+ '('
+ positioinForm=(BOTH | LEADING | TRAILING)
+ (
+ sourceString=stringLiteral
+ | sourceExpression=expression
+ )?
+ FROM
+ (
+ fromString=stringLiteral
+ | fromExpression=expression
+ )
+ ')' #trimFunctionCall
+ | TRIM
+ '('
+ (
+ sourceString=stringLiteral
+ | sourceExpression=expression
+ )
+ FROM
+ (
+ fromString=stringLiteral
+ | fromExpression=expression
+ )
+ ')' #trimFunctionCall
+ | WEIGHT_STRING
+ '('
+ (stringLiteral | expression)
+ (AS stringFormat=(CHAR | BINARY)
+ '(' decimalLiteral ')' )? levelsInWeightString?
+ ')' #weightFunctionCall
+ | EXTRACT
+ '('
+ intervalType
+ FROM
+ (
+ sourceString=stringLiteral
+ | sourceExpression=expression
+ )
+ ')' #extractFunctionCall
+ | GET_FORMAT
+ '('
+ datetimeFormat=(DATE | TIME | DATETIME)
+ ',' stringLiteral
+ ')' #getFormatFunctionCall
+ ;
+
+caseFuncAlternative
+ : WHEN condition=functionArg
+ THEN consequent=functionArg
+ ;
+
+levelsInWeightString
+ : LEVEL levelInWeightListElement
+ (',' levelInWeightListElement)* #levelWeightList
+ | LEVEL
+ firstLevel=decimalLiteral '-' lastLevel=decimalLiteral #levelWeightRange
+ ;
+
+levelInWeightListElement
+ : decimalLiteral orderType=(ASC | DESC | REVERSE)?
+ ;
+
+aggregateWindowedFunction
+ : (AVG | MAX | MIN | SUM)
+ '(' aggregator=(ALL | DISTINCT)? functionArg ')'
+ | COUNT '(' (starArg='*' | aggregator=ALL? functionArg) ')'
+ | COUNT '(' aggregator=DISTINCT functionArgs ')'
+ | (
+ BIT_AND | BIT_OR | BIT_XOR | STD | STDDEV | STDDEV_POP
+ | STDDEV_SAMP | VAR_POP | VAR_SAMP | VARIANCE
+ ) '(' aggregator=ALL? functionArg ')'
+ | GROUP_CONCAT '('
+ aggregator=DISTINCT? functionArgs
+ (ORDER BY
+ orderByExpression (',' orderByExpression)*
+ )? (SEPARATOR separator=STRING_LITERAL)?
+ ')'
+ ;
+
+scalarFunctionName
+ : functionNameBase
+ | ASCII | CURDATE | CURRENT_DATE | CURRENT_TIME
+ | CURRENT_TIMESTAMP | CURTIME | DATE_ADD | DATE_SUB
+ | IF | INSERT | LOCALTIME | LOCALTIMESTAMP | MID | NOW
+ | REPLACE | SUBSTR | SUBSTRING | SYSDATE | TRIM
+ | UTC_DATE | UTC_TIME | UTC_TIMESTAMP
+ ;
+
+passwordFunctionClause
+ : functionName=(PASSWORD | OLD_PASSWORD) '(' functionArg ')'
+ ;
+
+functionArgs
+ : (constant | fullColumnName | functionCall | expression)
+ (
+ ','
+ (constant | fullColumnName | functionCall | expression)
+ )*
+ ;
+
+functionArg
+ : constant | fullColumnName | functionCall | expression
+ ;
+
+
+// Expressions, predicates
+
+// Simplified approach for expression
+expression
+ : notOperator=(NOT | '!') expression #notExpression
+ | expression logicalOperator expression #logicalExpression
+ | predicate IS NOT? testValue=(TRUE | FALSE | UNKNOWN) #isExpression
+ | predicate #predicateExpression
+ ;
+
+predicate
+ : predicate NOT? IN '(' (selectStatement | expressions) ')' #inPredicate
+ | predicate IS nullNotnull #isNullPredicate
+ | left=predicate comparisonOperator right=predicate #binaryComparasionPredicate
+ | predicate comparisonOperator
+ quantifier=(ALL | ANY | SOME) '(' selectStatement ')' #subqueryComparasionPredicate
+ | predicate NOT? BETWEEN predicate AND predicate #betweenPredicate
+ | predicate SOUNDS LIKE predicate #soundsLikePredicate
+ | predicate NOT? LIKE predicate (ESCAPE STRING_LITERAL)? #likePredicate
+ | predicate NOT? regex=(REGEXP | RLIKE) predicate #regexpPredicate
+ | (LOCAL_ID VAR_ASSIGN)? expressionAtom #expressionAtomPredicate
+ ;
+
+
+// Add in ASTVisitor nullNotnull in constant
+expressionAtom
+ : constant #constantExpressionAtom
+ | fullColumnName #fullColumnNameExpressionAtom
+ | functionCall #functionCallExpressionAtom
+ | expressionAtom COLLATE collationName #collateExpressionAtom
+ | mysqlVariable #mysqlVariableExpressionAtom
+ | unaryOperator expressionAtom #unaryExpressionAtom
+ | BINARY expressionAtom #binaryExpressionAtom
+ | '(' expression (',' expression)* ')' #nestedExpressionAtom
+ | ROW '(' expression (',' expression)+ ')' #nestedRowExpressionAtom
+ | EXISTS '(' selectStatement ')' #existsExpessionAtom
+ | '(' selectStatement ')' #subqueryExpessionAtom
+ | INTERVAL expression intervalType #intervalExpressionAtom
+ | left=expressionAtom bitOperator right=expressionAtom #bitExpressionAtom
+ | left=expressionAtom mathOperator right=expressionAtom #mathExpressionAtom
+ ;
+
+unaryOperator
+ : '!' | '~' | '+' | '-' | NOT
+ ;
+
+comparisonOperator
+ : '=' | '>' | '<' | '<' '=' | '>' '='
+ | '<' '>' | '!' '=' | '<' '=' '>'
+ ;
+
+logicalOperator
+ : AND | '&' '&' | XOR | OR | '|' '|'
+ ;
+
+bitOperator
+ : '<' '<' | '>' '>' | '&' | '^' | '|'
+ ;
+
+mathOperator
+ : '*' | '/' | '%' | DIV | MOD | '+' | '-' | '--'
+ ;
+
+
+// Simple id sets
+// (that keyword, which can be id)
+
+charsetNameBase
+ : ARMSCII8 | ASCII | BIG5 | CP1250 | CP1251 | CP1256 | CP1257
+ | CP850 | CP852 | CP866 | CP932 | DEC8 | EUCJPMS | EUCKR
+ | GB2312 | GBK | GEOSTD8 | GREEK | HEBREW | HP8 | KEYBCS2
+ | KOI8R | KOI8U | LATIN1 | LATIN2 | LATIN5 | LATIN7 | MACCE
+ | MACROMAN | SJIS | SWE7 | TIS620 | UCS2 | UJIS | UTF16
+ | UTF16LE | UTF32 | UTF8 | UTF8MB3 | UTF8MB4
+ ;
+
+transactionLevelBase
+ : REPEATABLE | COMMITTED | UNCOMMITTED | SERIALIZABLE
+ ;
+
+privilegesBase
+ : TABLES | ROUTINE | EXECUTE | FILE | PROCESS
+ | RELOAD | SHUTDOWN | SUPER | PRIVILEGES
+ ;
+
+intervalTypeBase
+ : QUARTER | MONTH | DAY | HOUR
+ | MINUTE | WEEK | SECOND | MICROSECOND
+ ;
+
+dataTypeBase
+ : DATE | TIME | TIMESTAMP | DATETIME | YEAR | ENUM | TEXT
+ ;
+
+keywordsCanBeId
+ : ACCOUNT | ACTION | AFTER | AGGREGATE | ALGORITHM | ANY
+ | AT | AUTHORS | AUTOCOMMIT | AUTOEXTEND_SIZE
+ | AUTO_INCREMENT | AVG_ROW_LENGTH | BEGIN | BINLOG | BIT
+ | BLOCK | BOOL | BOOLEAN | BTREE | CASCADED | CHAIN
+ | CHANNEL | CHECKSUM | CIPHER | CLIENT | COALESCE | CODE
+ | COLUMNS | COLUMN_FORMAT | COMMENT | COMMIT | COMPACT
+ | COMPLETION | COMPRESSED | COMPRESSION | CONCURRENT
+ | CONNECTION | CONSISTENT | CONTAINS | CONTEXT
+ | CONTRIBUTORS | COPY | CPU | DATA | DATAFILE | DEALLOCATE
+ | DEFAULT_AUTH | DEFINER | DELAY_KEY_WRITE | DIRECTORY
+ | DISABLE | DISCARD | DISK | DO | DUMPFILE | DUPLICATE
+ | DYNAMIC | ENABLE | ENCRYPTION | ENDS | ENGINE | ENGINES
+ | ERROR | ERRORS | ESCAPE | EVEN | EVENT | EVENTS | EVERY
+ | EXCHANGE | EXCLUSIVE | EXPIRE | EXTENT_SIZE | FAULTS
+ | FIELDS | FILE_BLOCK_SIZE | FILTER | FIRST | FIXED
+ | FOLLOWS | FULL | FUNCTION | GLOBAL | GRANTS
+ | GROUP_REPLICATION | HASH | HOST | IDENTIFIED
+ | IGNORE_SERVER_IDS | IMPORT | INDEXES | INITIAL_SIZE
+ | INPLACE | INSERT_METHOD | INSTANCE | INVOKER | IO
+ | IO_THREAD | IPC | ISOLATION | ISSUER | KEY_BLOCK_SIZE
+ | LANGUAGE | LAST | LEAVES | LESS | LEVEL | LIST | LOCAL
+ | LOGFILE | LOGS | MASTER | MASTER_AUTO_POSITION
+ | MASTER_CONNECT_RETRY | MASTER_DELAY
+ | MASTER_HEARTBEAT_PERIOD | MASTER_HOST | MASTER_LOG_FILE
+ | MASTER_LOG_POS | MASTER_PASSWORD | MASTER_PORT
+ | MASTER_RETRY_COUNT | MASTER_SSL | MASTER_SSL_CA
+ | MASTER_SSL_CAPATH | MASTER_SSL_CERT | MASTER_SSL_CIPHER
+ | MASTER_SSL_CRL | MASTER_SSL_CRLPATH | MASTER_SSL_KEY
+ | MASTER_TLS_VERSION | MASTER_USER
+ | MAX_CONNECTIONS_PER_HOUR | MAX_QUERIES_PER_HOUR
+ | MAX_ROWS | MAX_SIZE | MAX_UPDATES_PER_HOUR
+ | MAX_USER_CONNECTIONS | MEMORY | MERGE | MID | MIGRATE
+ | MIN_ROWS | MODIFY | MUTEX | MYSQL | NAME | NAMES
+ | NCHAR | NEVER | NO | NODEGROUP | NONE | OFFLINE | OFFSET
+ | OJ | OLD_PASSWORD | ONE | ONLINE | ONLY | OPTIMIZER_COSTS
+ | OPTIONS | OWNER | PACK_KEYS | PAGE | PARSER | PARTIAL
+ | PARTITIONING | PARTITIONS | PASSWORD | PHASE | PLUGINS
+ | PLUGIN_DIR | PORT | PRECEDES | PREPARE | PRESERVE | PREV
+ | PROCESSLIST | PROFILE | PROFILES | PROXY | QUERY | QUICK
+ | REBUILD | RECOVER | REDO_BUFFER_SIZE | REDUNDANT
+ | RELAYLOG | RELAY_LOG_FILE | RELAY_LOG_POS | REMOVE
+ | REORGANIZE | REPAIR | REPLICATE_DO_DB | REPLICATE_DO_TABLE
+ | REPLICATE_IGNORE_DB | REPLICATE_IGNORE_TABLE
+ | REPLICATE_REWRITE_DB | REPLICATE_WILD_DO_TABLE
+ | REPLICATE_WILD_IGNORE_TABLE | REPLICATION | RESUME
+ | RETURNS | ROLLBACK | ROLLUP | ROTATE | ROW | ROWS
+ | ROW_FORMAT | SAVEPOINT | SCHEDULE | SECURITY | SERVER
+ | SESSION | SHARE | SHARED | SIGNED | SIMPLE | SLAVE
+ | SNAPSHOT | SOCKET | SOME | SOUNDS | SOURCE
+ | SQL_AFTER_GTIDS | SQL_AFTER_MTS_GAPS | SQL_BEFORE_GTIDS
+ | SQL_BUFFER_RESULT | SQL_CACHE | SQL_NO_CACHE | SQL_THREAD
+ | START | STARTS | STATS_AUTO_RECALC | STATS_PERSISTENT
+ | STATS_SAMPLE_PAGES | STATUS | STOP | STORAGE | STRING
+ | SUBJECT | SUBPARTITION | SUBPARTITIONS | SUSPEND | SWAPS
+ | SWITCHES | TABLESPACE | TEMPORARY | TEMPTABLE | THAN
+ | TRANSACTION | TRUNCATE | UNDEFINED | UNDOFILE
+ | UNDO_BUFFER_SIZE | UNKNOWN | UPGRADE | USER | VALIDATION
+ | VALUE | VARIABLES | VIEW | WAIT | WARNINGS | WITHOUT
+ | WORK | WRAPPER | X509 | XA | XML
+ ;
+
+functionNameBase
+ : ABS | ACOS | ADDDATE | ADDTIME | AES_DECRYPT | AES_ENCRYPT
+ | AREA | ASBINARY | ASIN | ASTEXT | ASWKB | ASWKT
+ | ASYMMETRIC_DECRYPT | ASYMMETRIC_DERIVE
+ | ASYMMETRIC_ENCRYPT | ASYMMETRIC_SIGN | ASYMMETRIC_VERIFY
+ | ATAN | ATAN2 | BENCHMARK | BIN | BIT_COUNT | BIT_LENGTH
+ | BUFFER | CEIL | CEILING | CENTROID | CHARACTER_LENGTH
+ | CHARSET | CHAR_LENGTH | COERCIBILITY | COLLATION
+ | COMPRESS | CONCAT | CONCAT_WS | CONNECTION_ID | CONV
+ | CONVERT_TZ | COS | COT | COUNT | CRC32
+ | CREATE_ASYMMETRIC_PRIV_KEY | CREATE_ASYMMETRIC_PUB_KEY
+ | CREATE_DH_PARAMETERS | CREATE_DIGEST | CROSSES | DATE
+ | DATEDIFF | DATE_FORMAT | DAY | DAYNAME | DAYOFMONTH
+ | DAYOFWEEK | DAYOFYEAR | DECODE | DEGREES | DES_DECRYPT
+ | DES_ENCRYPT | DIMENSION | DISJOINT | ELT | ENCODE
+ | ENCRYPT | ENDPOINT | ENVELOPE | EQUALS | EXP | EXPORT_SET
+ | EXTERIORRING | EXTRACTVALUE | FIELD | FIND_IN_SET | FLOOR
+ | FORMAT | FOUND_ROWS | FROM_BASE64 | FROM_DAYS
+ | FROM_UNIXTIME | GEOMCOLLFROMTEXT | GEOMCOLLFROMWKB
+ | GEOMETRYCOLLECTION | GEOMETRYCOLLECTIONFROMTEXT
+ | GEOMETRYCOLLECTIONFROMWKB | GEOMETRYFROMTEXT
+ | GEOMETRYFROMWKB | GEOMETRYN | GEOMETRYTYPE | GEOMFROMTEXT
+ | GEOMFROMWKB | GET_FORMAT | GET_LOCK | GLENGTH | GREATEST
+ | GTID_SUBSET | GTID_SUBTRACT | HEX | HOUR | IFNULL
+ | INET6_ATON | INET6_NTOA | INET_ATON | INET_NTOA | INSTR
+ | INTERIORRINGN | INTERSECTS | ISCLOSED | ISEMPTY | ISNULL
+ | ISSIMPLE | IS_FREE_LOCK | IS_IPV4 | IS_IPV4_COMPAT
+ | IS_IPV4_MAPPED | IS_IPV6 | IS_USED_LOCK | LAST_INSERT_ID
+ | LCASE | LEAST | LEFT | LENGTH | LINEFROMTEXT | LINEFROMWKB
+ | LINESTRING | LINESTRINGFROMTEXT | LINESTRINGFROMWKB | LN
+ | LOAD_FILE | LOCATE | LOG | LOG10 | LOG2 | LOWER | LPAD
+ | LTRIM | MAKEDATE | MAKETIME | MAKE_SET | MASTER_POS_WAIT
+ | MBRCONTAINS | MBRDISJOINT | MBREQUAL | MBRINTERSECTS
+ | MBROVERLAPS | MBRTOUCHES | MBRWITHIN | MD5 | MICROSECOND
+ | MINUTE | MLINEFROMTEXT | MLINEFROMWKB | MONTH | MONTHNAME
+ | MPOINTFROMTEXT | MPOINTFROMWKB | MPOLYFROMTEXT
+ | MPOLYFROMWKB | MULTILINESTRING | MULTILINESTRINGFROMTEXT
+ | MULTILINESTRINGFROMWKB | MULTIPOINT | MULTIPOINTFROMTEXT
+ | MULTIPOINTFROMWKB | MULTIPOLYGON | MULTIPOLYGONFROMTEXT
+ | MULTIPOLYGONFROMWKB | NAME_CONST | NULLIF | NUMGEOMETRIES
+ | NUMINTERIORRINGS | NUMPOINTS | OCT | OCTET_LENGTH | ORD
+ | OVERLAPS | PERIOD_ADD | PERIOD_DIFF | PI | POINT
+ | POINTFROMTEXT | POINTFROMWKB | POINTN | POLYFROMTEXT
+ | POLYFROMWKB | POLYGON | POLYGONFROMTEXT | POLYGONFROMWKB
+ | POSITION| POW | POWER | QUARTER | QUOTE | RADIANS | RAND
+ | RANDOM_BYTES | RELEASE_LOCK | REVERSE | RIGHT | ROUND
+ | ROW_COUNT | RPAD | RTRIM | SECOND | SEC_TO_TIME
+ | SESSION_USER | SHA | SHA1 | SHA2 | SIGN | SIN | SLEEP
+ | SOUNDEX | SQL_THREAD_WAIT_AFTER_GTIDS | SQRT | SRID
+ | STARTPOINT | STRCMP | STR_TO_DATE | ST_AREA | ST_ASBINARY
+ | ST_ASTEXT | ST_ASWKB | ST_ASWKT | ST_BUFFER | ST_CENTROID
+ | ST_CONTAINS | ST_CROSSES | ST_DIFFERENCE | ST_DIMENSION
+ | ST_DISJOINT | ST_DISTANCE | ST_ENDPOINT | ST_ENVELOPE
+ | ST_EQUALS | ST_EXTERIORRING | ST_GEOMCOLLFROMTEXT
+ | ST_GEOMCOLLFROMTXT | ST_GEOMCOLLFROMWKB
+ | ST_GEOMETRYCOLLECTIONFROMTEXT
+ | ST_GEOMETRYCOLLECTIONFROMWKB | ST_GEOMETRYFROMTEXT
+ | ST_GEOMETRYFROMWKB | ST_GEOMETRYN | ST_GEOMETRYTYPE
+ | ST_GEOMFROMTEXT | ST_GEOMFROMWKB | ST_INTERIORRINGN
+ | ST_INTERSECTION | ST_INTERSECTS | ST_ISCLOSED | ST_ISEMPTY
+ | ST_ISSIMPLE | ST_LINEFROMTEXT | ST_LINEFROMWKB
+ | ST_LINESTRINGFROMTEXT | ST_LINESTRINGFROMWKB
+ | ST_NUMGEOMETRIES | ST_NUMINTERIORRING
+ | ST_NUMINTERIORRINGS | ST_NUMPOINTS | ST_OVERLAPS
+ | ST_POINTFROMTEXT | ST_POINTFROMWKB | ST_POINTN
+ | ST_POLYFROMTEXT | ST_POLYFROMWKB | ST_POLYGONFROMTEXT
+ | ST_POLYGONFROMWKB | ST_SRID | ST_STARTPOINT
+ | ST_SYMDIFFERENCE | ST_TOUCHES | ST_UNION | ST_WITHIN
+ | ST_X | ST_Y | SUBDATE | SUBSTRING_INDEX | SUBTIME
+ | SYSTEM_USER | TAN | TIME | TIMEDIFF | TIMESTAMP
+ | TIMESTAMPADD | TIMESTAMPDIFF | TIME_FORMAT | TIME_TO_SEC
+ | TOUCHES | TO_BASE64 | TO_DAYS | TO_SECONDS | UCASE
+ | UNCOMPRESS | UNCOMPRESSED_LENGTH | UNHEX | UNIX_TIMESTAMP
+ | UPDATEXML | UPPER | UUID | UUID_SHORT
+ | VALIDATE_PASSWORD_STRENGTH | VERSION
+ | WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS | WEEK | WEEKDAY
+ | WEEKOFYEAR | WEIGHT_STRING | WITHIN | YEAR | YEARWEEK
+ | Y_FUNCTION | X_FUNCTION
+ ;
diff --git a/support/checkstyle/src/main/resources/checkstyle-suppressions.xml b/support/checkstyle/src/main/resources/checkstyle-suppressions.xml
index 3f54e9d94..f1ed2eb81 100644
--- a/support/checkstyle/src/main/resources/checkstyle-suppressions.xml
+++ b/support/checkstyle/src/main/resources/checkstyle-suppressions.xml
@@ -10,4 +10,6 @@
+
+
\ No newline at end of file