diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java index 6bf3ba71d8..de3d8b614b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java @@ -20,7 +20,6 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatementImpl; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLGrantStatement extends SQLStatementImpl { @@ -31,11 +30,14 @@ public class SQLGrantStatement extends SQLStatementImpl { private SQLExpr to; // mysql + private ObjectType objectType; private SQLExpr maxQueriesPerHour; private SQLExpr maxUpdatesPerHour; private SQLExpr maxConnectionsPerHour; private SQLExpr maxUserConnections; + private boolean adminOption; + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { @@ -45,6 +47,14 @@ public class SQLGrantStatement extends SQLStatementImpl { visitor.endVisit(this); } + public ObjectType getObjectType() { + return objectType; + } + + public void setObjectType(ObjectType objectType) { + this.objectType = objectType; + } + public SQLExpr getOn() { return on; } @@ -65,12 +75,6 @@ public class SQLGrantStatement extends SQLStatementImpl { return privileges; } - public void addPrivileges(String privilege) { - SQLIdentifierExpr expr = new SQLIdentifierExpr(privilege); - expr.setParent(this); - this.privileges.add(expr); - } - public SQLExpr getMaxQueriesPerHour() { return maxQueriesPerHour; } @@ -103,4 +107,15 @@ public class SQLGrantStatement extends SQLStatementImpl { this.maxUserConnections = maxUserConnections; } + public boolean isAdminOption() { + return adminOption; + } + + public void setAdminOption(boolean adminOption) { + this.adminOption = adminOption; + } + + public static enum ObjectType { + TABLE, FUNCTION, PROCEDURE, USER + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java new file mode 100644 index 0000000000..92a6eab2fd --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java @@ -0,0 +1,58 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlOptimizeStatement extends MySqlStatementImpl { + + private boolean noWriteToBinlog = false; + private boolean local = false; + + protected final List tableSources = new ArrayList(); + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, tableSources); + } + visitor.endVisit(this); + } + + public boolean isNoWriteToBinlog() { + return noWriteToBinlog; + } + + public void setNoWriteToBinlog(boolean noWriteToBinlog) { + this.noWriteToBinlog = noWriteToBinlog; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + + public List getTableSources() { + return tableSources; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index 0c150a4080..cd16e69125 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -50,6 +50,7 @@ public class MySqlLexer extends Lexer { map.put("SHOW", Token.SHOW); map.put("CACHE", Token.CACHE); map.put("ANALYZE", Token.ANALYZE); + map.put("OPTIMIZE", Token.OPTIMIZE); DEFAULT_MYSQL_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index cf7e544453..1c82b1b1ff 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -196,7 +196,7 @@ public class MySqlSelectParser extends SQLSelectParser { queryBlock.setLimit(parseLimit()); } - if (identifierEquals("PROCEDURE")) { + if (lexer.token() == Token.PROCEDURE) { lexer.nextToken(); throw new ParserException("TODO"); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index a1f58341cd..87e7454c56 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -85,6 +85,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStat import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement.LockType; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; @@ -506,6 +507,20 @@ public class MySqlStatementParser extends SQLStatementParser { } return stmt; } + + public MySqlOptimizeStatement parseOptimize() { + accept(Token.OPTIMIZE); + accept(Token.TABLE); + + MySqlOptimizeStatement stmt = new MySqlOptimizeStatement(); + List names = new ArrayList(); + this.exprParser.names(names, stmt); + + for (SQLName name : names) { + stmt.getTableSources().add(new SQLExprTableSource(name)); + } + return stmt; + } public SQLStatement parseReset() { acceptIdentifier(RESET); @@ -594,6 +609,12 @@ public class MySqlStatementParser extends SQLStatementParser { statementList.add(stmt); return true; } + + if (lexer.token() == Token.OPTIMIZE) { + SQLStatement stmt = parseOptimize(); + statementList.add(stmt); + return true; + } if (identifierEquals("HELP")) { lexer.nextToken(); @@ -910,7 +931,7 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - if (identifierEquals("FUNCTION")) { + if (lexer.token() == Token.FUNCTION) { lexer.nextToken(); MySqlShowCreateFunctionStatement stmt = new MySqlShowCreateFunctionStatement(); @@ -918,7 +939,7 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - if (identifierEquals("PROCEDURE")) { + if (lexer.token() == Token.PROCEDURE) { lexer.nextToken(); MySqlShowCreateProcedureStatement stmt = new MySqlShowCreateProcedureStatement(); @@ -997,7 +1018,7 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - if (identifierEquals("FUNCTION")) { + if (lexer.token() == Token.FUNCTION) { lexer.nextToken(); if (identifierEquals("CODE")) { @@ -1131,7 +1152,7 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - if (identifierEquals("PROCEDURE")) { + if (lexer.token() == Token.PROCEDURE) { lexer.nextToken(); if (identifierEquals("CODE")) { @@ -2342,7 +2363,7 @@ public class MySqlStatementParser extends SQLStatementParser { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("CHECK")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("OPTIMIZE")) { + } else if (lexer.token() == Token.OPTIMIZE) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("REBUILD")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index e6fe780ccb..86eb0f0622 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -56,6 +56,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByList; @@ -562,4 +563,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlAlterUserStatement x); void endVisit(MySqlAlterUserStatement x); + + boolean visit(MySqlOptimizeStatement x); + + void endVisit(MySqlOptimizeStatement x); } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index 1531e729bb..ea383b6be7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -58,6 +58,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByList; @@ -1247,4 +1248,14 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq public void endVisit(MySqlAlterUserStatement x) { } + + @Override + public boolean visit(MySqlOptimizeStatement x) { + return true; + } + + @Override + public void endVisit(MySqlOptimizeStatement x) { + + } } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 9b998d21fb..c3b0649920 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -80,6 +80,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByList; @@ -3022,6 +3023,28 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } + @Override + public boolean visit(MySqlOptimizeStatement x) { + print("OPTIMIZE "); + if (x.isNoWriteToBinlog()) { + print("NO_WRITE_TO_BINLOG "); + } + + if (x.isLocal()) { + print("LOCAL "); + } + + print("TABLE "); + + printAndAccept(x.getTableSources(), ", "); + return false; + } + + @Override + public void endVisit(MySqlOptimizeStatement x) { + + } + @Override public boolean visit(MySqlAlterUserStatement x) { print("ALTER USER"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 611799bd9e..d075e1e2aa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -71,6 +71,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlOptimizeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByList; @@ -1330,5 +1331,15 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlAlterUserStatement x) { } + + @Override + public boolean visit(MySqlOptimizeStatement x) { + return true; + } + + @Override + public void endVisit(MySqlOptimizeStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index dc286a3aca..3d3f6321ca 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -63,7 +63,6 @@ public class OracleLexer extends Lexer { map.put("OF", Token.OF); map.put("PRIOR", Token.PRIOR); - map.put("PROCEDURE", Token.PROCEDURE); map.put("REJECT", Token.REJECT); map.put("RETURNING", Token.RETURNING); map.put("SAVEPOINT", Token.SAVEPOINT); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Keywords.java b/src/main/java/com/alibaba/druid/sql/parser/Keywords.java index ad20650689..5a73682102 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Keywords.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Keywords.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java index 29ba3f36ea..2d08493863 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -102,6 +102,7 @@ public class SQLParser { case SEQUENCE: case USER: case ANALYZE: + case OPTIMIZE: case GRANT: alias = lexer.stringVal(); lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index b13df7b3e4..e83b8a5907 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 220f2e5aa3..d7ba8db1ab 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -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"), diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 5f9a9e314b..e9827013a6 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1723,6 +1723,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab if (x.getOn() != null) { print(" ON "); + + if (x.getObjectType() != null) { + print(x.getObjectType().name()); + print(' '); + } + x.getOn().accept(this); } @@ -1767,6 +1773,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab print(" MAX_USER_CONNECTIONS "); x.getMaxUserConnections().accept(this); } + + if (x.isAdminOption()) { + if (!with) { + print(" WITH"); + with = true; + } + print(" ADMIN OPTION"); + } return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_10.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_10.java new file mode 100644 index 0000000000..5c8fce6087 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_10.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_10 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_3.java new file mode 100644 index 0000000000..b28b1564b8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_3.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_3 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT ALL ON mydb.* TO 'someuser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT ALL ON mydb.* TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_4.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_4.java new file mode 100644 index 0000000000..1f6ef9f00b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_4.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_4 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost'"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_5.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_5.java new file mode 100644 index 0000000000..b6499ccfd4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_5.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_5 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_6.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_6.java new file mode 100644 index 0000000000..31fa674fe6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_6.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_6 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_7.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_7.java new file mode 100644 index 0000000000..9d285f4f0a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_7.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_7 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT SELECT(col1), INSERT(col1, col2) ON mydb.mytbl TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_8.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_8.java new file mode 100644 index 0000000000..ba9ea7baf0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_8.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_8 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_9.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_9.java new file mode 100644 index 0000000000..3dfb9c59bd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_9.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlGrantTest_9 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost'", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlOptimizeTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlOptimizeTest_1.java new file mode 100644 index 0000000000..1231561ccb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlOptimizeTest_1.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlOptimizeTest_1 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "OPTIMIZE TABLE t1,t2"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("OPTIMIZE TABLE t1, t2", // + output); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_1.java new file mode 100644 index 0000000000..a472ac7646 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_1.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleGrantTest_1 extends OracleTest { + + public void test_0() throws Exception { + String sql = "GRANT CREATE SESSION TO hr;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("GRANT CREATE SESSION TO hr",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_2.java new file mode 100644 index 0000000000..98a0cccf27 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_2.java @@ -0,0 +1,74 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleGrantTest_2 extends OracleTest { + + public void test_0() throws Exception { + String sql = "GRANT" // + + " CREATE ANY MATERIALIZED VIEW" // + + " , ALTER ANY MATERIALIZED VIEW" // + + " , DROP ANY MATERIALIZED VIEW" // + + " , QUERY REWRITE" // + + " , GLOBAL QUERY REWRITE" // + + " TO dw_manager" // + + " WITH ADMIN OPTION;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("GRANT CREATE ANY MATERIALIZED VIEW,"// + + " ALTER ANY MATERIALIZED VIEW,"// + + " DROP ANY MATERIALIZED VIEW,"// + + " QUERY REWRITE,"// + + " GLOBAL QUERY REWRITE"// + + " TO dw_manager"// + + " WITH ADMIN OPTION",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_3.java new file mode 100644 index 0000000000..783bbba4fc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_3.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleGrantTest_3 extends OracleTest { + + public void test_0() throws Exception { + String sql = "GRANT INHERIT PRIVILEGES ON USER sh TO hr;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("GRANT INHERIT PRIVILEGES ON USER sh TO hr",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_4.java new file mode 100644 index 0000000000..c238d64a54 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGrantTest_4.java @@ -0,0 +1,66 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleGrantTest_4 extends OracleTest { + + public void test_0() throws Exception { + String sql = "GRANT REFERENCES (employee_id), " // + + " UPDATE (employee_id, salary, commission_pct) " // + + " ON hr.employees" // + + " TO oe; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("GRANT REFERENCES(employee_id),"// + + " UPDATE(employee_id, salary, commission_pct)"// + + " ON hr.employees TO oe",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +}