DBZ-252 Create new debezium-ddl-parser module

This commit is contained in:
rkuchar 2018-03-08 19:12:42 +01:00 committed by Gunnar Morling
parent 785c346bcb
commit 1df0b2033c
10 changed files with 3809 additions and 1221 deletions

View File

@ -16,6 +16,10 @@
<groupId>io.debezium</groupId>
<artifactId>debezium-core</artifactId>
</dependency>
<dependency>
<groupId>io.debezium</groupId>
<artifactId>debezium-ddl-parser</artifactId>
</dependency>
<dependency>
<groupId>com.github.shyiko</groupId>
<artifactId>mysql-binlog-connector-java</artifactId>
@ -39,11 +43,6 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>${antlr.version}</version>
</dependency>
<!-- Testing -->
<dependency>
@ -110,9 +109,6 @@
<docker.skip>false</docker.skip>
<docker.initimage>ln -s /usr/share/zoneinfo/US/Samoa /etc/localtime</docker.initimage>
<!-- ANTLR properties -->
<antlr.version>4.7</antlr.version>
<antlr.source.dir>${project.basedir}/src/main/resources/antlr4</antlr.source.dir>
</properties>
<build>
<plugins>
@ -342,21 +338,6 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>${antlr.version}</version>
<configuration>
<sourceDirectory>${antlr.source.dir}</sourceDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<!-- Apply the properties set in the POM to the resource files -->

View File

