diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java index e3551ad0e3..51db4acc3c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java @@ -4,9 +4,15 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcUtils; public class HiveSchemaStatVisitor extends SchemaStatVisitor implements HiveASTVisitor { + @Override + public String getDbType() { + return JdbcUtils.HIVE; + } + @Override public void endVisit(HiveCreateTableStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java new file mode 100644 index 0000000000..1b496395f4 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class MySqlAlterTableAddUnique extends SQLAlterTableAddIndex implements SQLAlterTableItem, MySqlObject { + + private static final long serialVersionUID = 1L; + + private String using; + + public String getUsing() { + return using; + } + + public void setUsing(String using) { + this.using = using; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, getName()); + acceptChild(visitor, getItems()); + } + visitor.endVisit(this); + } + +} 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 6868313458..3a5f223045 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 @@ -42,6 +42,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; @@ -2065,10 +2066,14 @@ public class MySqlStatementParser extends SQLStatementParser { } else if (lexer.token() == Token.INDEX) { lexer.nextToken(); MySqlAlterTableAddIndex item = new MySqlAlterTableAddIndex(); - item.setName(this.exprParser.name()); - accept(Token.LPAREN); - + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + } else { + item.setName(this.exprParser.name()); + accept(Token.LPAREN); + } + for (;;) { SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); item.getItems().add(column); @@ -2082,7 +2087,28 @@ public class MySqlStatementParser extends SQLStatementParser { stmt.getItems().add(item); } else if (lexer.token() == Token.UNIQUE) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + lexer.nextToken(); + MySqlAlterTableAddUnique item = new MySqlAlterTableAddUnique(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + } else { + item.setName(this.exprParser.name()); + accept(Token.LPAREN); + } + + for (;;) { + SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); + item.getItems().add(column); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + + stmt.getItems().add(item); } else if (lexer.token() == Token.KEY) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (lexer.token() == Token.CONSTRAINT) { 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 d77ebc7d3c..71909b806e 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 @@ -31,6 +31,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; @@ -510,4 +511,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlCharExpr x); void endVisit(MySqlCharExpr x); + + boolean visit(MySqlAlterTableAddUnique x); + + void endVisit(MySqlAlterTableAddUnique 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 a389c55bfe..eb0d90e8ce 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 @@ -16,6 +16,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; @@ -1105,11 +1106,21 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public boolean visit(MySqlCharExpr x) { - return false; + return true; } @Override public void endVisit(MySqlCharExpr x) { } + + @Override + public boolean visit(MySqlAlterTableAddUnique x) { + return true; + } + + @Override + public void endVisit(MySqlAlterTableAddUnique 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 fee8400a20..94da69584b 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 @@ -48,6 +48,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; @@ -163,7 +164,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } print("SELECT "); - for (SQLCommentHint hint : x.getHints()) { hint.accept(this); @@ -2548,8 +2548,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print("INDEX "); - x.getName().accept(this); - print(" ("); + if (x.getName() != null) { + x.getName().accept(this); + print(' '); + } + print("("); printAndAccept(x.getItems(), ", "); print(")"); @@ -2563,6 +2566,36 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlAlterTableAddIndex x) { + } + + @Override + public boolean visit(MySqlAlterTableAddUnique x) { + print("ADD "); + if (x.getType() != null) { + print(x.getType()); + print(" "); + } + + print("UNIQUE "); + + if (x.getName() != null) { + x.getName().accept(this); + print(' '); + } + print("("); + printAndAccept(x.getItems(), ", "); + print(")"); + + if (x.getUsing() != null) { + print(" USING "); + print(x.getUsing()); + } + return false; + } + + @Override + public void endVisit(MySqlAlterTableAddUnique x) { + } @Override @@ -2592,7 +2625,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlHelpStatement x) { - + } @Override @@ -2603,6 +2636,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlCharExpr 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 1fc9e5a9c8..9c0b7f5f7f 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 @@ -27,6 +27,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; @@ -112,6 +113,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Mode; +import com.alibaba.druid.util.JdbcUtils; public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlASTVisitor { @@ -121,6 +123,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS return true; } + + @Override + public String getDbType() { + return JdbcUtils.MYSQL; + } // DUAL public boolean visit(MySqlDeleteStatement x) { @@ -1177,4 +1184,14 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlCharExpr x) { } + + @Override + public boolean visit(MySqlAlterTableAddUnique x) { + return false; + } + + @Override + public void endVisit(MySqlAlterTableAddUnique x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 3c10f441d8..df270b11ea 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -1,5 +1,7 @@ package com.alibaba.druid.sql.dialect.oracle.visitor; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import com.alibaba.druid.sql.ast.SQLExpr; @@ -140,15 +142,26 @@ import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Mode; import com.alibaba.druid.stat.TableStat.Relationship; +import com.alibaba.druid.util.JdbcUtils; public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor { public OracleSchemaStatVisitor(){ + this (new ArrayList()); + } + + public OracleSchemaStatVisitor(List parameters) { + super (parameters); this.variants.put("DUAL", null); this.variants.put("NOTFOUND", null); this.variants.put("TRUE", null); this.variants.put("FALSE", null); } + + @Override + public String getDbType() { + return JdbcUtils.ORACLE; + } protected Column getColumn(SQLExpr expr) { if (expr instanceof OracleOuterExpr) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index e5da2b730d..252bcbaf05 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -23,9 +23,15 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Mode; +import com.alibaba.druid.util.JdbcUtils; public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisitor { + @Override + public String getDbType() { + return JdbcUtils.POSTGRESQL; + } + @Override public void endVisit(WindowClause x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index ab6f7bfb31..c10782edbc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -5,10 +5,16 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcUtils; public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQLServerASTVisitor { + @Override + public String getDbType() { + return JdbcUtils.SQL_SERVER; + } + @Override public boolean visit(SQLServerSelectQueryBlock x) { return visit((SQLSelectQueryBlock) x); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 500a4e2ddb..160e6667ad 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -1,5 +1,6 @@ package com.alibaba.druid.sql.visitor; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -52,7 +53,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { protected final HashMap tableStats = new LinkedHashMap(); protected final Set columns = new LinkedHashSet(); - protected final Set conditions = new LinkedHashSet(); + protected final List conditions = new ArrayList(); protected final Set relationships = new LinkedHashSet(); protected final Set orderByColumns = new LinkedHashSet(); protected final Set groupByColumns = new LinkedHashSet(); @@ -68,8 +69,26 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public final static String ATTR_TABLE = "_table_"; public final static String ATTR_COLUMN = "_column_"; + private List parameters; + private Mode mode; + public SchemaStatVisitor(){ + this(new ArrayList()); + } + + public SchemaStatVisitor(List parameters){ + this.parameters = parameters; + } + + public List getParameters() { + return parameters; + } + + public void setParameters(List parameters) { + this.parameters = parameters; + } + public TableStat getTableStat(String ident) { return getTableStat(ident, null); } @@ -247,7 +266,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return groupByColumns; } - public Set getConditions() { + public List getConditions() { return conditions; } @@ -267,8 +286,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { case NotLike: case Is: case IsNot: - handleCondition(x.getLeft(), x.getOperator().name); - handleCondition(x.getRight(), x.getOperator().name); + handleCondition(x.getLeft(), x.getOperator().name, x.getRight()); + handleCondition(x.getRight(), x.getOperator().name, x.getLeft()); handleRelationship(x.getLeft(), x.getOperator().name, x.getRight()); break; @@ -297,16 +316,39 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { this.relationships.add(relationship); } - protected void handleCondition(SQLExpr expr, String operator) { + protected void handleCondition(SQLExpr expr, String operator, List values) { + handleCondition(expr, operator, values.toArray(new SQLExpr[values.size()])); + } + + protected void handleCondition(SQLExpr expr, String operator, SQLExpr... valueExprs) { Column column = getColumn(expr); if (column == null) { return; } - Condition condition = new Condition(); - condition.setColumn(column); - condition.setOperator(operator); - this.conditions.add(condition); + Condition condition = null; + for (Condition item : this.getConditions()) { + if (item.getColumn().equals(column) && item.getOperator().equals(operator)) { + condition = item; + break; + } + } + + if (condition == null) { + condition = new Condition(); + condition.setColumn(column); + condition.setOperator(operator); + this.conditions.add(condition); + } + + for (SQLExpr item : valueExprs) { + Object value = SQLEvalVisitorUtils.eval(getDbType(), item, parameters); + condition.getValues().add(value); + } + } + + public String getDbType() { + return null; } protected Column getColumn(SQLExpr expr) { @@ -820,9 +862,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLInListExpr x) { if (x.isNot()) { - handleCondition(x.getExpr(), "NOT IN"); + handleCondition(x.getExpr(), "NOT IN", x.getTargetList()); } else { - handleCondition(x.getExpr(), "IN"); + handleCondition(x.getExpr(), "IN", x.getTargetList()); } return true; @@ -901,7 +943,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLCurrentOfCursorExpr x) { return false; } - + @Override public boolean visit(SQLAlterTableAddColumn x) { SQLAlterTableStatement stmt = (SQLAlterTableStatement) x.getParent(); diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index fe9049494c..972b9db95d 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -15,6 +15,9 @@ */ package com.alibaba.druid.stat; +import java.util.ArrayList; +import java.util.List; + public class TableStat { int selectCount = 0; @@ -268,8 +271,10 @@ public class TableStat { public static class Condition { - private Column column; - private String operator; + private Column column; + private String operator; + + private List values = new ArrayList(); public Column getColumn() { return column; @@ -287,6 +292,10 @@ public class TableStat { this.operator = operator; } + public List getValues() { + return values; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 96182a5523..c37d7485fd 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -64,6 +64,8 @@ public final class JdbcUtils { public static final String DERBY = "derby"; public static final String HBASE = "hbase"; + + public static final String HIVE = "hive"; private final static Log LOG = LogFactory.getLog(JdbcUtils.class); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceFilterTest.java b/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceFilterTest.java index 5583116f76..e70ddbd420 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceFilterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/DruidDataSourceFilterTest.java @@ -21,6 +21,7 @@ public class DruidDataSourceFilterTest extends TestCase { } public void test_filter() throws Exception { + System.out.println(System.nanoTime()/(1000 * 1000)); DruidDataSource dataSource = new DruidDataSource(); Assert.assertEquals(0, dataSource.getProxyFilters().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java index 0e7f4f7d8f..015174ed80 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java @@ -27,5 +27,14 @@ public class MySqlAlterTableTest1 extends TestCase { String output = SQLUtils.toMySqlString(stmt); Assert.assertEquals("ALTER TABLE t2\n\tADD COLUMN d TIMESTAMP", output); } + + public void test_alter_2() throws Exception { + String sql = "ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE t2\n\tADD INDEX (d),\n\tADD UNIQUE (a)", output); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSchemaStatVisitorTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSchemaStatVisitorTest.java new file mode 100644 index 0000000000..7990fad787 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSchemaStatVisitorTest.java @@ -0,0 +1,53 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +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.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Condition; + +public class OracleSchemaStatVisitorTest extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT id, name name from department d" + // + " WHERE d.id = ?"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + List parameters = new ArrayList(); + parameters.add(23456); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + visitor.setParameters(parameters); + statemen.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()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("department"))); + + Assert.assertEquals(2, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("department", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("department", "name"))); + + Assert.assertEquals(1, visitor.getConditions().size()); + + Condition condition = visitor.getConditions().get(0); + Assert.assertSame(parameters.get(0), condition.getValues().get(0)); + } +}