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:
@@ -52,6 +52,8 @@ public class Keywords {
|
||||
map.put("DEFAULT", Token.DEFAULT);
|
||||
map.put("COLUMN", Token.COLUMN);
|
||||
map.put("TABLESPACE", Token.TABLESPACE);
|
||||
map.put("PROCEDURE", Token.PROCEDURE);
|
||||
map.put("FUNCTION", Token.FUNCTION);
|
||||
|
||||
map.put("DELETE", Token.DELETE);
|
||||
map.put("DESC", Token.DESC);
|
||||
|
||||
@@ -102,6 +102,7 @@ public class SQLParser {
|
||||
case SEQUENCE:
|
||||
case USER:
|
||||
case ANALYZE:
|
||||
case OPTIMIZE:
|
||||
case GRANT:
|
||||
alias = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
|
||||
@@ -21,6 +21,7 @@ import java.util.List;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLListExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn;
|
||||
@@ -51,6 +52,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExplainStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement.ObjectType;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
|
||||
@@ -318,41 +320,141 @@ public class SQLStatementParser extends SQLParser {
|
||||
SQLGrantStatement stmt = new SQLGrantStatement();
|
||||
|
||||
for (;;) {
|
||||
String privilege = null;
|
||||
if (lexer.token() == Token.ALL) {
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("PRIVILEGES")) {
|
||||
lexer.nextToken();
|
||||
stmt.addPrivileges("ALL PRIVILEGES");
|
||||
privilege = "ALL PRIVILEGES";
|
||||
} else {
|
||||
stmt.addPrivileges("ALL");
|
||||
privilege = "ALL";
|
||||
}
|
||||
} else if (lexer.token() == Token.SELECT) {
|
||||
stmt.addPrivileges("SELECT");
|
||||
privilege = "SELECT";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.UPDATE) {
|
||||
stmt.addPrivileges("UPDATE");
|
||||
privilege = "UPDATE";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.DELETE) {
|
||||
stmt.addPrivileges("DELETE");
|
||||
privilege = "DELETE";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.INSERT) {
|
||||
stmt.addPrivileges("INSERT");
|
||||
privilege = "INSERT";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.REFERENCES) {
|
||||
privilege = "REFERENCES";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.CREATE) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
stmt.addPrivileges("CREATE TABLE");
|
||||
privilege = "CREATE TABLE";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.SESSION) {
|
||||
privilege = "CREATE SESSION";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.ANY) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
lexer.nextToken();
|
||||
privilege = "CREATE ANY TABLE";
|
||||
} else if (identifierEquals("MATERIALIZED")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.VIEW);
|
||||
privilege = "CREATE ANY MATERIALIZED VIEW";
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else if (identifierEquals("SYNONYM")) {
|
||||
stmt.addPrivileges("CREATE SYNONYM");
|
||||
privilege = "CREATE SYNONYM";
|
||||
lexer.nextToken();
|
||||
} else if (identifierEquals("ROUTINE")) {
|
||||
privilege = "CREATE ROUTINE";
|
||||
lexer.nextToken();
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else if (identifierEquals("USAGE")) {
|
||||
stmt.addPrivileges("USAGE");
|
||||
} else if (lexer.token() == Token.ALTER) {
|
||||
lexer.nextToken();
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
privilege = "ALTER TABLE";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.SESSION) {
|
||||
privilege = "ALTER SESSION";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.ANY) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
lexer.nextToken();
|
||||
privilege = "ALTER ANY TABLE";
|
||||
} else if (identifierEquals("MATERIALIZED")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.VIEW);
|
||||
privilege = "ALTER ANY MATERIALIZED VIEW";
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else if (lexer.token() == Token.DROP) {
|
||||
lexer.nextToken();
|
||||
if (lexer.token() == Token.DROP) {
|
||||
privilege = "DROP TABLE";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.SESSION) {
|
||||
privilege = "DROP SESSION";
|
||||
lexer.nextToken();
|
||||
} else if (lexer.token() == Token.ANY) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
lexer.nextToken();
|
||||
privilege = "DROP ANY TABLE";
|
||||
} else if (identifierEquals("MATERIALIZED")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.VIEW);
|
||||
privilege = "DROP ANY MATERIALIZED VIEW";
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else if (identifierEquals("USAGE")) {
|
||||
privilege = "USAGE";
|
||||
lexer.nextToken();
|
||||
} else if (identifierEquals("EXECUTE")) {
|
||||
privilege = "EXECUTE";
|
||||
lexer.nextToken();
|
||||
} else if (identifierEquals("PROXY")) {
|
||||
privilege = "PROXY";
|
||||
lexer.nextToken();
|
||||
} else if (identifierEquals("QUERY")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("REWRITE");
|
||||
privilege = "QUERY REWRITE";
|
||||
} else if (identifierEquals("GLOBAL")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("QUERY");
|
||||
acceptIdentifier("REWRITE");
|
||||
privilege = "GLOBAL QUERY REWRITE";
|
||||
} else if (identifierEquals("INHERIT")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("PRIVILEGES");
|
||||
privilege = "INHERIT PRIVILEGES";
|
||||
}
|
||||
|
||||
if (privilege != null) {
|
||||
SQLExpr expr = new SQLIdentifierExpr(privilege);
|
||||
|
||||
if (lexer.token() == Token.LPAREN) {
|
||||
expr = this.exprParser.primaryRest(expr);
|
||||
}
|
||||
|
||||
expr.setParent(stmt);
|
||||
stmt.getPrivileges().add(expr);
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
@@ -364,6 +466,21 @@ public class SQLStatementParser extends SQLParser {
|
||||
|
||||
if (lexer.token() == Token.ON) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PROCEDURE) {
|
||||
lexer.nextToken();
|
||||
stmt.setObjectType(ObjectType.PROCEDURE);
|
||||
} else if (lexer.token() == Token.FUNCTION) {
|
||||
lexer.nextToken();
|
||||
stmt.setObjectType(ObjectType.FUNCTION);
|
||||
} else if (lexer.token() == Token.TABLE) {
|
||||
lexer.nextToken();
|
||||
stmt.setObjectType(ObjectType.TABLE);
|
||||
} else if (lexer.token() == Token.USER) {
|
||||
lexer.nextToken();
|
||||
stmt.setObjectType(ObjectType.USER);
|
||||
}
|
||||
|
||||
stmt.setOn(this.exprParser.expr());
|
||||
}
|
||||
|
||||
@@ -381,28 +498,34 @@ public class SQLStatementParser extends SQLParser {
|
||||
stmt.setMaxQueriesPerHour(this.exprParser.primary());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("MAX_UPDATES_PER_HOUR")) {
|
||||
lexer.nextToken();
|
||||
stmt.setMaxUpdatesPerHour(this.exprParser.primary());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("MAX_CONNECTIONS_PER_HOUR")) {
|
||||
lexer.nextToken();
|
||||
stmt.setMaxConnectionsPerHour(this.exprParser.primary());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("MAX_USER_CONNECTIONS")) {
|
||||
lexer.nextToken();
|
||||
stmt.setMaxUserConnections(this.exprParser.primary());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (identifierEquals("ADMIN")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("OPTION");
|
||||
stmt.setAdminOption(true);
|
||||
}
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
@@ -162,6 +162,7 @@ public enum Token {
|
||||
ADVISE("ADVISE"),
|
||||
SESSION("SESSION"),
|
||||
PROCEDURE("PROCEDURE"),
|
||||
FUNCTION("FUNCTION"),
|
||||
SYSDATE("SYSDATE"),
|
||||
DECLARE("DECLARE"),
|
||||
EXCEPTION("EXCEPTION"),
|
||||
@@ -204,6 +205,7 @@ public enum Token {
|
||||
|
||||
COMPUTE("COMPUTE"),
|
||||
ANALYZE("ANALYZE"),
|
||||
OPTIMIZE("OPTIMIZE"),
|
||||
|
||||
// transact-sql
|
||||
TOP("TOP"),
|
||||
|
||||
Reference in New Issue
Block a user