@ -1,1197 +0,0 @@
/*
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: A D D ;
ALL: A L L ;
ALTER: A L T E R ;
ANALYZE: A N A L Y Z E ;
AND: A N D ;
AS: A S ;
ASC: A S C ;
BEFORE: B E F O R E ;
BETWEEN: B E T W E E N ;
BOTH: B O T H ;
BY: B Y;
CALL: C A L L ;
CASCADE: C A S C A D E ;
CASE: C A S E ;
CAST: C A S T ;
CHANGE: C H A N G E ;
CHARACTER: C H A R A C T E R ;
CHECK: C H E C K ;
COLLATE: C O L L A T E ;
COLUMN: C O L U M N ;
CONDITION: C O N D I T I O N ;
CONSTRAINT: C O N S T R A I N T ;
CONTINUE: C O N T I N U E ;
CONVERT: C O N V E R T ;
CREATE: C R E A T E ;
CROSS: C R O S S ;
CURRENT_USER: C U R R E N T '_' U S E R ;
CURSOR: C U R S O R ;
DATABASE: D A T A B A S E ;
DATABASES: D A T A B A S E S ;
DECLARE: D E C L A R E ;
DEFAULT: D E F A U L T ;
DELAYED: D E L A Y E D ;
DELETE: D E L E T E ;
DESC: D E S C ;
DESCRIBE: D E S C R I B E ;
DETERMINISTIC: D E T E R M I N I S T I C ;
DISTINCT: D I S T I N C T ;
DISTINCTROW: D I S T I N C T R O W ;
DROP: D R O P ;
EACH: E A C H ;
ELSE: E L S E ;
ELSEIF: E L S E I F ;
ENCLOSED: E N C L O S E D ;
ESCAPED: E S C A P E D ;
EXISTS: E X I S T S ;
EXIT: E X I T ;
EXPLAIN: E X P L A I N ;
FALSE: F A L S E ;
FETCH: F E T C H ;
FOR: F O R ;
FORCE: F O R C E ;
FOREIGN: F O R E I G N ;
FROM: F R O M ;
FULLTEXT: F U L L T E X T ;
GRANT: G R A N T ;
GROUP: G R O U P ;
HAVING: H A V I N G ;
HIGH_PRIORITY: H I G H '_' P R I O R I T Y ;
IF: I F ;
IGNORE: I G N O R E ;
IN: I N ;
INDEX: I N D E X ;
INFILE: I N F I L E ;
INNER: I N N E R ;
INOUT: I N O U T ;
INSERT: I N S E R T ;
INTERVAL: I N T E R V A L ;
INTO: I N T O ;
IS: I S ;
ITERATE: I T E R A T E ;
JOIN: J O I N ;
KEY: K E Y ;
KEYS: K E Y S ;
KILL: K I L L ;
LEADING: L E A D I N G ;
LEAVE: L E A V E ;
LEFT: L E F T ;
LIKE: L I K E ;
LIMIT: L I M I T ;
LINEAR: L I N E A R ;
LINES: L I N E S ;
LOAD: L O A D ;
LOCK: L O C K ;
LOOP: L O O P ;
LOW_PRIORITY: L O W '_' P R I O R I T Y ;
MASTER_BIND: M A S T E R '_' B I N D ;
MASTER_SSL_VERIFY_SERVER_CERT: M A S T E R '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T;
MATCH: M A T C H ;
MAXVALUE: M A X V A L U E ;
MODIFIES: M O D I F I E S ;
NATURAL: N A T U R A L ;
NOT: N O T ;
NO_WRITE_TO_BINLOG: N O '_' W R I T E '_' T O '_' B I N L O G ;
NULL_LITERAL: N U L L ;
ON: O N ;
OPTIMIZE: O P T I M I Z E ;
OPTION: O P T I O N ;
OPTIONALLY: O P T I O N A L L Y ;
OR: O R ;
ORDER: O R D E R ;
OUT: O U T ;
OUTER: O U T E R ;
OUTFILE: O U T F I L E ;
PARTITION: P A R T I T I O N ;
PRIMARY: P R I M A R Y ;
PROCEDURE: P R O C E D U R E ;
PURGE: P U R G E ;
RANGE: R A N G E ;
READ: R E A D ;
READS: R E A D S ;
REFERENCES: R E F E R E N C E S ;
REGEXP: R E G E X P ;
RELEASE: R E L E A S E ;
RENAME: R E N A M E ;
REPEAT: R E P E A T ;
REPLACE: R E P L A C E ;
REQUIRE: R E Q U I R E ;
RESTRICT: R E S T R I C T ;
RETURN: R E T U R N ;
REVOKE: R E V O K E ;
RIGHT: R I G H T ;
RLIKE: R L I K E ;
SCHEMA: S C H E M A ;
SCHEMAS: S C H E M A S ;
SELECT: S E L E C T ;
SET: S E T ;
SEPARATOR: S E P A R A T O R ;
SHOW: S H O W ;
SPATIAL: S P A T I A L ;
SQL: S Q L ;
SQLEXCEPTION: S Q L E X C E P T I O N ;
SQLSTATE: S Q L S T A T E ;
SQLWARNING: S Q L W A R N I N G ;
SQL_BIG_RESULT: S Q L '_' B I G '_' R E S U L T ;
SQL_CALC_FOUND_ROWS: S Q L '_' C A L C '_' F O U N D '_' R O W S ;
SQL_SMALL_RESULT: S Q L '_' S M A L L '_' R E S U L T ;
SSL: S S L ;
STARTING: S T A R T I N G ;
STRAIGHT_JOIN: S T R A I G H T '_' J O I N ;
TABLE: T A B L E ;
TERMINATED: T E R M I N A T E D ;
THEN: T H E N ;
TO: T O ;
TRAILING: T R A I L I N G ;
TRIGGER: T R I G G E R ;
TRUE: T R U E ;
UNDO: U N D O ;
UNION: U N I O N ;
UNIQUE: U N I Q U E ;
UNLOCK: U N L O C K ;
UNSIGNED: U N S I G N E D ;
UPDATE: U P D A T E ;
USAGE: U S A G E ;
USE: U S E ;
USING: U S I N G ;
VALUES: V A L U E S ;
WHEN: W H E N ;
WHERE: W H E R E ;
WHILE: W H I L E ;
WITH: W I T H ;
WRITE: W R I T E ;
XOR: X O R ;
ZEROFILL: Z E R O F I L L ;
// DATA TYPE Keywords
TINYINT: T I N Y I N T ;
SMALLINT: S M A L L I N T ;
MEDIUMINT: M E D I U M I N T ;
INT: I N T ;
INTEGER: I N T E G E R ;
BIGINT: B I G I N T ;
REAL: R E A L ;
DOUBLE: D O U B L E ;
FLOAT: F L O A T ;
DECIMAL: D E C I M A L ;
NUMERIC: N U M E R I C ;
DATE: D A T E ;
TIME: T I M E ;
TIMESTAMP: T I M E S T A M P ;
DATETIME: D A T E T I M E ;
YEAR: Y E A R ;
CHAR: C H A R ;
VARCHAR: V A R C H A R ;
BINARY: B I N A R Y ;
VARBINARY: V A R B I N A R Y ;
TINYBLOB: T I N Y B L O B ;
BLOB: B L O B ;
MEDIUMBLOB: M E D I U M B L O B ;
LONGBLOB: L O N G B L O B ;
TINYTEXT: T I N Y T E X T ;
TEXT: T E X T ;
MEDIUMTEXT: M E D I U M T E X T ;
LONGTEXT: L O N G T E X T ;
ENUM: E N U M ;
// Interval type Keywords
YEAR_MONTH: Y E A R '_' M O N T H ;
DAY_HOUR: D A Y '_' H O U R ;
DAY_MINUTE: D A Y '_' M I N U T E ;
DAY_SECOND: D A Y '_' S E C O N D ;
HOUR_MINUTE: H O U R '_' M I N U T E ;
HOUR_SECOND: H O U R '_' S E C O N D ;
MINUTE_SECOND: M I N U T E '_' S E C O N D ;
SECOND_MICROSECOND: S E C O N D '_' M I C R O S E C O N D ;
MINUTE_MICROSECOND: M I N U T E '_' M I C R O S E C O N D ;
HOUR_MICROSECOND: H O U R '_' M I C R O S E C O N D ;
DAY_MICROSECOND: D A Y '_' M I C R O S E C O N D ;
// Group function Keywords
AVG: A V G ;
BIT_AND: B I T '_' A N D ;
BIT_OR: B I T '_' O R ;
BIT_XOR: B I T '_' X O R ;
COUNT: C O U N T ;
GROUP_CONCAT: G R O U P '_' C O N C A T ;
MAX: M A X ;
MIN: M I N ;
STD: S T D ;
STDDEV: S T D D E V ;
STDDEV_POP: S T D D E V '_' P O P ;
STDDEV_SAMP: S T D D E V '_' S A M P ;
SUM: S U M ;
VAR_POP: V A R '_' P O P ;
VAR_SAMP: V A R '_' S A M P ;
VARIANCE: V A R I A N C E ;
// Common function Keywords
CURRENT_DATE: C U R R E N T '_' D A T E ;
CURRENT_TIME: C U R R E N T '_' T I M E ;
CURRENT_TIMESTAMP: C U R R E N T '_' T I M E S T A M P ;
LOCALTIME: L O C A L T I M E ;
CURDATE: C U R D A T E ;
CURTIME: C U R T I M E ;
DATE_ADD: D A T E '_' A D D ;
DATE_SUB: D A T E '_' S U B ;
EXTRACT: E X T R A C T ;
LOCALTIMESTAMP: L O C A L T I M E S T A M P ;
NOW: N O W ;
POSITION: P O S I T I O N ;
SUBSTR: S U B S T R ;
SUBSTRING: S U B S T R I N G ;
SYSDATE: S Y S D A T E ;
TRIM: T R I M ;
UTC_DATE: U T C '_' D A T E ;
UTC_TIME: U T C '_' T I M E ;
UTC_TIMESTAMP: U T C '_' T I M E S T A M P ;
// Keywords, but can be ID
// Common Keywords, but can be ID
ACCOUNT: A C C O U N T ;
ACTION: A C T I O N ;
AFTER: A F T E R ;
AGGREGATE: A G G R E G A T E ;
ALGORITHM: A L G O R I T H M ;
ANY: A N Y ;
AT: A T ;
AUTHORS: A U T H O R S ;
AUTOCOMMIT: A U T O C O M M I T ;
AUTOEXTEND_SIZE: A U T O E X T E N D '_' S I Z E ;
AUTO_INCREMENT: A U T O '_' I N C R E M E N T ;
AVG_ROW_LENGTH: A V G '_' R O W '_' L E N G T H ;
BEGIN: B E G I N ;
BINLOG: B I N L O G ;
BIT: B I T ;
BLOCK: B L O C K ;
BOOL: B O O L ;
BOOLEAN: B O O L E A N ;
BTREE: B T R E E ;
CACHE: C A C H E ;
CASCADED: C A S C A D E D ;
CHAIN: C H A I N ;
CHANGED: C H A N G E D ;
CHANNEL: C H A N N E L ;
CHECKSUM: C H E C K S U M ;
CIPHER: C I P H E R ;
CLIENT: C L I E N T ;
CLOSE: C L O S E ;
COALESCE: C O A L E S C E ;
CODE: C O D E ;
COLUMNS: C O L U M N S ;
COLUMN_FORMAT: C O L U M N '_' F O R M A T ;
COMMENT: C O M M E N T ;
COMMIT: C O M M I T ;
COMPACT: C O M P A C T ;
COMPLETION: C O M P L E T I O N ;
COMPRESSED: C O M P R E S S E D ;
COMPRESSION: C O M P R E S S I O N ;
CONCURRENT: C O N C U R R E N T ;
CONNECTION: C O N N E C T I O N ;
CONSISTENT: C O N S I S T E N T ;
CONTAINS: C O N T A I N S ;
CONTEXT: C O N T E X T ;
CONTRIBUTORS: C O N T R I B U T O R S ;
COPY: C O P Y ;
CPU: C P U ;
DATA: D A T A ;
DATAFILE: D A T A F I L E ;
DEALLOCATE: D E A L L O C A T E ;
DEFAULT_AUTH: D E F A U L T '_' A U T H ;
DEFINER: D E F I N E R ;
DELAY_KEY_WRITE: D E L A Y '_' K E Y '_' W R I T E ;
DES_KEY_FILE: D E S '_' K E Y '_' F I L E ;
DIRECTORY: D I R E C T O R Y ;
DISABLE: D I S A B L E ;
DISCARD: D I S C A R D ;
DISK: D I S K ;
DO: D O ;
DUMPFILE: D U M P F I L E ;
DUPLICATE: D U P L I C A T E ;
DYNAMIC: D Y N A M I C ;
ENABLE: E N A B L E ;
ENCRYPTION: E N C R Y P T I O N ;
END: E N D ;
ENDS: E N D S ;
ENGINE: E N G I N E ;
ENGINES: E N G I N E S ;
ERROR: E R R O R ;
ERRORS: E R R O R S ;
ESCAPE: E S C A P E ;
EVEN: E V E N ;
EVENT: E V E N T ;
EVENTS: E V E N T S ;
EVERY: E V E R Y ;
EXCHANGE: E X C H A N G E ;
EXCLUSIVE: E X C L U S I V E ;
EXPIRE: E X P I R E ;
EXPORT: E X P O R T ;
EXTENDED: E X T E N D E D ;
EXTENT_SIZE: E X T E N T '_' S I Z E ;
FAST: F A S T ;
FAULTS: F A U L T S ;
FIELDS: F I E L D S ;
FILE_BLOCK_SIZE: F I L E '_' B L O C K '_' S I Z E ;
FILTER: F I L T E R ;
FIRST: F I R S T ;
FIXED: F I X E D ;
FLUSH: F L U S H ;
FOLLOWS: F O L L O W S ;
FOUND: F O U N D ;
FULL: F U L L ;
FUNCTION: F U N C T I O N ;
GENERAL: G E N E R A L ;
GLOBAL: G L O B A L ;
GRANTS: G R A N T S ;
GROUP_REPLICATION: G R O U P '_' R E P L I C A T I O N ;
HANDLER: H A N D L E R ;
HASH: H A S H ;
HELP: H E L P ;
HOST: H O S T ;
HOSTS: H O S T S ;
IDENTIFIED: I D E N T I F I E D ;
IGNORE_SERVER_IDS: I G N O R E '_' S E R V E R '_' I D S ;
IMPORT: I M P O R T ;
INDEXES: I N D E X E S ;
INITIAL_SIZE: I N I T I A L '_' S I Z E ;
INPLACE: I N P L A C E ;
INSERT_METHOD: I N S E R T '_' M E T H O D ;
INSTALL: I N S T A L L ;
INSTANCE: I N S T A N C E ;
INVOKER: I N V O K E R ;
IO: I O ;
IO_THREAD: I O '_' T H R E A D ;
IPC: I P C ;
ISOLATION: I S O L A T I O N ;
ISSUER: I S S U E R ;
JSON: J S O N ;
KEY_BLOCK_SIZE: K E Y '_' B L O C K '_' S I Z E ;
LANGUAGE: L A N G U A G E ;
LAST: L A S T ;
LEAVES: L E A V E S ;
LESS: L E S S ;
LEVEL: L E V E L ;
LIST: L I S T ;
LOCAL: L O C A L ;
LOGFILE: L O G F I L E ;
LOGS: L O G S ;
MASTER: M A S T E R ;
MASTER_AUTO_POSITION: M A S T E R '_' A U T O '_' P O S I T I O N ;
MASTER_CONNECT_RETRY: M A S T E R '_' C O N N E C T '_' R E T R Y ;
MASTER_DELAY: M A S T E R '_' D E L A Y ;
MASTER_HEARTBEAT_PERIOD: M A S T E R '_' H E A R T B E A T '_' P E R I O D ;
MASTER_HOST: M A S T E R '_' H O S T ;
MASTER_LOG_FILE: M A S T E R '_' L O G '_' F I L E ;
MASTER_LOG_POS: M A S T E R '_' L O G '_' P O S ;
MASTER_PASSWORD: M A S T E R '_' P A S S W O R D ;
MASTER_PORT: M A S T E R '_' P O R T ;
MASTER_RETRY_COUNT: M A S T E R '_' R E T R Y '_' C O U N T ;
MASTER_SSL: M A S T E R '_' S S L ;
MASTER_SSL_CA: M A S T E R '_' S S L '_' C A ;
MASTER_SSL_CAPATH: M A S T E R '_' S S L '_' C A P A T H ;
MASTER_SSL_CERT: M A S T E R '_' S S L '_' C E R T ;
MASTER_SSL_CIPHER: M A S T E R '_' S S L '_' C I P H E R ;
MASTER_SSL_CRL: M A S T E R '_' S S L '_' C R L ;
MASTER_SSL_CRLPATH: M A S T E R '_' S S L '_' C R L P A T H ;
MASTER_SSL_KEY: M A S T E R '_' S S L '_' K E Y ;
MASTER_TLS_VERSION: M A S T E R '_' T L S '_' V E R S I O N ;
MASTER_USER: M A S T E R '_' U S E R ;
MAX_CONNECTIONS_PER_HOUR: M A X '_' C O N N E C T I O N S '_' P E R '_' H O U R ;
MAX_QUERIES_PER_HOUR: M A X '_' Q U E R I E S '_' P E R '_' H O U R ;
MAX_ROWS: M A X '_' R O W S ;
MAX_SIZE: M A X '_' S I Z E ;
MAX_UPDATES_PER_HOUR: M A X '_' U P D A T E S '_' P E R '_' H O U R ;
MAX_USER_CONNECTIONS: M A X '_' U S E R '_' C O N N E C T I O N S ;
MEDIUM: M E D I U M ;
MERGE: M E R G E ;
MID: M I D ;
MIGRATE: M I G R A T E ;
MIN_ROWS: M I N '_' R O W S ;
MODE: M O D E ;
MODIFY: M O D I F Y ;
MUTEX: M U T E X ;
MYSQL: M Y S Q L ;
NAME: N A M E ;
NAMES: N A M E S ;
NCHAR: N C H A R ;
NEVER: N E V E R ;
NEXT: N E X T ;
NO: N O ;
NODEGROUP: N O D E G R O U P ;
NONE: N O N E ;
OFFLINE: O F F L I N E ;
OFFSET: O F F S E T ;
OJ: O J ;
OLD_PASSWORD: O L D '_' P A S S W O R D ;
ONE: O N E ;
ONLINE: O N L I N E ;
ONLY: O N L Y ;
OPEN: O P E N ;
OPTIMIZER_COSTS: O P T I M I Z E R '_' C O S T S ;
OPTIONS: O P T I O N S ;
OWNER: O W N E R ;
PACK_KEYS: P A C K '_' K E Y S ;
PAGE: P A G E ;
PARSER: P A R S E R ;
PARTIAL: P A R T I A L ;
PARTITIONING: P A R T I T I O N I N G ;
PARTITIONS: P A R T I T I O N S ;
PASSWORD: P A S S W O R D ;
PHASE: P H A S E ;
PLUGIN: P L U G I N ;
PLUGIN_DIR: P L U G I N '_' D I R ;
PLUGINS: P L U G I N S ;
PORT: P O R T ;
PRECEDES: P R E C E D E S ;
PREPARE: P R E P A R E ;
PRESERVE: P R E S E R V E ;
PREV: P R E V ;
PROCESSLIST: P R O C E S S L I S T ;
PROFILE: P R O F I L E ;
PROFILES: P R O F I L E S ;
PROXY: P R O X Y ;
QUERY: Q U E R Y ;
QUICK: Q U I C K ;
REBUILD: R E B U I L D ;
RECOVER: R E C O V E R ;
REDO_BUFFER_SIZE: R E D O '_' B U F F E R '_' S I Z E ;
REDUNDANT: R E D U N D A N T ;
RELAY: R E L A Y ;
RELAY_LOG_FILE: R E L A Y '_' L O G '_' F I L E ;
RELAY_LOG_POS: R E L A Y '_' L O G '_' P O S ;
RELAYLOG: R E L A Y L O G ;
REMOVE: R E M O V E ;
REORGANIZE: R E O R G A N I Z E ;
REPAIR: R E P A I R ;
REPLICATE_DO_DB: R E P L I C A T E '_' D O '_' D B ;
REPLICATE_DO_TABLE: R E P L I C A T E '_' D O '_' T A B L E ;
REPLICATE_IGNORE_DB: R E P L I C A T E '_' I G N O R E '_' D B ;
REPLICATE_IGNORE_TABLE: R E P L I C A T E '_' I G N O R E '_' T A B L E ;
REPLICATE_REWRITE_DB: R E P L I C A T E '_' R E W R I T E '_' D B ;
REPLICATE_WILD_DO_TABLE: R E P L I C A T E '_' W I L D '_' D O '_' T A B L E ;
REPLICATE_WILD_IGNORE_TABLE: R E P L I C A T E '_' W I L D '_' I G N O R E '_' T A B L E ;
REPLICATION: R E P L I C A T I O N ;
RESET: R E S E T ;
RESUME: R E S U M E ;
RETURNS: R E T U R N S ;
ROLLBACK: R O L L B A C K ;
ROLLUP: R O L L U P ;
ROTATE: R O T A T E ;
ROW: R O W ;
ROWS: R O W S ;
ROW_FORMAT: R O W '_' F O R M A T ;
SAVEPOINT: S A V E P O I N T ;
SCHEDULE: S C H E D U L E ;
SECURITY: S E C U R I T Y ;
SERVER: S E R V E R ;
SESSION: S E S S I O N ;
SHARE: S H A R E ;
SHARED: S H A R E D ;
SIGNED: S I G N E D ;
SIMPLE: S I M P L E ;
SLAVE: S L A V E ;
SLOW: S L O W ;
SNAPSHOT: S N A P S H O T ;
SOCKET: S O C K E T ;
SOME: S O M E ;
SONAME: S O N A M E ;
SOUNDS: S O U N D S ;
SOURCE: S O U R C E ;
SQL_AFTER_GTIDS: S Q L '_' A F T E R '_' G T I D S ;
SQL_AFTER_MTS_GAPS: S Q L '_' A F T E R '_' M T S '_' G A P S ;
SQL_BEFORE_GTIDS: S Q L '_' B E F O R E '_' G T I D S ;
SQL_BUFFER_RESULT: S Q L '_' B U F F E R '_' R E S U L T ;
SQL_CACHE: S Q L '_' C A C H E ;
SQL_NO_CACHE: S Q L '_' N O '_' C A C H E ;
SQL_THREAD: S Q L '_' T H R E A D ;
START: S T A R T ;
STARTS: S T A R T S ;
STATS_AUTO_RECALC: S T A T S '_' A U T O '_' R E C A L C ;
STATS_PERSISTENT: S T A T S '_' P E R S I S T E N T ;
STATS_SAMPLE_PAGES: S T A T S '_' S A M P L E '_' P A G E S ;
STATUS: S T A T U S ;
STOP: S T O P ;
STORAGE: S T O R A G E ;
STRING: S T R I N G ;
SUBJECT: S U B J E C T ;
SUBPARTITION: S U B P A R T I T I O N ;
SUBPARTITIONS: S U B P A R T I T I O N S ;
SUSPEND: S U S P E N D ;
SWAPS: S W A P S ;
SWITCHES: S W I T C H E S ;
TABLESPACE: T A B L E S P A C E ;
TEMPORARY: T E M P O R A R Y ;
TEMPTABLE: T E M P T A B L E ;
THAN: T H A N ;
TRADITIONAL: T R A D I T I O N A L ;
TRANSACTION: T R A N S A C T I O N ;
TRIGGERS: T R I G G E R S ;
TRUNCATE: T R U N C A T E ;
UNDEFINED: U N D E F I N E D ;
UNDOFILE: U N D O F I L E ;
UNDO_BUFFER_SIZE: U N D O '_' B U F F E R '_' S I Z E ;
UNINSTALL: U N I N S T A L L ;
UNKNOWN: U N K N O W N ;
UNTIL: U N T I L ;
UPGRADE: U P G R A D E ;
USER: U S E R ;
USE_FRM: U S E '_' F R M ;
USER_RESOURCES: U S E R '_' R E S O U R C E S ;
VALIDATION: V A L I D A T I O N ;
VALUE: V A L U E ;
VARIABLES: V A R I A B L E S ;
VIEW: V I E W ;
WAIT: W A I T ;
WARNINGS: W A R N I N G S ;
WITHOUT: W I T H O U T ;
WORK: W O R K ;
WRAPPER: W R A P P E R ;
X509: X '5' '0' '9' ;
XA: X A ;
XML: X M L ;
// Date format Keywords
EUR: E U R ;
USA: U S A ;
JIS: J I S ;
ISO: I S O ;
INTERNAL: I N T E R N A L ;
// Interval type Keywords
QUARTER: Q U A R T E R ;
MONTH: M O N T H ;
DAY: D A Y ;
HOUR: H O U R ;
MINUTE: M I N U T E ;
WEEK: W E E K ;
SECOND: S E C O N D ;
MICROSECOND: M I C R O S E C O N D ;
// PRIVILEGES
TABLES: T A B L E S ;
ROUTINE: R O U T I N E ;
EXECUTE: E X E C U T E ;
FILE: F I L E ;
PROCESS: P R O C E S S ;
RELOAD: R E L O A D ;
SHUTDOWN: S H U T D O W N ;
SUPER: S U P E R ;
PRIVILEGES: P R I V I L E G E S ;
// Charsets
ARMSCII8: A R M S C I I '8' ;
ASCII: A S C I I ;
BIG5: B I G '5' ;
CP1250: C P '1' '2' '5' '0' ;
CP1251: C P '1' '2' '5' '1' ;
CP1256: C P '1' '2' '5' '6' ;
CP1257: C P '1' '2' '5' '7' ;
CP850: C P '8' '5' '0' ;
CP852: C P '8' '5' '2' ;
CP866: C P '8' '6' '6' ;
CP932: C P '9' '3' '2' ;
DEC8: D E C '8' ;
EUCJPMS: E U C J P M S ;
EUCKR: E U C K R ;
GB2312: G B '2' '3' '1' '2' ;
GBK: G B K ;
GEOSTD8: G E O S T D '8' ;
GREEK: G R E E K ;
HEBREW: H E B R E W ;
HP8: H P '8' ;
KEYBCS2: K E Y B C S '2' ;
KOI8R: K O I '8' R ;
KOI8U: K O I '8' U ;
LATIN1: L A T I N '1' ;
LATIN2: L A T I N '2' ;
LATIN5: L A T I N '5' ;
LATIN7: L A T I N '7' ;
MACCE: M A C C E ;
MACROMAN: M A C R O M A N ;
SJIS: S J I S ;
SWE7: S W E '7' ;
TIS620: T I S '6' '2' '0' ;
UCS2: U C S '2' ;
UJIS: U J I S ;
UTF16: U T F '1' '6' ;
UTF16LE: U T F '1' '6' L E ;
UTF32: U T F '3' '2' ;
UTF8: U T F '8' ;
UTF8MB3: U T F '8' M B '3' ;
UTF8MB4: U T F '8' M B '4' ;
// DB Engines
ARCHIVE: A R C H I V E ;
BLACKHOLE: B L A C K H O L E ;
CSV: C S V ;
FEDERATED: F E D E R A T E D ;
INNODB: I N N O D B ;
MEMORY: M E M O R Y ;
MRG_MYISAM: M R G '_' M Y I S A M ;
MYISAM: M Y I S A M ;
NDB: N D B ;
NDBCLUSTER: N D B C L U S T E R ;
PERFOMANCE_SCHEMA: P E R F O M A N C E '_' S C H E M A ;
// Transaction Levels
REPEATABLE: R E P E A T A B L E ;
COMMITTED: C O M M I T T E D ;
UNCOMMITTED: U N C O M M I T T E D ;
SERIALIZABLE: S E R I A L I Z A B L E ;
// Spatial data types
GEOMETRYCOLLECTION: G E O M E T R Y C O L L E C T I O N ;
LINESTRING: L I N E S T R I N G ;
MULTILINESTRING: M U L T I L I N E S T R I N G ;
MULTIPOINT: M U L T I P O I N T ;
MULTIPOLYGON: M U L T I P O L Y G O N ;
POINT: P O I N T ;
POLYGON: P O L Y G O N ;
// Common function names
ABS: A B S ;
ACOS: A C O S ;
ADDDATE: A D D D A T E ;
ADDTIME: A D D T I M E ;
AES_DECRYPT: A E S '_' D E C R Y P T ;
AES_ENCRYPT: A E S '_' E N C R Y P T ;
AREA: A R E A ;
ASBINARY: A S B I N A R Y ;
ASIN: A S I N ;
ASTEXT: A S T E X T ;
ASWKB: A S W K B ;
ASWKT: A S W K T ;
ASYMMETRIC_DECRYPT: A S Y M M E T R I C '_' D E C R Y P T ;
ASYMMETRIC_DERIVE: A S Y M M E T R I C '_' D E R I V E ;
ASYMMETRIC_ENCRYPT: A S Y M M E T R I C '_' E N C R Y P T ;
ASYMMETRIC_SIGN: A S Y M M E T R I C '_' S I G N ;
ASYMMETRIC_VERIFY: A S Y M M E T R I C '_' V E R I F Y ;
ATAN: A T A N ;
ATAN2: A T A N '2' ;
BENCHMARK: B E N C H M A R K ;
BIN: B I N ;
BIT_COUNT: B I T '_' C O U N T ;
BIT_LENGTH: B I T '_' L E N G T H ;
BUFFER: B U F F E R ;
CEIL: C E I L ;
CEILING: C E I L I N G ;
CENTROID: C E N T R O I D ;
CHARACTER_LENGTH: C H A R A C T E R '_' L E N G T H ;
CHARSET: C H A R S E T ;
CHAR_LENGTH: C H A R '_' L E N G T H ;
COERCIBILITY: C O E R C I B I L I T Y ;
COLLATION: C O L L A T I O N ;
COMPRESS: C O M P R E S S ;
CONCAT: C O N C A T ;
CONCAT_WS: C O N C A T '_' W S ;
CONNECTION_ID: C O N N E C T I O N '_' I D ;
CONV: C O N V ;
CONVERT_TZ: C O N V E R T '_' T Z ;
COS: C O S ;
COT: C O T ;
CRC32: C R C '3' '2' ;
CREATE_ASYMMETRIC_PRIV_KEY: C R E A T E '_' A S Y M M E T R I C '_' P R I V '_' K E Y ;
CREATE_ASYMMETRIC_PUB_KEY: C R E A T E '_' A S Y M M E T R I C '_' P U B '_' K E Y ;
CREATE_DH_PARAMETERS: C R E A T E '_' D H '_' P A R A M E T E R S ;
CREATE_DIGEST: C R E A T E '_' D I G E S T ;
CROSSES: C R O S S E S ;
DATEDIFF: D A T E D I F F ;
DATE_FORMAT: D A T E '_' F O R M A T ;
DAYNAME: D A Y N A M E ;
DAYOFMONTH: D A Y O F M O N T H ;
DAYOFWEEK: D A Y O F W E E K ;
DAYOFYEAR: D A Y O F Y E A R ;
DECODE: D E C O D E ;
DEGREES: D E G R E E S ;
DES_DECRYPT: D E S '_' D E C R Y P T ;
DES_ENCRYPT: D E S '_' E N C R Y P T ;
DIMENSION: D I M E N S I O N ;
DISJOINT: D I S J O I N T ;
ELT: E L T ;
ENCODE: E N C O D E ;
ENCRYPT: E N C R Y P T ;
ENDPOINT: E N D P O I N T ;
ENVELOPE: E N V E L O P E ;
EQUALS: E Q U A L S ;
EXP: E X P ;
EXPORT_SET: E X P O R T '_' S E T ;
EXTERIORRING: E X T E R I O R R I N G ;
EXTRACTVALUE: E X T R A C T V A L U E ;
FIELD: F I E L D ;
FIND_IN_SET: F I N D '_' I N '_' S E T ;
FLOOR: F L O O R ;
FORMAT: F O R M A T ;
FOUND_ROWS: F O U N D '_' R O W S ;
FROM_BASE64: F R O M '_' B A S E '6' '4' ;
FROM_DAYS: F R O M '_' D A Y S ;
FROM_UNIXTIME: F R O M '_' U N I X T I M E ;
GEOMCOLLFROMTEXT: G E O M C O L L F R O M T E X T ;
GEOMCOLLFROMWKB: G E O M C O L L F R O M W K B ;
GEOMETRYCOLLECTIONFROMTEXT: G E O M E T R Y C O L L E C T I O N F R O M T E X T ;
GEOMETRYCOLLECTIONFROMWKB: G E O M E T R Y C O L L E C T I O N F R O M W K B ;
GEOMETRYFROMTEXT: G E O M E T R Y F R O M T E X T ;
GEOMETRYFROMWKB: G E O M E T R Y F R O M W K B ;
GEOMETRYN: G E O M E T R Y N ;
GEOMETRYTYPE: G E O M E T R Y T Y P E ;
GEOMFROMTEXT: G E O M F R O M T E X T ;
GEOMFROMWKB: G E O M F R O M W K B ;
GET_FORMAT: G E T '_' F O R M A T ;
GET_LOCK: G E T '_' L O C K ;
GLENGTH: G L E N G T H ;
GREATEST: G R E A T E S T ;
GTID_SUBSET: G T I D '_' S U B S E T ;
GTID_SUBTRACT: G T I D '_' S U B T R A C T ;
HEX: H E X ;
IFNULL: I F N U L L ;
INET6_ATON: I N E T '6' '_' A T O N ;
INET6_NTOA: I N E T '6' '_' N T O A ;
INET_ATON: I N E T '_' A T O N ;
INET_NTOA: I N E T '_' N T O A ;
INSTR: I N S T R ;
INTERIORRINGN: I N T E R I O R R I N G N ;
INTERSECTS: I N T E R S E C T S ;
ISCLOSED: I S C L O S E D ;
ISEMPTY: I S E M P T Y ;
ISNULL: I S N U L L ;
ISSIMPLE: I S S I M P L E ;
IS_FREE_LOCK: I S '_' F R E E '_' L O C K ;
IS_IPV4: I S '_' I P V '4' ;
IS_IPV4_COMPAT: I S '_' I P V '4' '_' C O M P A T ;
IS_IPV4_MAPPED: I S '_' I P V '4' '_' M A P P E D ;
IS_IPV6: I S '_' I P V '6' ;
IS_USED_LOCK: I S '_' U S E D '_' L O C K ;
LAST_INSERT_ID: L A S T '_' I N S E R T '_' I D ;
LCASE: L C A S E ;
LEAST: L E A S T ;
LENGTH: L E N G T H ;
LINEFROMTEXT: L I N E F R O M T E X T ;
LINEFROMWKB: L I N E F R O M W K B ;
LINESTRINGFROMTEXT: L I N E S T R I N G F R O M T E X T ;
LINESTRINGFROMWKB: L I N E S T R I N G F R O M W K B ;
LN: L N ;
LOAD_FILE: L O A D '_' F I L E ;
LOCATE: L O C A T E ;
LOG: L O G ;
LOG10: L O G '1' '0' ;
LOG2: L O G '2' ;
LOWER: L O W E R ;
LPAD: L P A D ;
LTRIM: L T R I M ;
MAKEDATE: M A K E D A T E ;
MAKETIME: M A K E T I M E ;
MAKE_SET: M A K E '_' S E T ;
MASTER_POS_WAIT: M A S T E R '_' P O S '_' W A I T ;
MBRCONTAINS: M B R C O N T A I N S ;
MBRDISJOINT: M B R D I S J O I N T ;
MBREQUAL: M B R E Q U A L ;
MBRINTERSECTS: M B R I N T E R S E C T S ;
MBROVERLAPS: M B R O V E R L A P S ;
MBRTOUCHES: M B R T O U C H E S ;
MBRWITHIN: M B R W I T H I N ;
MD5: M D '5' ;
MLINEFROMTEXT: M L I N E F R O M T E X T ;
MLINEFROMWKB: M L I N E F R O M W K B ;
MONTHNAME: M O N T H N A M E ;
MPOINTFROMTEXT: M P O I N T F R O M T E X T ;
MPOINTFROMWKB: M P O I N T F R O M W K B ;
MPOLYFROMTEXT: M P O L Y F R O M T E X T ;
MPOLYFROMWKB: M P O L Y F R O M W K B ;
MULTILINESTRINGFROMTEXT: M U L T I L I N E S T R I N G F R O M T E X T ;
MULTILINESTRINGFROMWKB: M U L T I L I N E S T R I N G F R O M W K B ;
MULTIPOINTFROMTEXT: M U L T I P O I N T F R O M T E X T ;
MULTIPOINTFROMWKB: M U L T I P O I N T F R O M W K B ;
MULTIPOLYGONFROMTEXT: M U L T I P O L Y G O N F R O M T E X T ;
MULTIPOLYGONFROMWKB: M U L T I P O L Y G O N F R O M W K B ;
NAME_CONST: N A M E '_' C O N S T ;
NULLIF: N U L L I F ;
NUMGEOMETRIES: N U M G E O M E T R I E S ;
NUMINTERIORRINGS: N U M I N T E R I O R R I N G S ;
NUMPOINTS: N U M P O I N T S ;
OCT: O C T ;
OCTET_LENGTH: O C T E T '_' L E N G T H ;
ORD: O R D ;
OVERLAPS: O V E R L A P S ;
PERIOD_ADD: P E R I O D '_' A D D ;
PERIOD_DIFF: P E R I O D '_' D I F F ;
PI: P I ;
POINTFROMTEXT: P O I N T F R O M T E X T ;
POINTFROMWKB: P O I N T F R O M W K B ;
POINTN: P O I N T N ;
POLYFROMTEXT: P O L Y F R O M T E X T ;
POLYFROMWKB: P O L Y F R O M W K B ;
POLYGONFROMTEXT: P O L Y G O N F R O M T E X T ;
POLYGONFROMWKB: P O L Y G O N F R O M W K B ;
POW: P O W ;
POWER: P O W E R ;
QUOTE: Q U O T E ;
RADIANS: R A D I A N S ;
RAND: R A N D ;
RANDOM_BYTES: R A N D O M '_' B Y T E S ;
RELEASE_LOCK: R E L E A S E '_' L O C K ;
REVERSE: R E V E R S E ;
ROUND: R O U N D ;
ROW_COUNT: R O W '_' C O U N T ;
RPAD: R P A D ;
RTRIM: R T R I M ;
SEC_TO_TIME: S E C '_' T O '_' T I M E ;
SESSION_USER: S E S S I O N '_' U S E R ;
SHA: S H A ;
SHA1: S H A '1' ;
SHA2: S H A '2' ;
SIGN: S I G N ;
SIN: S I N ;
SLEEP: S L E E P ;
SOUNDEX: S O U N D E X ;
SQL_THREAD_WAIT_AFTER_GTIDS: S Q L '_' T H R E A D '_' W A I T '_' A F T E R '_' G T I D S ;
SQRT: S Q R T ;
SRID: S R I D ;
STARTPOINT: S T A R T P O I N T ;
STRCMP: S T R C M P ;
STR_TO_DATE: S T R '_' T O '_' D A T E ;
ST_AREA: S T '_' A R E A ;
ST_ASBINARY: S T '_' A S B I N A R Y ;
ST_ASTEXT: S T '_' A S T E X T ;
ST_ASWKB: S T '_' A S W K B ;
ST_ASWKT: S T '_' A S W K T ;
ST_BUFFER: S T '_' B U F F E R ;
ST_CENTROID: S T '_' C E N T R O I D ;
ST_CONTAINS: S T '_' C O N T A I N S ;
ST_CROSSES: S T '_' C R O S S E S ;
ST_DIFFERENCE: S T '_' D I F F E R E N C E ;
ST_DIMENSION: S T '_' D I M E N S I O N ;
ST_DISJOINT: S T '_' D I S J O I N T ;
ST_DISTANCE: S T '_' D I S T A N C E ;
ST_ENDPOINT: S T '_' E N D P O I N T ;
ST_ENVELOPE: S T '_' E N V E L O P E ;
ST_EQUALS: S T '_' E Q U A L S ;
ST_EXTERIORRING: S T '_' E X T E R I O R R I N G ;
ST_GEOMCOLLFROMTEXT: S T '_' G E O M C O L L F R O M T E X T ;
ST_GEOMCOLLFROMTXT: S T '_' G E O M C O L L F R O M T X T ;
ST_GEOMCOLLFROMWKB: S T '_' G E O M C O L L F R O M W K B ;
ST_GEOMETRYCOLLECTIONFROMTEXT: S T '_' G E O M E T R Y C O L L E C T I O N F R O M T E X T ;
ST_GEOMETRYCOLLECTIONFROMWKB: S T '_' G E O M E T R Y C O L L E C T I O N F R O M W K B ;
ST_GEOMETRYFROMTEXT: S T '_' G E O M E T R Y F R O M T E X T ;
ST_GEOMETRYFROMWKB: S T '_' G E O M E T R Y F R O M W K B ;
ST_GEOMETRYN: S T '_' G E O M E T R Y N ;
ST_GEOMETRYTYPE: S T '_' G E O M E T R Y T Y P E ;
ST_GEOMFROMTEXT: S T '_' G E O M F R O M T E X T ;
ST_GEOMFROMWKB: S T '_' G E O M F R O M W K B ;
ST_INTERIORRINGN: S T '_' I N T E R I O R R I N G N ;
ST_INTERSECTION: S T '_' I N T E R S E C T I O N ;
ST_INTERSECTS: S T '_' I N T E R S E C T S ;
ST_ISCLOSED: S T '_' I S C L O S E D ;
ST_ISEMPTY: S T '_' I S E M P T Y ;
ST_ISSIMPLE: S T '_' I S S I M P L E ;
ST_LINEFROMTEXT: S T '_' L I N E F R O M T E X T ;
ST_LINEFROMWKB: S T '_' L I N E F R O M W K B ;
ST_LINESTRINGFROMTEXT: S T '_' L I N E S T R I N G F R O M T E X T ;
ST_LINESTRINGFROMWKB: S T '_' L I N E S T R I N G F R O M W K B ;
ST_NUMGEOMETRIES: S T '_' N U M G E O M E T R I E S ;
ST_NUMINTERIORRING: S T '_' N U M I N T E R I O R R I N G ;
ST_NUMINTERIORRINGS: S T '_' N U M I N T E R I O R R I N G S ;
ST_NUMPOINTS: S T '_' N U M P O I N T S ;
ST_OVERLAPS: S T '_' O V E R L A P S ;
ST_POINTFROMTEXT: S T '_' P O I N T F R O M T E X T ;
ST_POINTFROMWKB: S T '_' P O I N T F R O M W K B ;
ST_POINTN: S T '_' P O I N T N ;
ST_POLYFROMTEXT: S T '_' P O L Y F R O M T E X T ;
ST_POLYFROMWKB: S T '_' P O L Y F R O M W K B ;
ST_POLYGONFROMTEXT: S T '_' P O L Y G O N F R O M T E X T ;
ST_POLYGONFROMWKB: S T '_' P O L Y G O N F R O M W K B ;
ST_SRID: S T '_' S R I D ;
ST_STARTPOINT: S T '_' S T A R T P O I N T ;
ST_SYMDIFFERENCE: S T '_' S Y M D I F F E R E N C E ;
ST_TOUCHES: S T '_' T O U C H E S ;
ST_UNION: S T '_' U N I O N ;
ST_WITHIN: S T '_' W I T H I N ;
ST_X: S T '_' X ;
ST_Y: S T '_' Y ;
SUBDATE: S U B D A T E ;
SUBSTRING_INDEX: S U B S T R I N G '_' I N D E X ;
SUBTIME: S U B T I M E ;
SYSTEM_USER: S Y S T E M '_' U S E R ;
TAN: T A N ;
TIMEDIFF: T I M E D I F F ;
TIMESTAMPADD: T I M E S T A M P A D D ;
TIMESTAMPDIFF: T I M E S T A M P D I F F ;
TIME_FORMAT: T I M E '_' F O R M A T ;
TIME_TO_SEC: T I M E '_' T O '_' S E C ;
TOUCHES: T O U C H E S ;
TO_BASE64: T O '_' B A S E '6' '4' ;
TO_DAYS: T O '_' D A Y S ;
TO_SECONDS: T O '_' S E C O N D S ;
UCASE: U C A S E ;
UNCOMPRESS: U N C O M P R E S S ;
UNCOMPRESSED_LENGTH: U N C O M P R E S S E D '_' L E N G T H ;
UNHEX: U N H E X ;
UNIX_TIMESTAMP: U N I X '_' T I M E S T A M P ;
UPDATEXML: U P D A T E X M L ;
UPPER: U P P E R ;
UUID: U U I D ;
UUID_SHORT: U U I D '_' S H O R T ;
VALIDATE_PASSWORD_STRENGTH: V A L I D A T E '_' P A S S W O R D '_' S T R E N G T H ;
VERSION: V E R S I O N ;
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS: W A I T '_' U N T I L '_' S Q L '_' T H R E A D '_' A F T E R '_' G T I D S ;
WEEKDAY: W E E K D A Y ;
WEEKOFYEAR: W E E K O F Y E A R ;
WEIGHT_STRING: W E I G H T '_' S T R I N G ;
WITHIN: W I T H I N ;
YEARWEEK: Y E A R W E E K ;
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: D I V ;
MOD: M O D;
// 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);
// case insensitive lexxer
fragment A : [aA]; // match either an 'a' or 'A'
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
fragment E : [eE];
fragment F : [fF];
fragment G : [gG];
fragment H : [hH];
fragment I : [iI];
fragment J : [jJ];
fragment K : [kK];
fragment L : [lL];
fragment M : [mM];
fragment N : [nN];
fragment O : [oO];
fragment P : [pP];
fragment Q : [qQ];
fragment R : [rR];
fragment S : [sS];
fragment T : [tT];
fragment U : [uU];
fragment V : [vV];
fragment W : [wW];
fragment X : [xX];
fragment Y : [yY];
fragment Z : [zZ];

View File

@ -0,0 +1,56 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>io.debezium</groupId>
<artifactId>debezium-parent</artifactId>
<version>0.8.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>debezium-ddl-parser</artifactId>
<name>Debezium ANTLR DDL parsers</name>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>io.debezium</groupId>
<artifactId>debezium-core</artifactId>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<antlr.source.directory>${project.basedir}/src/main/resources/antlr4</antlr.source.directory>
<docker.skip>false</docker.skip>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>${antlr.version}</version>
<configuration>
<sourceDirectory>${antlr.source.directory}</sourceDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,52 @@
/*
* Copyright Debezium Authors.
*
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package io.debezium.antlr;
import io.debezium.relational.Tables;
import io.debezium.relational.ddl.AbstractDdlParser;
import io.debezium.text.MultipleParsingExceptions;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CodePointCharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ConsoleErrorListener;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.Parser;
/**
* @author Roman Kuchár <kucharrom@gmail.com>.
*/
public abstract class AntlrDdlParser<L extends Lexer, P extends Parser> extends AbstractDdlParser {
public AntlrDdlParser() {
super(";");
}
@Override
public void parse(String ddlContent, Tables databaseTables) {
L lexer = getLexerNewInstance(CharStreams.fromString(removeLineFeeds(ddlContent)));
P parser = getParserNewInstance(new CommonTokenStream(lexer));
// remove base output printing error listener
parser.removeErrorListener(ConsoleErrorListener.INSTANCE);
ParsingErrorListener parsingErrorListener = new ParsingErrorListener(this::accumulateParsingFailure);
parser.addErrorListener(parsingErrorListener);
startParsing(parser, databaseTables);
if (parsingErrorListener.getErrors().size() > 0) {
throw new MultipleParsingExceptions(parsingErrorListener.getErrors());
}
}
protected abstract void startParsing(P parser, Tables databaseTables);
protected abstract L getLexerNewInstance(CodePointCharStream charStreams);
protected abstract P getParserNewInstance(CommonTokenStream commonTokenStream);
}

