mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for schema stat visitor
This commit is contained in:
+1
@@ -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();
|
||||
|
||||
+11
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+84
-7
@@ -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);
|
||||
|
||||
+1
@@ -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);
|
||||
|
||||
+5
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user