bug fixed for oracle sql parser

This commit is contained in:
温少
2012-03-05 22:58:46 +08:00
parent a67026f478
commit 277c8dbd1b
15 changed files with 363 additions and 120 deletions
@@ -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,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;
}
@@ -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);
}
@@ -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);
@@ -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);
}
@@ -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) {
}
}
@@ -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) {
}
}
@@ -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