mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for oracle sql parser
This commit is contained in:
+10
-11
@@ -1,6 +1,5 @@
|
||||
package com.alibaba.druid.sql.dialect.mysql.visitor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
@@ -45,22 +44,22 @@ import com.alibaba.druid.stat.TableStat.Mode;
|
||||
public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlASTVisitor {
|
||||
|
||||
public boolean visit(SQLSelectStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
aliasLocal.get().put("DUAL", null);
|
||||
setAliasMap();
|
||||
getAliasMap().put("DUAL", null);
|
||||
|
||||
return true;
|
||||
}
|
||||
//DUAL
|
||||
public boolean visit(MySqlDeleteStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
setMode(x, Mode.Delete);
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
if (x.getTableNames().size() == 1) {
|
||||
String ident = ((SQLIdentifierExpr) x.getTableNames().get(0)).getName();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
}
|
||||
|
||||
for (SQLName tableName : x.getTableNames()) {
|
||||
@@ -83,7 +82,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
}
|
||||
|
||||
public void endVisit(MySqlDeleteStatement x) {
|
||||
aliasLocal.set(null);
|
||||
setAliasMap(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -95,13 +94,13 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
public boolean visit(MySqlInsertStatement x) {
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
if (x.getTableName() instanceof SQLIdentifierExpr) {
|
||||
String ident = ((SQLIdentifierExpr) x.getTableName()).getName();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -111,7 +110,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
}
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
if (x.getAlias() != null) {
|
||||
aliasMap.put(x.getAlias(), ident);
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.clause;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleParameter extends OracleSQLObjectImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private SQLExpr name;
|
||||
private SQLDataType dataType;
|
||||
private SQLExpr defaultValue;
|
||||
|
||||
public SQLExpr getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
public void setDefaultValue(SQLExpr deaultValue) {
|
||||
this.defaultValue = deaultValue;
|
||||
}
|
||||
|
||||
public SQLExpr getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLExpr name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public SQLDataType getDataType() {
|
||||
return dataType;
|
||||
}
|
||||
|
||||
public void setDataType(SQLDataType dataType) {
|
||||
this.dataType = dataType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, dataType);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -4,14 +4,14 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleBlockStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private List<SQLColumnDefinition> parameters = new ArrayList<SQLColumnDefinition>();
|
||||
private List<OracleParameter> parameters = new ArrayList<OracleParameter>();
|
||||
|
||||
private List<SQLStatement> statementList = new ArrayList<SQLStatement>();
|
||||
|
||||
@@ -32,11 +32,11 @@ public class OracleBlockStatement extends OracleStatementImpl {
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public List<SQLColumnDefinition> getParameters() {
|
||||
public List<OracleParameter> getParameters() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
public void setParameters(List<SQLColumnDefinition> parameters) {
|
||||
public void setParameters(List<OracleParameter> parameters) {
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleCommitStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -136,6 +136,7 @@ public class OracleLexer extends Lexer {
|
||||
map.put("IF", Token.IF);
|
||||
map.put("ELSE", Token.ELSE);
|
||||
map.put("GOTO", Token.GOTO);
|
||||
map.put("COMMIT", Token.COMMIT);
|
||||
|
||||
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
|
||||
}
|
||||
|
||||
+14
-2
@@ -34,6 +34,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
|
||||
@@ -51,6 +52,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
@@ -284,6 +286,13 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.COMMIT) {
|
||||
lexer.nextToken();
|
||||
OracleCommitStatement stmt = new OracleCommitStatement();
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.LTLT) {
|
||||
lexer.nextToken();
|
||||
SQLName label = this.exprParser.name();
|
||||
@@ -715,12 +724,15 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
lexer.nextToken();
|
||||
|
||||
for (;;) {
|
||||
SQLColumnDefinition parameter = this.exprParser.parseColumn();
|
||||
OracleParameter parameter = new OracleParameter();
|
||||
parameter.setName(this.exprParser.name());
|
||||
parameter.setDataType(this.exprParser.parseDataType());
|
||||
|
||||
block.getParameters().add(parameter);
|
||||
|
||||
if (lexer.token() == Token.COLONEQ) {
|
||||
lexer.nextToken();
|
||||
parameter.setDefaultExpr(this.exprParser.expr());
|
||||
parameter.setDefaultValue(this.exprParser.expr());
|
||||
}
|
||||
parameter.setParent(block);
|
||||
accept(Token.SEMI);
|
||||
|
||||
+22
@@ -17,6 +17,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesCla
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
@@ -53,6 +54,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
@@ -1171,4 +1173,24 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleParameter x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleParameter x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCommitStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCommitStatement x) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.Vers
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
@@ -59,6 +60,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
@@ -515,4 +517,12 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleLabelStatement x);
|
||||
|
||||
void endVisit(OracleLabelStatement x);
|
||||
|
||||
boolean visit(OracleParameter x);
|
||||
|
||||
void endVisit(OracleParameter x);
|
||||
|
||||
boolean visit(OracleCommitStatement x);
|
||||
|
||||
void endVisit(OracleCommitStatement x);
|
||||
}
|
||||
|
||||
+36
-1
@@ -53,6 +53,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitio
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReferenceModelClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
@@ -93,6 +94,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
@@ -1195,7 +1197,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
@Override
|
||||
public boolean visit(OracleCursorExpr x) {
|
||||
print("CURSOR(");
|
||||
incrementIndent();
|
||||
println();
|
||||
x.getQuery().accept(this);
|
||||
decrementIndent();
|
||||
println();
|
||||
print(")");
|
||||
return false;
|
||||
}
|
||||
@@ -1710,7 +1716,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
incrementIndent();
|
||||
println();
|
||||
|
||||
for (SQLColumnDefinition param : x.getParameters()) {
|
||||
for (OracleParameter param : x.getParameters()) {
|
||||
param.accept(this);
|
||||
println();
|
||||
}
|
||||
@@ -2445,4 +2451,33 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleLabelStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleParameter x) {
|
||||
x.getName().accept(this);
|
||||
print(" ");
|
||||
x.getDataType().accept(this);
|
||||
|
||||
if (x.getDefaultValue() != null) {
|
||||
print(" := ");
|
||||
x.getDefaultValue().accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleParameter x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCommitStatement x) {
|
||||
print("COMMIT");
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCommitStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+50
-23
@@ -1,6 +1,5 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.visitor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
@@ -35,6 +34,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesCla
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
@@ -71,6 +71,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
@@ -142,7 +143,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
|
||||
if (expr instanceof SQLName) {
|
||||
String ident;
|
||||
@@ -230,14 +231,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
accept(x.getFactoring());
|
||||
accept(x.getQuery());
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
currentTableLocal.set((String) x.getQuery().getAttribute("table"));
|
||||
setCurrentTable((String) x.getQuery().getAttribute("table"));
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
accept(x.getOrderBy());
|
||||
|
||||
currentTableLocal.set(originalTable);
|
||||
setCurrentTable(originalTable);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -246,7 +247,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public boolean visit(OracleUpdateStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
setMode(x, Mode.Update);
|
||||
|
||||
SQLTableSource tableSource = x.getTableSource();
|
||||
@@ -258,7 +259,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
if (tableExpr instanceof SQLIdentifierExpr) {
|
||||
String ident = tableExpr.toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
@@ -267,7 +268,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
stat.incrementUpdateCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
aliasMap.put(ident, ident);
|
||||
} else {
|
||||
tableSource.accept(this);
|
||||
@@ -280,7 +281,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public void endVisit(OracleUpdateStatement x) {
|
||||
aliasLocal.set(null);
|
||||
clearAliasMap();
|
||||
}
|
||||
|
||||
public boolean visit(OracleDeleteStatement x) {
|
||||
@@ -288,7 +289,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public void endVisit(OracleDeleteStatement x) {
|
||||
aliasLocal.set(null);
|
||||
clearAliasMap();
|
||||
}
|
||||
|
||||
public boolean visit(OracleSelectQueryBlock x) {
|
||||
@@ -749,7 +750,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(Entry x) {
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
String alias = null;
|
||||
if (x.getName() != null) {
|
||||
@@ -936,16 +937,16 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleMergeStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
setMode(x, Mode.Merge);
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
x.getUsing().accept(this);
|
||||
|
||||
String ident = x.getInto().toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -955,7 +956,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
stat.incrementMergeCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
if (x.getAlias() != null) {
|
||||
aliasMap.put(x.getAlias(), ident);
|
||||
@@ -978,7 +979,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleMergeStatement x) {
|
||||
aliasLocal.set(null);
|
||||
clearAliasMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1033,11 +1034,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(InsertIntoClause x) {
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
if (x.getTableName() instanceof SQLName) {
|
||||
String ident = ((SQLName) x.getTableName()).toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -1047,7 +1048,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
if (x.getAlias() != null) {
|
||||
aliasMap.put(x.getAlias(), ident);
|
||||
@@ -1074,7 +1075,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
x.putAttribute("_original_use_mode", getMode());
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
accept(x.getSubQuery());
|
||||
|
||||
@@ -1110,7 +1111,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(ConditionalInsertClauseItem x) {
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
SQLObject parent = x.getParent();
|
||||
if (parent instanceof ConditionalInsertClause) {
|
||||
parent = parent.getParent();
|
||||
@@ -1119,12 +1120,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
SQLSelect subQuery = ((OracleMultiInsertStatement) parent).getSubQuery();
|
||||
if (subQuery != null) {
|
||||
String table = (String) subQuery.getAttribute("_table_");
|
||||
currentTableLocal.set(table);
|
||||
setCurrentTable(table);
|
||||
}
|
||||
}
|
||||
x.getWhen().accept(this);
|
||||
x.getThen().accept(this);
|
||||
currentTableLocal.set(originalTable);
|
||||
setCurrentTable(originalTable);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1385,6 +1386,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleForStatement x) {
|
||||
x.getRange().setParent(x);
|
||||
|
||||
x.getIndex().accept(this);
|
||||
x.getRange().accept(this);
|
||||
accept(x.getStatements());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1513,4 +1520,24 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public void endVisit(OracleLabelStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleParameter x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleParameter x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCommitStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCommitStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+13
-14
@@ -1,6 +1,5 @@
|
||||
package com.alibaba.druid.sql.dialect.postgresql.visitor;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
@@ -63,7 +62,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
@Override
|
||||
public boolean visit(PGWithQuery x) {
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
String alias = null;
|
||||
if (x.getName() != null) {
|
||||
@@ -129,7 +128,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
x.getWith().accept(this);
|
||||
}
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
for (SQLName name : x.getUsing()) {
|
||||
String ident = name.toString();
|
||||
@@ -141,7 +140,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
}
|
||||
stat.incrementSelectCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
aliasMap.put(ident, ident);
|
||||
}
|
||||
@@ -151,7 +150,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
setMode(x, Mode.Delete);
|
||||
|
||||
String ident = ((SQLIdentifierExpr) x.getTableName()).getName();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
@@ -185,7 +184,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
@Override
|
||||
public boolean visit(PGInsertStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
if (x.getWith() != null) {
|
||||
x.getWith().accept(this);
|
||||
@@ -194,11 +193,11 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
x.putAttribute("_original_use_mode", getMode());
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
if (x.getTableName() instanceof SQLName) {
|
||||
String ident = ((SQLName) x.getTableName()).toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -208,7 +207,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
}
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
if (x.getAlias() != null) {
|
||||
aliasMap.put(x.getAlias(), ident);
|
||||
@@ -244,16 +243,16 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
@Override
|
||||
public boolean visit(PGUpdateStatement x) {
|
||||
Map<String, String> oldAliasMap = aliasLocal.get();
|
||||
Map<String, String> oldAliasMap = getAliasMap();
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
if (x.getWith() != null) {
|
||||
x.getWith().accept(this);
|
||||
}
|
||||
|
||||
String ident = x.getTableName().toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
@@ -262,13 +261,13 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
}
|
||||
stat.incrementUpdateCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
aliasMap.put(ident, ident);
|
||||
|
||||
accept(x.getItems());
|
||||
accept(x.getWhere());
|
||||
|
||||
aliasLocal.set(oldAliasMap);
|
||||
setAliasMap(oldAliasMap);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -171,6 +171,7 @@ public enum Token {
|
||||
GRANT("GRANT"),
|
||||
LOOP("LOOP"),
|
||||
GOTO("GOTO"),
|
||||
COMMIT("COMMIT"),
|
||||
|
||||
// transact-sql
|
||||
TOP("TOP"),
|
||||
|
||||
@@ -47,26 +47,52 @@ import com.alibaba.druid.stat.TableStat.Relationship;
|
||||
|
||||
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 Set<Relationship> relationships = new LinkedHashSet<Relationship>();
|
||||
protected final Set<Column> orderByColumns = new LinkedHashSet<Column>();
|
||||
protected final Set<Column> groupByColumns = new LinkedHashSet<Column>();
|
||||
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 Set<Relationship> relationships = new LinkedHashSet<Relationship>();
|
||||
protected final Set<Column> orderByColumns = new LinkedHashSet<Column>();
|
||||
protected final Set<Column> groupByColumns = new LinkedHashSet<Column>();
|
||||
|
||||
protected final Map<String, SQLObject> subQueryMap = new LinkedHashMap<String, SQLObject>();
|
||||
protected final static ThreadLocal<Map<String, String>> aliasLocal = new ThreadLocal<Map<String, String>>();
|
||||
protected final static ThreadLocal<String> currentTableLocal = new ThreadLocal<String>();
|
||||
protected final Map<String, SQLObject> subQueryMap = new LinkedHashMap<String, SQLObject>();
|
||||
|
||||
public final static String ATTR_TABLE = "_table_";
|
||||
public final static String ATTR_COLUMN = "_column_";
|
||||
protected Map<String, String> aliasLocal = new HashMap<String, String>();
|
||||
|
||||
private Mode mode;
|
||||
protected String currentTable;
|
||||
|
||||
public final static String ATTR_TABLE = "_table_";
|
||||
public final static String ATTR_COLUMN = "_column_";
|
||||
|
||||
private Mode mode;
|
||||
|
||||
public void setAliasMap() {
|
||||
this.setAliasMap(new HashMap<String, String>());
|
||||
}
|
||||
|
||||
public void clearAliasMap() {
|
||||
this.aliasLocal = null;
|
||||
}
|
||||
|
||||
public void setAliasMap(Map<String, String> aliasMap) {
|
||||
this.aliasLocal = aliasMap;
|
||||
}
|
||||
|
||||
public Map<String, String> getAliasMap() {
|
||||
return aliasLocal;
|
||||
}
|
||||
|
||||
public void setCurrentTable(String table) {
|
||||
this.currentTable = table;
|
||||
}
|
||||
|
||||
public String getCurrentTable() {
|
||||
return currentTable;
|
||||
}
|
||||
|
||||
protected Mode getMode() {
|
||||
return mode;
|
||||
}
|
||||
|
||||
|
||||
protected void setModeOrigin(SQLObject x) {
|
||||
Mode originalMode = (Mode) x.getAttribute("_original_use_mode");
|
||||
mode = originalMode;
|
||||
@@ -92,7 +118,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
String currentTable = currentTableLocal.get();
|
||||
String currentTable = getCurrentTable();
|
||||
|
||||
if (subQueryMap.containsKey(currentTable)) {
|
||||
return false;
|
||||
@@ -222,7 +248,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
protected Column getColumn(SQLExpr expr) {
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -255,7 +281,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
String column = ((SQLIdentifierExpr) expr).getName();
|
||||
String table = currentTableLocal.get();
|
||||
String table = getCurrentTable();
|
||||
if (table != null) {
|
||||
if (aliasMap.containsKey(table)) {
|
||||
table = aliasMap.get(table);
|
||||
@@ -279,13 +305,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
public boolean visit(SQLTruncateStatement x) {
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
for (SQLName name : x.getTableNames()) {
|
||||
String ident = name.toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -295,7 +321,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
aliasMap.put(ident, ident);
|
||||
}
|
||||
@@ -308,13 +334,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
public boolean visit(SQLDropTableStatement x) {
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
for (SQLName name : x.getTableNames()) {
|
||||
String ident = name.toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -324,7 +350,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
stat.incrementDropCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
aliasMap.put(ident, ident);
|
||||
}
|
||||
@@ -337,13 +363,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
public boolean visit(SQLInsertStatement x) {
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
if (x.getTableName() instanceof SQLName) {
|
||||
String ident = ((SQLName) x.getTableName()).toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
@@ -353,7 +379,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
if (x.getAlias() != null) {
|
||||
aliasMap.put(x.getAlias(), ident);
|
||||
@@ -382,20 +408,20 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
public boolean visit(SQLSelectQueryBlock x) {
|
||||
setMode(x, Mode.Select);
|
||||
|
||||
|
||||
if (x.getFrom() instanceof SQLSubqueryTableSource) {
|
||||
x.getFrom().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
if (x.getFrom() instanceof SQLExprTableSource) {
|
||||
SQLExprTableSource tableSource = (SQLExprTableSource) x.getFrom();
|
||||
if (tableSource.getExpr() instanceof SQLName) {
|
||||
String ident = tableSource.getExpr().toString();
|
||||
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute(ATTR_TABLE, ident);
|
||||
if (x.getParent() instanceof SQLSelect) {
|
||||
x.getParent().putAttribute(ATTR_TABLE, ident);
|
||||
@@ -407,7 +433,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
if (x.getFrom() != null) {
|
||||
x.getFrom().accept(this); // 提前执行,获得aliasMap
|
||||
}
|
||||
|
||||
|
||||
if (x.getWhere() != null) {
|
||||
x.getWhere().setParent(x);
|
||||
}
|
||||
@@ -417,8 +443,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
public void endVisit(SQLSelectQueryBlock x) {
|
||||
String originalTable = (String) x.getAttribute("_old_local_");
|
||||
x.putAttribute("table", currentTableLocal.get());
|
||||
currentTableLocal.set(originalTable);
|
||||
x.putAttribute("table", getCurrentTable());
|
||||
setCurrentTable(originalTable);
|
||||
|
||||
setModeOrigin(x);
|
||||
}
|
||||
@@ -447,7 +473,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
protected String aliasWrap(String name) {
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap.containsKey(name)) {
|
||||
return aliasMap.get(name);
|
||||
}
|
||||
@@ -491,7 +517,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
String currentTable = currentTableLocal.get();
|
||||
String currentTable = getCurrentTable();
|
||||
|
||||
if (subQueryMap.containsKey(currentTable)) {
|
||||
return false;
|
||||
@@ -517,7 +543,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public boolean visit(SQLAllColumnExpr x) {
|
||||
String currentTable = currentTableLocal.get();
|
||||
String currentTable = getCurrentTable();
|
||||
|
||||
if (subQueryMap.containsKey(currentTable)) {
|
||||
return false;
|
||||
@@ -542,12 +568,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public boolean visit(SQLSelectStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
return true;
|
||||
}
|
||||
|
||||
public void endVisit(SQLSelectStatement x) {
|
||||
aliasLocal.set(null);
|
||||
clearAliasMap();
|
||||
}
|
||||
|
||||
public boolean visit(SQLSubqueryTableSource x) {
|
||||
@@ -555,7 +581,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
SQLSelectQuery query = x.getSelect().getQuery();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
if (x.getAlias() != null) {
|
||||
aliasMap.put(x.getAlias(), null);
|
||||
@@ -577,7 +603,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
return false;
|
||||
}
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
@@ -632,14 +658,14 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
accept(x.getQuery());
|
||||
|
||||
String originalTable = currentTableLocal.get();
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
currentTableLocal.set((String) x.getQuery().getAttribute("table"));
|
||||
setCurrentTable((String) x.getQuery().getAttribute("table"));
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
accept(x.getOrderBy());
|
||||
|
||||
currentTableLocal.set(originalTable);
|
||||
setCurrentTable(originalTable);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -655,10 +681,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public boolean visit(SQLUpdateStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
String ident = x.getTableName().toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
@@ -667,7 +693,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
stat.incrementUpdateCount();
|
||||
|
||||
Map<String, String> aliasMap = aliasLocal.get();
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
aliasMap.put(ident, ident);
|
||||
|
||||
accept(x.getItems());
|
||||
@@ -677,12 +703,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public boolean visit(SQLDeleteStatement x) {
|
||||
aliasLocal.set(new HashMap<String, String>());
|
||||
setAliasMap();
|
||||
|
||||
setMode(x, Mode.Delete);
|
||||
|
||||
String ident = x.getTableName().toString();
|
||||
currentTableLocal.set(ident);
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
@@ -717,11 +743,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
public void endVisit(SQLDeleteStatement x) {
|
||||
aliasLocal.set(null);
|
||||
clearAliasMap();
|
||||
}
|
||||
|
||||
public void endVisit(SQLUpdateStatement x) {
|
||||
aliasLocal.set(null);
|
||||
clearAliasMap();
|
||||
}
|
||||
|
||||
public boolean visit(SQLCreateTableStatement x) {
|
||||
@@ -757,15 +783,15 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLCallStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(SQLCommentStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user