mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improve sql parser
This commit is contained in:
@@ -257,6 +257,54 @@ public class SQLExprParser extends SQLParser {
|
||||
case WITH:
|
||||
case GRANT:
|
||||
case REPLACE:
|
||||
case INDEX:
|
||||
case MODEL:
|
||||
case PCTFREE:
|
||||
case INITRANS:
|
||||
case MAXTRANS:
|
||||
case SEGMENT:
|
||||
case CREATION:
|
||||
case IMMEDIATE:
|
||||
case DEFERRED:
|
||||
case STORAGE:
|
||||
case NEXT:
|
||||
case MINEXTENTS:
|
||||
case MAXEXTENTS:
|
||||
case MAXSIZE:
|
||||
case PCTINCREASE:
|
||||
case FLASH_CACHE:
|
||||
case CELL_FLASH_CACHE:
|
||||
case KEEP:
|
||||
case NONE:
|
||||
case LOB:
|
||||
case STORE:
|
||||
case ROW:
|
||||
case CHUNK:
|
||||
case CACHE:
|
||||
case NOCACHE:
|
||||
case LOGGING:
|
||||
case NOCOMPRESS:
|
||||
case KEEP_DUPLICATES:
|
||||
case EXCEPTIONS:
|
||||
case PURGE:
|
||||
case FULL:
|
||||
case TO:
|
||||
case IDENTIFIED:
|
||||
case PASSWORD:
|
||||
case BINARY:
|
||||
case WINDOW:
|
||||
case OFFSET:
|
||||
case SHARE:
|
||||
case START:
|
||||
case CONNECT:
|
||||
case MATCHED:
|
||||
case ERRORS:
|
||||
case REJECT:
|
||||
case UNLIMITED:
|
||||
case BEGIN:
|
||||
case EXCLUSIVE:
|
||||
case MODE:
|
||||
case ADVISE:
|
||||
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
break;
|
||||
|
||||
@@ -104,6 +104,28 @@ public class SQLParser {
|
||||
case ANALYZE:
|
||||
case OPTIMIZE:
|
||||
case GRANT:
|
||||
case FULL:
|
||||
case TO:
|
||||
case NEW:
|
||||
case INTERVAL:
|
||||
case LOCK:
|
||||
case LIMIT:
|
||||
case IDENTIFIED:
|
||||
case PASSWORD:
|
||||
case BINARY:
|
||||
case WINDOW:
|
||||
case OFFSET:
|
||||
case SHARE:
|
||||
case START:
|
||||
case CONNECT:
|
||||
case MATCHED:
|
||||
case ERRORS:
|
||||
case REJECT:
|
||||
case UNLIMITED:
|
||||
case BEGIN:
|
||||
case EXCLUSIVE:
|
||||
case MODE:
|
||||
case ADVISE:
|
||||
alias = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
return alias;
|
||||
|
||||
@@ -350,6 +350,12 @@ public class SQLStatementParser extends SQLParser {
|
||||
} else if (lexer.token() == Token.INSERT) {
|
||||
privilege = "INSERT";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.INDEX) {
|
||||
lexer.nextToken();
|
||||
privilege = "INDEX";
|
||||
} else if (lexer.token() == Token.TRIGGER) {
|
||||
lexer.nextToken();
|
||||
privilege = "TRIGGER";
|
||||
} else if (lexer.token() == Token.REFERENCES) {
|
||||
privilege = "REFERENCES";
|
||||
lexer.nextToken();
|
||||
@@ -362,6 +368,15 @@ public class SQLStatementParser extends SQLParser {
|
||||
} else if (lexer.token() == Token.SESSION) {
|
||||
privilege = "CREATE SESSION";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.TABLESPACE) {
|
||||
privilege = "CREATE TABLESPACE";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.USER) {
|
||||
privilege = "CREATE USER";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.VIEW) {
|
||||
privilege = "CREATE VIEW";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.ANY) {
|
||||
lexer.nextToken();
|
||||
|
||||
@@ -381,6 +396,10 @@ public class SQLStatementParser extends SQLParser {
|
||||
} else if (identifierEquals("ROUTINE")) {
|
||||
privilege = "CREATE ROUTINE";
|
||||
lexer.nextToken();
|
||||
} else if (identifierEquals("TEMPORARY")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.TABLE);
|
||||
privilege = "CREATE TEMPORARY TABLE";
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
@@ -430,7 +449,7 @@ public class SQLStatementParser extends SQLParser {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
privilege = "DROP";
|
||||
}
|
||||
} else if (identifierEquals("USAGE")) {
|
||||
privilege = "USAGE";
|
||||
@@ -454,6 +473,51 @@ public class SQLStatementParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("PRIVILEGES");
|
||||
privilege = "INHERIT PRIVILEGES";
|
||||
} else if (identifierEquals("EVENT")) {
|
||||
lexer.nextToken();
|
||||
privilege = "EVENT";
|
||||
} else if (identifierEquals("FILE")) {
|
||||
lexer.nextToken();
|
||||
privilege = "FILE";
|
||||
} else if (lexer.token() == Token.GRANT) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("OPTION");
|
||||
privilege = "GRANT OPTION";
|
||||
} else if (lexer.token() == Token.LOCK) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("TABLES");
|
||||
privilege = "LOCK TABLES";
|
||||
} else if (identifierEquals("PROCESS")) {
|
||||
lexer.nextToken();
|
||||
privilege = "PROCESS";
|
||||
} else if (identifierEquals("RELOAD")) {
|
||||
lexer.nextToken();
|
||||
privilege = "RELOAD";
|
||||
} else if (identifierEquals("REPLICATION")) {
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("SLAVE")) {
|
||||
lexer.nextToken();
|
||||
privilege = "REPLICATION SLAVE";
|
||||
} else {
|
||||
acceptIdentifier("CLIENT");
|
||||
privilege = "REPLICATION CLIENT";
|
||||
}
|
||||
} else if (lexer.token() == Token.SHOW) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.VIEW) {
|
||||
lexer.nextToken();
|
||||
privilege = "SHOW VIEW";
|
||||
} else {
|
||||
acceptIdentifier("DATABASES");
|
||||
privilege = "SHOW DATABASES";
|
||||
}
|
||||
} else if (identifierEquals("SHUTDOWN")) {
|
||||
lexer.nextToken();
|
||||
privilege = "SHUTDOWN";
|
||||
} else if (identifierEquals("SUPER")) {
|
||||
lexer.nextToken();
|
||||
privilege = "SUPER";
|
||||
}
|
||||
|
||||
if (privilege != null) {
|
||||
|
||||
@@ -22,43 +22,55 @@ package com.alibaba.druid.sql.parser;
|
||||
* @formatter:off
|
||||
*/
|
||||
public enum Token {
|
||||
EXPLAIN("EXPLAIN"),
|
||||
FOR("FOR"),
|
||||
IF("IF"),
|
||||
SELECT("SELECT"),
|
||||
DELETE("DELETE"),
|
||||
INSERT("INSERT"),
|
||||
UPDATE("UPDATE"),
|
||||
|
||||
FROM("FROM"),
|
||||
HAVING("HAVING"),
|
||||
WHERE("WHERE"),
|
||||
ORDER("ORDER"),
|
||||
BY("BY"),
|
||||
GROUP("GROUP"),
|
||||
INTO("INTO"),
|
||||
AS("AS"),
|
||||
|
||||
CREATE("CREATE"),
|
||||
ALTER("ALTER"),
|
||||
DROP("DROP"),
|
||||
SET("SET"),
|
||||
|
||||
NULL("NULL"),
|
||||
NOT("NOT"),
|
||||
DISTINCT("DISTINCT"),
|
||||
|
||||
TABLE("TABLE"),
|
||||
TABLESPACE("TABLESPACE"),
|
||||
VIEW("VIEW"),
|
||||
SEQUENCE("SEQUENCE"),
|
||||
TRIGGER("TRIGGER"),
|
||||
USER("USER"),
|
||||
INDEX("INDEX"),
|
||||
SESSION("SESSION"),
|
||||
PROCEDURE("PROCEDURE"),
|
||||
FUNCTION("FUNCTION"),
|
||||
|
||||
PRIMARY("PRIMARY"),
|
||||
KEY("KEY"),
|
||||
DEFAULT("DEFAULT"),
|
||||
CONSTRAINT("CONSTRAINT"),
|
||||
CHECK("CHECK"),
|
||||
VIEW("VIEW"),
|
||||
SEQUENCE("SEQUENCE"),
|
||||
TRIGGER("TRIGGER"),
|
||||
USER("USER"),
|
||||
CREATE("CREATE"),
|
||||
ALTER("ALTER"),
|
||||
DROP("DROP"),
|
||||
TABLE("TABLE"),
|
||||
TABLESPACE("TABLESPACE"),
|
||||
UPDATE("UPDATE"),
|
||||
SET("SET"),
|
||||
SELECT("SELECT"),
|
||||
FROM("FROM"),
|
||||
WHERE("WHERE"),
|
||||
ORDER("ORDER"),
|
||||
BY("BY"),
|
||||
GROUP("GROUP"),
|
||||
HAVING("HAVING"),
|
||||
INSERT("INSERT"),
|
||||
INTO("INTO"),
|
||||
NULL("NULL"),
|
||||
NOT("NOT"),
|
||||
AS("AS"),
|
||||
DELETE("DELETE"),
|
||||
DISTINCT("DISTINCT"),
|
||||
UNIQUE("UNIQUE"),
|
||||
FOREIGN("FOREIGN"),
|
||||
REFERENCES("REFERENCES"),
|
||||
|
||||
EXPLAIN("EXPLAIN"),
|
||||
FOR("FOR"),
|
||||
IF("IF"),
|
||||
|
||||
|
||||
|
||||
ALL("ALL"),
|
||||
UNION("UNION"),
|
||||
INTERSECT("INTERSECT"),
|
||||
@@ -160,9 +172,6 @@ public enum Token {
|
||||
MODE("MODE"),
|
||||
WAIT("WAIT"),
|
||||
ADVISE("ADVISE"),
|
||||
SESSION("SESSION"),
|
||||
PROCEDURE("PROCEDURE"),
|
||||
FUNCTION("FUNCTION"),
|
||||
SYSDATE("SYSDATE"),
|
||||
DECLARE("DECLARE"),
|
||||
EXCEPTION("EXCEPTION"),
|
||||
|
||||
Reference in New Issue
Block a user