bug fixed for schema stat visitor

This commit is contained in:
温少
2012-02-26 12:21:05 +08:00
19 changed files with 631 additions and 50 deletions
@@ -32,6 +32,7 @@ public class OracleUpdateSetListSingleColumnItem extends OracleUpdateSetListItem
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.column);
acceptChild(visitor, this.value);
}
visitor.endVisit(this);
@@ -845,7 +845,7 @@ public class OracleSelectParser extends SQLSelectParser {
if (lexer.token() == Token.ON) {
lexer.nextToken();
join.setCondition(this.createExprParser().expr());
} else if (identifierEquals("USING")) {
} else if (lexer.token() == Token.USING) {
lexer.nextToken();
accept(Token.LPAREN);
this.createExprParser().exprList(join.getUsing());
@@ -296,6 +296,7 @@ public class OracleStatementParser extends SQLStatementParser {
parseInsert0(insertInto, false);
clause.setElseItem(insertInto);
}
stmt.getEntries().add(clause);
}
SQLSelect subQuery = this.createSQLSelectParser().select();
@@ -54,6 +54,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQuer
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource;
@@ -757,5 +758,15 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
public void endVisit(ConditionalInsertClauseItem x) {
}
@Override
public boolean visit(OracleSelectQueryBlock x) {
return true;
}
@Override
public void endVisit(OracleSelectQueryBlock x) {
}
}
@@ -57,6 +57,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference;
@@ -330,4 +331,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
boolean visit(ConditionalInsertClauseItem x);
void endVisit(ConditionalInsertClauseItem x);
boolean visit(OracleSelectQueryBlock x);
void endVisit(OracleSelectQueryBlock x);
}
@@ -1602,4 +1602,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public void endVisit(ConditionalInsertClauseItem x) {
}
@Override
public void endVisit(OracleSelectQueryBlock x) {
}
}
@@ -9,6 +9,7 @@ import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
@@ -82,18 +83,51 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetValueClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
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;
public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor {
protected Column getColumn(SQLExpr expr) {
if (expr instanceof OracleOuterExpr) {
expr = ((OracleOuterExpr) expr).getExpr();
}
return super.getColumn(expr);
}
public boolean visit(OracleSelectTableReference x) {
SQLExpr expr = x.getExpr();
if (expr instanceof SQLMethodInvokeExpr) {
SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) expr;
if ("TABLE".equalsIgnoreCase(methodInvoke.getMethodName()) && methodInvoke.getParameters().size() == 1) {
expr = methodInvoke.getParameters().get(0);
}
}
Map<String, String> aliasMap = aliasLocal.get();
if (expr instanceof SQLName) {
String ident = ((SQLName) expr).toString();
Map<String, String> aliasMap = aliasLocal.get();
if (aliasMap.containsKey(ident) && aliasMap.get(ident) == null) {
String ident;
if (expr instanceof SQLPropertyExpr) {
String owner = ((SQLPropertyExpr) expr).getOwner().toString();
String name = ((SQLPropertyExpr) expr).getName();
if (aliasMap.containsKey(owner)) {
owner = aliasMap.get(owner);
}
ident = owner + "." + name;
} else {
ident = expr.toString();
}
if (subQueryMap.containsKey(ident)) {
return false;
}
if ("DUAL".equalsIgnoreCase(ident)) {
return false;
}
@@ -101,6 +135,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
if (stat == null) {
stat = new TableStat();
tableStats.put(new TableStat.Name(ident), stat);
x.putAttribute(ATTR_TABLE, ident);
}
Mode mode = modeLocal.get();
@@ -214,6 +249,10 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
public boolean visit(OracleSelectQueryBlock x) {
if (x.getWhere() != null) {
x.getWhere().setParent(x);
}
return visit((SQLSelectQueryBlock) x);
}
@@ -228,6 +267,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
return super.visit(x);
}
public boolean visit(SQLMethodInvokeExpr x) {
accept(x.getParameters());
return false;
}
public boolean visit(SQLIdentifierExpr x) {
if ("ROWNUM".equalsIgnoreCase(x.getName())) {
@@ -241,6 +285,10 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
if ("+".equalsIgnoreCase(x.getName())) {
return false;
}
if ("LEVEL".equals(x.getName())) {
return false;
}
return super.visit(x);
}
@@ -475,8 +523,36 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
@Override
public boolean visit(OracleSelectJoin x) {
return true;
x.getLeft().accept(this);
x.getRight().accept(this);
if (x.getCondition() != null) {
x.getCondition().accept(this);
}
for (SQLExpr item : x.getUsing()) {
if (item instanceof SQLIdentifierExpr) {
String columnName = ((SQLIdentifierExpr) item).getName();
String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE);
String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE);
if (leftTable != null && rightTable != null) {
Relationship relationship = new Relationship();
relationship.setLeft(new Column(leftTable, columnName));
relationship.setRight(new Column(rightTable, columnName));
relationship.setOperator("USING");
relationships.add(relationship);
}
if (leftTable != null) {
columns.add(new Column(leftTable, columnName));
}
if (rightTable != null) {
columns.add(new Column(rightTable, columnName));
}
}
}
return false;
}
@Override
@@ -639,6 +715,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
if (alias != null) {
aliasMap.put(alias, null);
subQueryMap.put(alias, x.getSubQuery());
}
}
x.getSubQuery().accept(this);
@@ -72,6 +72,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
if (alias != null) {
aliasMap.put(alias, null);
subQueryMap.put(alias, x.getQuery());
}
}
x.getQuery().accept(this);
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.dialect.sqlserver.parser;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
public class SQLServerStatementParser extends SQLStatementParser {
@@ -24,6 +25,10 @@ public class SQLServerStatementParser extends SQLStatementParser {
super(new SQLServerLexer(sql));
this.lexer.nextToken();
}
public SQLSelectParser createSQLSelectParser() {
return new SQLServerSelectParser(this.lexer);
}
public SQLServerStatementParser(Lexer lexer){
super(lexer);