View File

@ -0,0 +1,44 @@
/*
* Copyright Debezium Authors.
*
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package io.debezium.antlr;
import io.debezium.text.ParsingException;
import io.debezium.text.Position;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.BiFunction;
/**
* ANTLR parsing error listener.
*
* @author Roman Kuchár <kucharrom@gmail.com>.
*/
public class ParsingErrorListener extends BaseErrorListener {
private Collection<ParsingException> errors = new ArrayList<>();
private final BiFunction<ParsingException, Collection<ParsingException>, Collection<ParsingException>> accumulateError;
public ParsingErrorListener(BiFunction<ParsingException, Collection<ParsingException>, Collection<ParsingException>> accumulateError) {
this.accumulateError = accumulateError;
}
/**
* Parsing error listener, which will throw up an exception.
*/
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
accumulateError.apply(new ParsingException(new Position(0, line, charPositionInLine), msg, e), errors);
}
public Collection<ParsingException> getErrors() {
return errors;
}
}

View File

@ -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);

View File

@ -0,0 +1,2468 @@
/*
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
;
//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
;

View File

@ -0,0 +1 @@
version=${project.version}

15
pom.xml
View File

@ -76,6 +76,9 @@
<!-- Connectors -->
<version.com.google.protobuf>2.6.1</version.com.google.protobuf>
<!-- ANTLR -->
<antlr.version>4.7</antlr.version>
<!-- Testing -->
<version.junit>4.12</version.junit>
<version.fest>1.4</version.fest>
@ -111,6 +114,7 @@
<modules>
<module>support/checkstyle</module>
<module>debezium-ddl-parser</module>
<module>debezium-assembly-descriptors</module>
<module>debezium-core</module>
<module>debezium-embedded</module>
@ -221,6 +225,12 @@
<version>${version.confluent.platform}</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>${antlr.version}</version>
</dependency>
<!-- PostgreSQL connector -->
<dependency>
@ -320,6 +330,11 @@
<artifactId>debezium-connector-mysql</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.debezium</groupId>
<artifactId>debezium-ddl-parser</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Debezium test artifacts -->
<dependency>

View File

@ -11,5 +11,5 @@
<!--exclude any protobuf generated files-->
<suppress checks="." files=".[\\/]io[\\/]debezium[\\/]connector[\\/]postgresql[\\/]proto[\\/].*\.java$"/>
<!--exclude any antlr generated files-->
<suppress checks="." files=".[\\/]io[\\/]debezium[\\/]connector[\\/]mysql[\\/]antlr[\\/]generated[\\/].*\.java$"/>
<suppress checks="." files=".[\\/]io[\\/]debezium[\\/]ddl[\\/]parser[\\/]mysql[\\/]generated[\\/].*\.java$"/>
</suppressions>