mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
sql parser schema stat support
This commit is contained in:
@@ -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) {
|
||||
|
||||
|
||||
+40
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+12
-1
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+13
@@ -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<Object>());
|
||||
}
|
||||
|
||||
public OracleSchemaStatVisitor(List<Object> 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) {
|
||||
|
||||
+6
@@ -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) {
|
||||
|
||||
|
||||
+6
@@ -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);
|
||||
|
||||
@@ -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<TableStat.Name, TableStat> tableStats = new LinkedHashMap<TableStat.Name, TableStat>();
|
||||
protected final Set<Column> columns = new LinkedHashSet<Column>();
|
||||
protected final Set<Condition> conditions = new LinkedHashSet<Condition>();
|
||||
protected final List<Condition> conditions = new ArrayList<Condition>();
|
||||
protected final Set<Relationship> relationships = new LinkedHashSet<Relationship>();
|
||||
protected final Set<Column> orderByColumns = new LinkedHashSet<Column>();
|
||||
protected final Set<Column> groupByColumns = new LinkedHashSet<Column>();
|
||||
@@ -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<Object> parameters;
|
||||
|
||||
private Mode mode;
|
||||
|
||||
public SchemaStatVisitor(){
|
||||
this(new ArrayList<Object>());
|
||||
}
|
||||
|
||||
public SchemaStatVisitor(List<Object> parameters){
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
public List<Object> getParameters() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
public void setParameters(List<Object> 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<Condition> getConditions() {
|
||||
public List<Condition> 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<SQLExpr> 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();
|
||||
|
||||
@@ -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<Object> values = new ArrayList<Object>();
|
||||
|
||||
public Column getColumn() {
|
||||
return column;
|
||||
@@ -287,6 +292,10 @@ public class TableStat {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public List<Object> getValues() {
|
||||
return values;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<SQLStatement> statementList = parser.parseStatementList();
|
||||
SQLStatement statemen = statementList.get(0);
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
List<Object> parameters = new ArrayList<Object>();
|
||||
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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user