bug fixed for schema stat

This commit is contained in:
温少
2012-03-18 12:24:40 +08:00
13 changed files with 105 additions and 83 deletions
@@ -15,13 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
@@ -30,17 +25,16 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class MySqlDeleteStatement extends SQLDeleteStatement {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private boolean lowPriority = false;
private boolean quick = false;
private boolean ignore = false;
private boolean lowPriority = false;
private boolean quick = false;
private boolean ignore = false;
private SQLTableSource from;
private SQLTableSource using;
private SQLOrderBy orderBy;
private Limit limit;
private final List<SQLExprTableSource> tableSources = new ArrayList<SQLExprTableSource>();
private SQLTableSource from;
private SQLTableSource using;
private SQLOrderBy orderBy;
private Limit limit;
public boolean isLowPriority() {
return lowPriority;
@@ -78,25 +72,6 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
this.using = using;
}
public SQLName getTableName() {
if (tableSources.size() == 0) {
return null;
}
return (SQLName) tableSources.get(0).getExpr();
}
public void setTableSource(SQLExprTableSource tableSource) {
if (tableSources.size() == 0) {
tableSources.add(tableSource);
} else {
tableSources.set(0, tableSource);
}
}
public List<SQLExprTableSource> getTableSources() {
return tableSources;
}
public void setFrom(SQLTableSource from) {
this.from = from;
}
@@ -132,7 +107,7 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
protected void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, getTableSources());
acceptChild(visitor, getTableSource());
acceptChild(visitor, getWhere());
acceptChild(visitor, getFrom());
acceptChild(visitor, getUsing());
@@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
@@ -262,4 +263,13 @@ public class MySqlSelectParser extends SQLSelectParser {
protected MySqlExprParser createExprParser() {
return new MySqlExprParser(lexer);
}
protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) throws ParserException {
if (identifierEquals("USING")) {
return tableSource;
}
return super.parseTableSourceRest(tableSource);
}
}
@@ -27,7 +27,6 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
@@ -58,6 +57,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionSt
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
@@ -109,17 +109,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
if (lexer.token() == Token.IDENTIFIER) {
for (;;) {
SQLName name = exprParser.name();
deleteStatement.getTableSources().add(new SQLExprTableSource(name));
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
deleteStatement.setTableSource(createSQLSelectParser().parseTableSource());
if (lexer.token() == Token.FROM) {
lexer.nextToken();
@@ -129,17 +119,7 @@ public class MySqlStatementParser extends SQLStatementParser {
} else {
if (lexer.token() == Token.FROM) {
lexer.nextToken();
}
for (;;) {
SQLName name = exprParser.name();
deleteStatement.getTableSources().add(new SQLExprTableSource(name));
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
deleteStatement.setTableSource(createSQLSelectParser().parseTableSource());
}
}
@@ -1039,4 +1019,8 @@ public class MySqlStatementParser extends SQLStatementParser {
}
return stmt;
}
public SQLSelectParser createSQLSelectParser() {
return new MySqlSelectParser(this.lexer);
}
}
@@ -623,9 +623,9 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.getFrom() == null) {
print("FROM ");
printAndAccept(x.getTableSources(), ", ");
x.getTableSource().accept(this);
} else {
printAndAccept(x.getTableSources(), ", ");
x.getTableSource().accept(this);
println();
print("FROM ");
x.getFrom().accept(this);
@@ -2,7 +2,6 @@ package com.alibaba.druid.sql.dialect.mysql.visitor;
import java.util.Map;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
@@ -66,17 +65,20 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
setAliasMap();
if (x.getTableSources().size() == 1) {
SQLName tableName = (SQLName) x.getTableSources().get(0).getExpr();
if (x.getTableSource() instanceof SQLExprTableSource) {
SQLName tableName = (SQLName) ((SQLExprTableSource) x.getTableSource()).getExpr();
String ident = tableName.toString();
setCurrentTable(x, ident);
}
for (SQLExprTableSource tableSource : x.getTableSources()) {
SQLExpr tableName = tableSource.getExpr();
String ident = tableName.toString();
TableStat stat = getTableStat(ident);
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());
@@ -483,6 +485,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(MySqlOutFileExpr x) {
}
}
@@ -232,7 +232,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
@Override
public boolean visit(PGSelectQueryBlock x) {
this.visit((SQLSelectQueryBlock) x);
return false;
return this.visit((SQLSelectQueryBlock) x);
}
}