From 65dc02f6d01c8959eece8ee7c68ba9fc063a1722 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 7 Aug 2013 23:59:27 +0800 Subject: [PATCH] improve sql parser --- .../sql/ast/statement/SQLGrantStatement.java | 11 +++ .../statement/MySqlSetPasswordStatement.java | 58 +++++++++++++++ .../mysql/parser/MySqlStatementParser.java | 17 +++++ .../mysql/visitor/MySqlASTVisitor.java | 5 ++ .../mysql/visitor/MySqlASTVisitorAdapter.java | 11 +++ .../mysql/visitor/MySqlOutputVisitor.java | 24 ++++++ .../mysql/visitor/MySqlSchemaStatVisitor.java | 11 +++ .../druid/sql/parser/SQLStatementParser.java | 6 ++ .../sql/visitor/SQLASTOutputVisitor.java | 5 ++ .../com/alibaba/druid/wall/WallProvider.java | 74 ++++++++----------- .../bvt/filter/wall/WallProviderTest.java | 2 +- .../filter/wall/WallStatTest_WhiteList.java | 2 +- .../bvt/sql/mysql/MySqlGrantTest_34.java | 61 +++++++++++++++ .../bvt/sql/mysql/MySqlSetPasswordTest.java | 61 +++++++++++++++ 14 files changed, 303 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetPasswordStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_34.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetPasswordTest.java 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 de3d8b614b..9ce3574936 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 @@ -38,11 +38,14 @@ public class SQLGrantStatement extends SQLStatementImpl { private boolean adminOption; + private SQLExpr identifiedBy; + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, on); acceptChild(visitor, to); + acceptChild(visitor, identifiedBy); } visitor.endVisit(this); } @@ -115,6 +118,14 @@ public class SQLGrantStatement extends SQLStatementImpl { this.adminOption = adminOption; } + public SQLExpr getIdentifiedBy() { + return identifiedBy; + } + + public void setIdentifiedBy(SQLExpr identifiedBy) { + this.identifiedBy = identifiedBy; + } + public static enum ObjectType { TABLE, FUNCTION, PROCEDURE, USER } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetPasswordStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetPasswordStatement.java new file mode 100644 index 0000000000..a76bf1e9dc --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetPasswordStatement.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 com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlSetPasswordStatement extends MySqlStatementImpl { + + private SQLName user; + private SQLExpr password; + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, user); + acceptChild(visitor, password); + } + visitor.endVisit(this); + } + + public SQLName getUser() { + return user; + } + + public void setUser(SQLName user) { + if (user != null) { + user.setParent(this); + } + + this.user = user; + } + + public SQLExpr getPassword() { + return password; + } + + public void setPassword(SQLExpr password) { + if (password != null) { + password.setParent(this); + } + this.password = password; + } + +} 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 007778a8eb..8c82816f75 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 @@ -92,6 +92,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRollbackStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; @@ -1993,6 +1994,22 @@ public class MySqlStatementParser extends SQLStatementParser { public SQLStatement parseSet() { accept(Token.SET); + if (identifierEquals("PASSWORD")) { + lexer.nextToken(); + MySqlSetPasswordStatement stmt = new MySqlSetPasswordStatement(); + + if (lexer.token() == Token.FOR) { + lexer.nextToken(); + stmt.setUser(this.exprParser.name()); + } + + accept(Token.EQ); + + stmt.setPassword(this.exprParser.expr()); + + return stmt; + } + Boolean global = null; if (identifierEquals(GLOBAL)) { global = Boolean.TRUE; 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 d6e36b278b..b44531064f 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 @@ -69,6 +69,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; @@ -557,4 +558,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlOptimizeStatement x); void endVisit(MySqlOptimizeStatement x); + + boolean visit(MySqlSetPasswordStatement x); + + void endVisit(MySqlSetPasswordStatement 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 cd3d0de112..e18f3d2ccc 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 @@ -74,6 +74,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; @@ -1236,4 +1237,14 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq public void endVisit(MySqlOptimizeStatement x) { } + + @Override + public boolean visit(MySqlSetPasswordStatement x) { + return true; + } + + @Override + public void endVisit(MySqlSetPasswordStatement 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 951581c69d..fbe629c75e 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 @@ -97,6 +97,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; @@ -2999,4 +3000,27 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } + @Override + public boolean visit(MySqlSetPasswordStatement x) { + print("SET PASSWORD "); + + if (x.getUser() != null){ + print("FOR "); + x.getUser().accept(this); + print(' '); + } + + print("= "); + + if (x.getPassword() != null) { + x.getPassword().accept(this); + } + return false; + } + + @Override + public void endVisit(MySqlSetPasswordStatement x) { + + } + } // 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 e67a9621ad..07081d3974 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 @@ -88,6 +88,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetPasswordStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowAuthorsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowBinLogEventsStatement; @@ -1322,5 +1323,15 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlOptimizeStatement x) { } + + @Override + public boolean visit(MySqlSetPasswordStatement x) { + return false; + } + + @Override + public void endVisit(MySqlSetPasswordStatement x) { + + } } 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 b34e6b6c25..474d3c8639 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -616,6 +616,12 @@ public class SQLStatementParser extends SQLParser { acceptIdentifier("OPTION"); stmt.setAdminOption(true); } + + if (lexer.token() == Token.IDENTIFIED) { + lexer.nextToken(); + accept(Token.BY); + stmt.setIdentifiedBy(this.exprParser.expr()); + } return stmt; } 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 c5c175f0ef..0c74f07ddc 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1774,6 +1774,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab } print(" ADMIN OPTION"); } + + if (x.getIdentifiedBy() != null) { + print(" IDENTIFIED BY "); + x.getIdentifiedBy().accept(this); + } return false; } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 517bb20f63..f5c8019a87 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -55,7 +55,6 @@ public abstract class WallProvider { 1); private LRUCache whiteList; - private LRUCache whiteMergedList; private int MAX_SQL_LENGTH = 2048; // 1k @@ -252,11 +251,11 @@ public abstract class WallProvider { WallSqlStat mergedStat; lock.readLock().lock(); try { - if (whiteMergedList == null) { - whiteMergedList = new LRUCache(whiteSqlMaxSize); + if (whiteList == null) { + whiteList = new LRUCache(whiteSqlMaxSize); } - mergedStat = whiteMergedList.get(mergedSql); + mergedStat = whiteList.get(mergedSql); } finally { lock.readLock().unlock(); } @@ -267,9 +266,9 @@ public abstract class WallProvider { lock.writeLock().lock(); try { - mergedStat = whiteMergedList.get(mergedSql); + mergedStat = whiteList.get(mergedSql); if (mergedStat == null) { - whiteMergedList.put(mergedSql, newStat); + whiteList.put(mergedSql, newStat); mergedStat = newStat; } } finally { @@ -288,21 +287,13 @@ public abstract class WallProvider { whiteList = new LRUCache(whiteSqlMaxSize); } - if (whiteMergedList == null) { - whiteMergedList = new LRUCache(whiteSqlMaxSize); - } - WallSqlStat wallStat = whiteList.get(sql); if (wallStat == null) { - wallStat = whiteMergedList.get(mergedSql); - if (wallStat == null) { - wallStat = new WallSqlStat(tableStats, functionStats, syntaxError); - whiteMergedList.put(mergedSql, wallStat); - wallStat.setSample(sql); - } + wallStat = new WallSqlStat(tableStats, functionStats, syntaxError); + whiteList.put(sql, wallStat); + wallStat.setSample(sql); wallStat.incrementAndGetExecuteCount(); - whiteList.put(sql, wallStat); } return wallStat; @@ -369,9 +360,10 @@ public abstract class WallProvider { Set hashSet = new HashSet(); lock.readLock().lock(); try { - if (whiteMergedList != null) { - hashSet.addAll(whiteMergedList.keySet()); + if (whiteList != null) { + hashSet.addAll(whiteList.keySet()); } + if (blackMergedList != null) { hashSet.addAll(blackMergedList.keySet()); } @@ -402,9 +394,6 @@ public abstract class WallProvider { if (whiteList != null) { whiteList = null; } - if (whiteMergedList != null) { - whiteMergedList = null; - } if (blackList != null) { blackList = null; @@ -443,32 +432,31 @@ public abstract class WallProvider { WallSqlStat stat = null; lock.readLock().lock(); try { - if (whiteList != null) { - stat = whiteList.get(sql); + if (whiteList == null) { + return null; } + stat = whiteList.get(sql); } finally { lock.readLock().unlock(); } - if (stat == null) { - String mergedSql; - try { - mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType); - } catch (Exception ex) { - // skip - return null; - } + if (stat != null) { + return stat; + } - lock.readLock().lock(); - try { - if (whiteMergedList == null) { - return null; - } + String mergedSql; + try { + mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType); + } catch (Exception ex) { + // skip + return null; + } - stat = whiteMergedList.get(mergedSql); - } finally { - lock.readLock().unlock(); - } + lock.readLock().lock(); + try { + stat = whiteList.get(mergedSql); + } finally { + lock.readLock().unlock(); } return stat; } @@ -919,8 +907,8 @@ public abstract class WallProvider { final Lock lock = reset ? this.lock.writeLock() : this.lock.readLock(); lock.lock(); try { - if (this.whiteMergedList != null) { - for (Map.Entry entry : whiteMergedList.entrySet()) { + if (this.whiteList != null) { + for (Map.Entry entry : whiteList.entrySet()) { String sql = entry.getKey(); WallSqlStat sqlStat = entry.getValue(); WallSqlStatValue sqlStatValue = sqlStat.getStatValue(reset); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallProviderTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallProviderTest.java index 1a5196b1eb..659d83529d 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallProviderTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallProviderTest.java @@ -52,7 +52,7 @@ public class WallProviderTest extends TestCase { Assert.assertSame(whiteStat_1, provider.getSqlStat(sql_x)); } - Assert.assertEquals(0, provider.getWhiteList().size()); + Assert.assertEquals(1, provider.getWhiteList().size()); Assert.assertEquals(2, provider.getSqlList().size()); Assert.assertFalse(provider.checkValid("slelc")); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java index f93335737d..70fc04dd9e 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java @@ -31,7 +31,7 @@ public class WallStatTest_WhiteList extends TestCase { Assert.assertEquals(3001, tableStat.getSelectCount()); Assert.assertEquals(0, provider.getBlackListHitCount()); Assert.assertEquals(3000, provider.getWhiteListHitCount()); - Assert.assertEquals(0, provider.getWhiteList().size()); + Assert.assertEquals(1, provider.getWhiteList().size()); Assert.assertEquals(3001, provider.getCheckCount()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_34.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_34.java new file mode 100644 index 0000000000..908627109d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlGrantTest_34.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_34 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "GRANT USAGE ON *.* TO 'bob'@'%.example.org' IDENTIFIED BY 'cleartext password';"; + + 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 USAGE ON *.* TO 'bob'@'%.example.org' IDENTIFIED BY 'cleartext password'", // + 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/MySqlSetPasswordTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetPasswordTest.java new file mode 100644 index 0000000000..b66613ac9c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetPasswordTest.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 MySqlSetPasswordTest extends MysqlTest { + + public void test_0() throws Exception { + String sql = "SET PASSWORD FOR 'bob'@'%.example.org' = PASSWORD('cleartext password');"; + + 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("SET PASSWORD FOR 'bob'@'%.example.org' = PASSWORD('cleartext password')", // + 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"))); + } +}