This commit is contained in:
温少
2012-03-18 17:00:11 +08:00
parent 54234c805f
commit ad6223c8ce
11 changed files with 272 additions and 16 deletions
@@ -0,0 +1,27 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlDescribeStatement extends MySqlStatementImpl {
private static final long serialVersionUID = 1L;
private SQLName object;
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, object);
}
visitor.endVisit(this);
}
public SQLName getObject() {
return object;
}
public void setObject(SQLName object) {
this.object = object;
}
}
@@ -36,6 +36,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement;
@@ -345,9 +346,24 @@ public class MySqlStatementParser extends SQLStatementParser {
statementList.add(stmt);
return true;
}
if (identifierEquals("DESCRIBE")) {
SQLStatement stmt = parseDescribe();
statementList.add(stmt);
return true;
}
return false;
}
public SQLStatement parseDescribe() throws ParserException {
acceptIdentifier("DESCRIBE");
MySqlDescribeStatement stmt = new MySqlDescribeStatement();
stmt.setObject(this.exprParser.name());
return stmt;
}
public SQLStatement parseShow() throws ParserException {
acceptIdentifier("SHOW");
@@ -19,15 +19,16 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement;
@@ -196,4 +197,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlOutFileExpr x);
void endVisit(MySqlOutFileExpr x);
boolean visit(MySqlDescribeStatement x);
void endVisit(MySqlDescribeStatement x);
}
@@ -14,6 +14,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement;
@@ -422,4 +423,14 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements
}
@Override
public boolean visit(MySqlDescribeStatement x) {
return true;
}
@Override
public void endVisit(MySqlDescribeStatement x) {
}
}
@@ -44,6 +44,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStateme
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement;
@@ -1363,4 +1364,16 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
public void endVisit(MySqlOutFileExpr x) {
}
@Override
public boolean visit(MySqlDescribeStatement x) {
print("DESCRIBE ");
x.getObject().accept(this);
return false;
}
@Override
public void endVisit(MySqlDescribeStatement x) {
}
}
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement;
@@ -63,8 +64,10 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
setMode(x, Mode.Delete);
setAliasMap();
accept(x.getFrom());
accept(x.getUsing());
x.getTableSource().accept(this);
if (x.getTableSource() instanceof SQLExprTableSource) {
SQLName tableName = (SQLName) ((SQLExprTableSource) x.getTableSource()).getExpr();
String ident = tableName.toString();
@@ -72,18 +75,10 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
TableStat stat = this.getTableStat(ident);
stat.incrementDeleteCount();
} else {
MySqlSchemaStatVisitor tableSourceVisitor = new MySqlSchemaStatVisitor();
tableSourceVisitor.accept(x.getTableSource());
for (TableStat.Name name : tableSourceVisitor.getTables().keySet()) {
TableStat stat = this.getTableStat(name.getName());
stat.incrementDeleteCount();
}
}
}
accept(x.getWhere());
accept(x.getFrom());
accept(x.getUsing());
accept(x.getOrderBy());
accept(x.getLimit());
@@ -487,4 +482,15 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public void endVisit(MySqlOutFileExpr x) {
}
@Override
public boolean visit(MySqlDescribeStatement x) {
getTableStat(x.getObject().toString());
return false;
}
@Override
public void endVisit(MySqlDescribeStatement x) {
}
}
@@ -723,10 +723,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
}
if (aliasMap != null) {
if (x.getAlias() != null) {
aliasMap.put(x.getAlias(), ident);
String alias = x.getAlias();
if (alias != null && !aliasMap.containsKey(alias)) {
aliasMap.put(alias, ident);
}
if (!aliasMap.containsKey(ident)) {
aliasMap.put(ident, ident);
}
aliasMap.put(ident, ident);
}
} else {
accept(x.getExpr());