diff --git a/sharding-jdbc-ddl-parser/pom.xml b/sharding-jdbc-ddl-parser/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..f43eb2b44fdcd207ec2066a47a0ed0d0e06aac20 --- /dev/null +++ b/sharding-jdbc-ddl-parser/pom.xml @@ -0,0 +1,31 @@ + + 4.0.0 + + io.sharding + sharding-jdbc-ddl-parser + 0.0.1-SNAPSHOT + jar + + sharding-jdbc-ddl-parser + http://maven.apache.org + + + UTF-8 + + + + + org.antlr + antlr4 + 4.7.1 + + + junit + junit + 3.8.1 + test + + + diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/DDLBase.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/DDLBase.g4 new file mode 100644 index 0000000000000000000000000000000000000000..ebe6593441078c32238ceedeecf1a570a19b1abd --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/DDLBase.g4 @@ -0,0 +1,21 @@ +grammar DDLBase; + +import SQLBase, Keyword, Symbol; + +execute: + alterTable + + ; + +alterTable: + ALTER TABLE prefixTableName tableName alterSpecifications? partitionOptions? + ; + +prefixTableName: + ; + +alterSpecifications: + ; + +partitionOptions: + ; diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/DMLBase.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/DMLBase.g4 new file mode 100644 index 0000000000000000000000000000000000000000..d823f9d84a5daa85ba0d8fa27eef0c4116e5f4ad --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/DMLBase.g4 @@ -0,0 +1,159 @@ +grammar DMLBase; + +import SQLBase, Keyword, Symbol; + +execute: + select + |insert + |update + |delete + ; + +insert: + ; + +//define delete rule template +select: + withClause + |unionSelect + ; + +withClause: + WITH RECURSIVE? cteClause (COMMA cteClause)* + unionSelect + ; + +cteClause: + cteName itemList? AS subquery + ; + +cteName: + ID + ; + + +unionSelect: + selectExpression (UNION ALL? selectExpression)* + ; + +selectExpression: + selectClause + fromClause? + whereClause? + groupByClause? + orderByClause? + limitClause? + ; + +selectClause: + SELECT selectSpec selectExprs + ; + +selectSpec: + ; +fromClause: + FROM tableReferences + ; + +tableReferences: + ; + +whereClause: + WHERE expr + ; + +groupByClause: + GROUP BY groupByItem (COMMA groupByItem)* + (WITH ROLLUP)? + havingClause? + ; + +havingClause: + HAVING expr + ; + +orderByClause: + ORDER BY groupByItem (COMMA groupByItem)* + ; + +groupByItem: + (columnName | NUMBER |expr) (ASC|DESC)? + ; + +limitClause: + LIMIT rangeClause + ; + +rangeClause: + NUMBER (COMMA NUMBER)* + | NUMBER OFFSET NUMBER + ; + +subquery: + LEFT_PAREN unionSelect RIGHT_PAREN + ; + +selectExprs: + (ASTERISK (COMMA selectExpr)*) + |selectExpr (COMMA ASTERISK)? (COMMA selectExpr)* + ; + +selectExpr: + bitExpr AS? alias? + ; + +bitExpr: + ; + +alias: + ID + ; + +//define delete rule template +delete: + deleteClause + whereClause? + orderByClause? + limitClause? + ; + +deleteClause: + ; + +partitionClause: + PARTITION itemList + ; + +update: + updateClause + setClause + whereClause? + orderByClause? + limitClause? + ; + +updateClause: + ; + +updateSpec: + ; + +setClause: + SET assignmentList + ; + +assignmentList: + assignment (COMMA assignment)* + ; + +assignment: + columnName EQ_OR_ASSIGN value + ; + +value: + DEFAULT + |expr + ; + +expr: + ; diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/Keyword.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/Keyword.g4 new file mode 100644 index 0000000000000000000000000000000000000000..3c8ae26b0abc461b796784aae1c11c7e9c79d6ff --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/Keyword.g4 @@ -0,0 +1,137 @@ +lexer grammar Keyword; + +import Symbol; + +SELECT: S E L E C T; +ALL: A L L; +ANY: A N Y; +DISTINCT: D I S T I N C T; + +FROM: F R O M; +PARTITION: P A R T I T I O N; +WHERE: W H E R E; +GROUP: G R O U P; +BY: B Y; +ASC: A S C; +DESC: D E S C; +WITH: W I T H; +RECURSIVE: R E C U R S I V E; +ROLLUP: R O L L U P; +HAVING: H A V I N G; +WINDOW: W I N D O W; +AS: A S; +ORDER: O R D E R; +LIMIT: L I M I T; +OFFSET: O F F S E T; +INTO: I N T O; + +ALTER: A L T E R; +TABLE: T A B L E; +COLUMN: C O L U M N; +ADD: A D D; +DROP: D R O P; +ENABLE: E N A B L E; +DISABLE: D I S A B L E; +CONSTRAINT: C O N S T R A I N T; +UNIQUE: U N I Q U E; +FULLTEXT: F U L L T E X T; +FOREIGN: F O R E I G N; +NONE: N O N E; +MODIFY: M O D I F Y; +RENAME: R E N A M E; +VALIDATION: V A L I D A T I O N; +IMPORT_: I M P O R T; +TABLESPACE: T A B L E S P A C E; +TRUNCATE: T R U N C A T E; +ANALYZE: A N A L Y Z E; +CHECK: C H E C K; +OPTIMIZE: O P T I M I Z E; +REBUILD: R E B U I L D; +REPAIR: R E P A I R; +REMOVE: R E M O V E; +UPGRADE: U P G R A D E; +TO: T O; +COPY: C O P Y; +PRIMARY: P R I M A R Y; +KEYS: K E Y S; +WITHOUT: W I T H O U T; +COALESCE: C O A L E S C E; + +SET: S E T; +FOR: F O R; +UPDATE: U P D A T E; +SHARE: S H A R E; +OF: O F; +NOWAIT: N O W A I T; + +LOCKED: L O C K E D; +LOCK: L O C K; +IN: I N; +MODE: M O D E; + +INNER: I N N E R; +CROSS: C R O S S; +JOIN: J O I N; +ON: O N; +LEFT: L E F T; +RIGHT: R I G H T; +OUTER: O U T E R; +NATURAL: N A T U R A L; +USING: U S I N G; +USE: U S E; +INDEX: I N D E X; +KEY: K E Y; +IGNORE: I G N O R E; +FORCE: F O R C E; +UNION: U N I O N; + + +DEFAULT: D E F A U L T; +DELETE: D E L E T E; +QUICK: Q U I C K; +INSERT: I N S E R T; + +VALUES: V A L U E S; +VALUE: V A L U E; +DUPLICATE: D U P L I C A T E; + +EXISTS: E X I S T S; +IS: I S; +AND: A N D; +OR: O R; +XOR: X O R; +NOT: N O T; + + +BETWEEN: B E T W E E N; +NULL: N U L L; +TRUE:T R U E; +FALSE : F A L S E; +UNKNOWN: U N K N O W N; + +SOUNDS: S O U N D S; +LIKE: L I K E; +DIV: D I V; +MOD: M O D; +BINARY: B I N A R Y; +ROW: R O W; +ESCAPE: E S C A P E; +REGEXP: R E G E X P; + +DATE: D A T E; +TIME: T I M E; +TIMESTAMP:TIME S T A M P; + +CASE: C A S E; +WHEN: W H E N; +THEN: T H E N; +IF: I F; +ELSE: E L S E; +END: E N D; + + +ID: + (BACK_QUOTA?[a-zA-Z_$][a-zA-Z0-9_$]* BACK_QUOTA? DOT)? + (BACK_QUOTA?[a-zA-Z_$][a-zA-Z0-9_$]* BACK_QUOTA?) + |[a-zA-Z_$0-9]+ DOT ASTERISK + ; diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/MySQLBase.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/MySQLBase.g4 new file mode 100644 index 0000000000000000000000000000000000000000..8a863a6ccb821a5440caf24deae12018ea317e07 --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/MySQLBase.g4 @@ -0,0 +1,119 @@ +grammar MySQLBase; + +import MySQLKeyword,SQLBase,Keyword,Symbol; + +//https://dev.mysql.com/doc/refman/8.0/en/expressions.html +expr: + expr OR expr + | expr OR_SYM expr + | expr XOR expr + | expr AND expr + | expr AND_SYM expr + | LEFT_PAREN expr RIGHT_PAREN + | NOT expr + | NOT_SYM expr + | booleanPrimary + ; + +booleanPrimary: + booleanPrimary IS NOT? (TRUE | FALSE | UNKNOWN |NULL) + | booleanPrimary SAFE_EQ predicate + | booleanPrimary comparisonOperator predicate + | booleanPrimary comparisonOperator (ALL | ANY) subquery + | predicate + ; + +comparisonOperator: + EQ_OR_ASSIGN | GTE | GT | LTE | LT | NEQ_SYM | NEQ + ; + +predicate: + bitExpr NOT? IN subquery + | bitExpr NOT? IN LEFT_PAREN simpleExpr ( COMMA simpleExpr)* RIGHT_PAREN + | bitExpr NOT? BETWEEN simpleExpr AND predicate + | bitExpr SOUNDS LIKE simpleExpr + | bitExpr NOT? LIKE simpleExpr (ESCAPE simpleExpr)* + | bitExpr NOT? REGEXP simpleExpr + | bitExpr + ; + +bitExpr: + bitExpr BIT_INCLUSIVE_OR bitExpr + | bitExpr BIT_AND bitExpr + | bitExpr SIGNED_LEFT_SHIFT bitExpr + | bitExpr SIGNED_RIGHT_SHIFT bitExpr + | bitExpr PLUS bitExpr + | bitExpr MINUS bitExpr + | bitExpr ASTERISK bitExpr + | bitExpr SLASH bitExpr + | bitExpr DIV bitExpr + | bitExpr MOD bitExpr + | bitExpr MOD_SYM bitExpr + | bitExpr BIT_EXCLUSIVE_OR bitExpr + //| bitExpr '+' interval_expr + //| bitExpr '-' interval_expr + | simpleExpr + ; + +simpleExpr: + | functionCall + | liter + | ID + | simpleExpr collateClause + //| param_marker + //| variable + | simpleExpr AND_SYM simpleExpr + | PLUS simpleExpr + | MINUS simpleExpr + | UNARY_BIT_COMPLEMENT simpleExpr + | NOT_SYM simpleExpr + | BINARY simpleExpr + | LEFT_PAREN expr RIGHT_PAREN + | ROW LEFT_PAREN simpleExpr( COMMA simpleExpr)* RIGHT_PAREN + | subquery + | EXISTS subquery + // | (identifier expr) + //| match_expr + //| case_expr + // | interval_expr + ; + +liter: + QUESTION + |INT + |NUMBER + |TRUE + |FALSE + |NULL + |LEFT_BRACE ID STRING RIGHT_BRACE // + |HEX_DIGIT + |ID? STRING collateClause? + |(DATE | TIME |TIMESTAMP)STRING + |ID? BIT_NUM collateClause? + ; + +subquery: + ; + +collateClause: + COLLATE ID + ; + +functionCall: + ID LEFT_PAREN(|expr ( COMMA expr)*) RIGHT_PAREN + ; + +value: + DEFAULT|expr; + +valueList: + value (COMMA value)* + ; + +valueListWithParen: + LEFT_PAREN valueList RIGHT_PAREN + ; + +columnList: + LEFT_PAREN columnName (COMMA columnName)* RIGHT_PAREN + ; \ No newline at end of file diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/MySQLKeyword.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/MySQLKeyword.g4 new file mode 100644 index 0000000000000000000000000000000000000000..e6550aedc27c279b625acdf75a40957ff2d4bd42 --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/MySQLKeyword.g4 @@ -0,0 +1,104 @@ +lexer grammar MySQLKeyword; + +import Symbol; + +FIRST: F I R S T; +AFTER: A F T E R; +SPATIAL: S P A T I A L; +ALGORITHM: A L G O R I T H M; +CHANGE: C H A N G E; +DISCARD: D I S C A R D; +CHARACTER: C H A R A C T E R; +COLLATE: C O L L A T E; +CONVERT: C O N V E R T; +SHARED: S H A R E D; +EXCLUSIVE: E X C L U S I V E; +REORGANIZE: R E O R G A N I Z E; +EXCHANGE: E X C H A N G E; +BTREE: B T R E E; +HASH: H A S H; + + +KEY_BLOCK_SIZE: K E Y UL_ B L O C K UL_ S I Z E; +PARSER: P A R S E R; +COMMENT: C O M M E N T; +AUTO_INCREMENT: A U T O UL_ I N C R E M E N T; +AVG_ROW_LENGTH: A V G UL_ R O W UL_ L E N G T H; +CHECKSUM: C H E C K S U M; +COMPRESSION: C O M P R E S S I O N; +ZLIB: Z L I B; +LZ: L Z; +CONNECTION: C O N N E C T I O N; +DATA: D A T A; +DIRECTORY: D I R E C T O R Y; +DELAY_KEY_WRITE: D E L A Y UL_ K E Y UL_ W R I T E; +ENCRYPTION: E N C R Y P T I O N; +ENGINE: E N G I N E; +INSERT_METHOD: I N S E R T UL_ M E T H O D; +NO: N O; +LAST: L A S T; +MAX_ROWS: M A X UL_ R O W S; +MIN_ROWS: M I N UL_ R O W S; +PACK_KEYS: P A C K UL_ K E Y S; +PASSWORD: P A S S W O R D; +ROW_FORMAT: R O W UL_ F O R M A T; +DYNAMIC: D Y N A M I C; +FIXED: F I X E D; +COMPRESSED: C O M P R E S S E D; +REDUNDANT: R E D U N D A N T; +COMPACT: C O M P A C T; +STATS_AUTO_RECALC: S T A T S UL_ A U T O UL_ R E C A L C; +STATS_PERSISTENT: S T A T S UL_ P E R S I S T E N T; +STATS_SAMPLE_PAGES: S T A T S UL_ S A M P L E UL_ P A G E S; +STORAGE: S T O R A G E; +DISK: D I S K; +MEMORY: M E M O R Y; +PARTITIONING: P A R T I T I O N I N G; +GENERATED: G E N E R A T E D; +ALWAYS: A L W A Y S; +COLUMN_FORMAT: C O L U M N UL_ F O R M A T; +VIRTUAL: V I R T U A L; +STORED: S T O R E D; +INPLACE: I N P L A C E; +SUBPARTITION: S U B P A R T I T I O N; +MAXVALUE: M A X V A L U E; +LESS: L E S S; +THAN: T H A N; + +DISTINCTROW: D I S T I N C T R O W; +HIGH_PRIORITY: H I G H UL_ P R I O R I T Y; +STRAIGHT_JOIN: S T R A I G H T UL_ J O I N; +SQL_SMALL_RESULT: S Q L UL_ S M A L L UL_ R E S U L T; +SQL_BIG_RESULT: S Q L UL_ B I G UL_ R E S U L T; +SQL_BUFFER_RESULT: S Q L UL_ B U F F E R UL_ R E S U L T; +SQL_CACHE: S Q L UL_ C A C H E; +SQL_NO_CACHE: S Q L UL_ N O UL_ C A C H E; +SQL_CALC_FOUND_ROWS: S Q L UL_ C A L C UL_ F O U N D UL_ R O W S; + +REFERENCES: R E F E R E N C E S; +MATCH: M A T C H; +FULL: F U L L; +PARTIAL: P A R T I A L; +SIMPLE: S I M P L E; + +RESTRICT: R E S T R I C T; +CASCADE: C A S C A D E ; +ACTION: A C T I O N; + +LINEAR: L I N E A R; +COLUMNS: C O L U M N S; +RANGE: R A N G E; +LIST: L I S T; +PARTITIONS: P A R T I T I O N S; +SUBPARTITIONS: S U B P A R T I T I O N S; + +OUTFILE: O U T F I L E; +DUMPFILE: D U M P F I L E; + +SKIP_: S K I P; +OJ: O J; + +LOW_PRIORITY: L O W UL_ P R I O R I T Y; + +DELAYED: D E L A Y E D; + diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/SQLBase.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/SQLBase.g4 new file mode 100644 index 0000000000000000000000000000000000000000..eac4d987c203a29c57a7466b4e2bcda0e945cd91 --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/SQLBase.g4 @@ -0,0 +1,57 @@ +grammar SQLBase; + +import Keyword,Symbol; + + +expr: + ; + +itemList: + LEFT_PAREN item (COMMA item)* RIGHT_PAREN + ; + +item: + ; + +schemaName: ID; +tableName: ID; +columnName: ID; + +STRING: + DOUBLE_QUOTA ('\\"'|.)*? DOUBLE_QUOTA + |SINGLE_QUOTA (SINGLE_QUOTA |.)*? SINGLE_QUOTA + ; + + INT : + '0' | [1-9] [0-9]* + ; + + +NUMBER: + MINUS? INT DOT [0-9]+ EXP? + |MINUS? INT | EXP + |MINUS? INT + ; + +EXP : + E [+\-]? INT + ; + +fragment HEX : + [0-9a-fA-F] + ; + +HEX_DIGIT: + '0x' HEX+ + |'X' SINGLE_QUOTA HEX+ SINGLE_QUOTA + ; + +BIT_NUM: + ('0b' ('0'|'1')+) + | + (B SINGLE_QUOTA ('0'|'1')+ SINGLE_QUOTA) + ; + +WS: + [ \t\r\n] + ->skip + ; diff --git a/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/Symbol.g4 b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/Symbol.g4 new file mode 100644 index 0000000000000000000000000000000000000000..afadd6354f2d8307fd4fde07970fa589cf447e23 --- /dev/null +++ b/sharding-jdbc-ddl-parser/src/main/resources/io/shardingsphere/parser/antlr/Symbol.g4 @@ -0,0 +1,68 @@ +lexer grammar Symbol; + +AND_SYM: '&&'; +OR_SYM: '||'; +NOT_SYM: '!'; + +UNARY_BIT_COMPLEMENT: '~'; +BIT_INCLUSIVE_OR: '|'; +BIT_AND: '&'; +SIGNED_LEFT_SHIFT: '<<'; +SIGNED_RIGHT_SHIFT: '>>'; +BIT_EXCLUSIVE_OR: '^'; +MOD_SYM: '%'; + + +PLUS: '+' ; +MINUS: '-' ; +ASTERISK: '*' ; +SLASH: '/' ; +DOT: '.'; + +SAFE_EQ: '<=>'; +EQ: '=='; +EQ_OR_ASSIGN: '='; +NEQ: '!='; +NEQ_SYM: '<>'; +GT: '>'; +GTE: '>='; +LT: '<' ; +LTE: '<=' ; + +LEFT_PAREN: '('; +RIGHT_PAREN: ')'; +LEFT_BRACE: '{'; +RIGHT_BRACE: '}'; +COMMA: ','; +DOUBLE_QUOTA: '"'; +SINGLE_QUOTA: '\''; +BACK_QUOTA: '`'; +UL_: '_'; +QUESTION: '?' ; + +fragment A: [Aa]; +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];