mysql parser refactor.

This commit is contained in:
wenshao
2017-08-29 14:33:44 +08:00
parent 833a9b5a65
commit 4a4fffbbb2
197 changed files with 3040 additions and 1037 deletions
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.mysql.ast.clause;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
@@ -25,23 +27,23 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlCursorDeclareStatement extends MySqlStatementImpl{
//cursor name
private String cursorName;
private SQLName cursorName;
//select statement
private SQLSelectStatement select;
private SQLSelect select;
public String getCursorName() {
public SQLName getCursorName() {
return cursorName;
}
public void setCursorName(String cursorName) {
public void setCursorName(SQLName cursorName) {
this.cursorName = cursorName;
}
public SQLSelectStatement getSelect() {
public SQLSelect getSelect() {
return select;
}
public void setSelect(SQLSelectStatement select) {
public void setSelect(SQLSelect select) {
if (select != null) {
select.setParent(this);
}
@@ -43,12 +43,10 @@ public class MySqlDeclareStatement extends MySqlStatementImpl {
@Override
public void accept0(MySqlASTVisitor visitor) {
// TODO Auto-generated method stub
if (visitor.visit(this)) {
acceptChild(visitor, varList);
}
visitor.endVisit(this);
}
}
@@ -26,12 +26,17 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable {
protected transient long userName_hash;
protected long hashCode64;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
hashCode64 = 0;
userName_hash = 0;
}
public String getHost() {
@@ -40,6 +45,9 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable {
public void setHost(String host) {
this.host = host;
hashCode64 = 0;
userName_hash = 0;
}
@Override
@@ -87,4 +95,16 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable {
}
return userName_hash;
}
@Override
public long hashCode64() {
if (hashCode64 == 0) {
if (host != null) {
hashCode64 = FNVUtils.fnv_64_lower(host, userName);
} else {
hashCode64 = name_hash_lower();
}
}
return hashCode64;
}
}
@@ -48,7 +48,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
private List<SQLCommentHint> optionHints = new ArrayList<SQLCommentHint>();
private SQLExprTableSource like;
private SQLName tableGroup;
@@ -56,20 +56,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
super (JdbcConstants.MYSQL);
}
public SQLExprTableSource getLike() {
return like;
}
public void setLike(SQLName like) {
this.setLike(new SQLExprTableSource(like));
}
public void setLike(SQLExprTableSource like) {
if (like != null) {
like.setParent(this);
}
this.like = like;
}
public List<SQLCommentHint> getHints() {
return hints;
@@ -135,6 +122,9 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
}
public void setName(SQLName name) {
if (name != null) {
name.setParent(this);
}
this.name = name;
}
@@ -143,6 +133,9 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
}
public void setStorage(SQLExpr storage) {
if (storage != null) {
storage.setParent(this);
}
this.storage = storage;
}
@@ -155,6 +148,20 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
visitor.endVisit(this);
}
public TableSpaceOption clone() {
TableSpaceOption x = new TableSpaceOption();
if (name != null) {
x.setName(name.clone());
}
if (storage != null) {
x.setStorage(storage.clone());
}
return x;
}
}
public List<SQLCommentHint> getOptionHints() {
@@ -34,7 +34,6 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
private boolean quick = false;
private boolean ignore = false;
private SQLTableSource using;
private SQLOrderBy orderBy;
private SQLLimit limit;
@@ -104,14 +103,6 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
this.ignore = ignore;
}
public SQLTableSource getUsing() {
return using;
}
public void setUsing(SQLTableSource using) {
this.using = using;
}
public SQLOrderBy getOrderBy() {
return orderBy;
}
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlInsertStatement extends SQLInsertStatement {
@@ -34,6 +35,10 @@ public class MySqlInsertStatement extends SQLInsertStatement {
private final List<SQLExpr> duplicateKeyUpdate = new ArrayList<SQLExpr>();
public MySqlInsertStatement() {
dbType = JdbcConstants.MYSQL;
}
public void cloneTo(MySqlInsertStatement x) {
super.cloneTo(x);
x.lowPriority = lowPriority;
@@ -18,12 +18,14 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import oracle.sql.SQLUtil;
public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlObject {
@@ -256,4 +258,7 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO
visitor.endVisit(this);
}
public String toString() {
return SQLUtils.toMySqlString(this);
}
}
@@ -24,8 +24,6 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlStatement {
private SQLOrderBy orderBy;
private SQLLimit limit;
private boolean lowPriority = false;
@@ -121,12 +119,5 @@ public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlSta
this.targetAffectRow = targetAffectRow;
}
public SQLOrderBy getOrderBy() {
return orderBy;
}
public void setOrderBy(SQLOrderBy orderBy) {
this.orderBy = orderBy;
}
}
@@ -692,7 +692,8 @@ public class MySqlStatementParser extends SQLStatementParser {
statementList.add(this.parseWhile(label));
} else if (lexer.token() == Token.BEGIN) {
// parse begin-end statement with label
statementList.add(this.parseBlock(label));
SQLBlockStatement block = this.parseBlock(label);
statementList.add(block);
} else if (lexer.token() == Token.REPEAT) {
// parse repeat statement with label
statementList.add(this.parseRepeat(label));
@@ -808,6 +809,7 @@ public class MySqlStatementParser extends SQLStatementParser {
public SQLBlockStatement parseBlock() {
SQLBlockStatement block = new SQLBlockStatement();
block.setDbType(dbType);
accept(Token.BEGIN);
this.parseStatementList(block.getStatementList(), -1, block);
@@ -1821,7 +1823,7 @@ public class MySqlStatementParser extends SQLStatementParser {
if (lexer.token() == Token.VALUES || lexer.identifierEquals("VALUE")) {
lexer.nextToken();
parseValueClause(stmt.getValuesList(), 0);
parseValueClause(stmt.getValuesList(), 0, stmt);
} else if (lexer.token() == Token.SELECT) {
SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr();
stmt.setQuery(queryExpr);
@@ -2176,7 +2178,7 @@ public class MySqlStatementParser extends SQLStatementParser {
if (lexer.token() == Token.VALUES || lexer.identifierEquals("VALUE")) {
lexer.nextTokenLParen();
parseValueClause(insertStatement.getValuesList(), columnSize);
parseValueClause(insertStatement.getValuesList(), columnSize, insertStatement);
} else if (lexer.token() == Token.SET) {
lexer.nextToken();
@@ -2225,7 +2227,7 @@ public class MySqlStatementParser extends SQLStatementParser {
return insertStatement;
}
private void parseValueClause(List<ValuesClause> valueClauseList, int columnSize) {
private void parseValueClause(List<ValuesClause> valueClauseList, int columnSize, SQLObject parent) {
for (int i = 0; ; ++i) {
int startPos = lexer.pos() - 1;
@@ -2281,6 +2283,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(valueExprList);
values.setParent(parent);
if (lexer.isEnabled(SQLParserFeature.KeepInsertValueClauseOriginalString)) {
int endPos = lexer.pos();
@@ -4022,14 +4025,15 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlCursorDeclareStatement stmt = new MySqlCursorDeclareStatement();
accept(Token.DECLARE);
stmt.setCursorName(exprParser.name().getSimpleName());
stmt.setCursorName(exprParser.name());
accept(Token.CURSOR);
accept(Token.FOR);
SQLSelectStatement selelctStmt = (SQLSelectStatement) parseSelect();
stmt.setSelect(selelctStmt);
//SQLSelectStatement selelctStmt = (SQLSelectStatement) parseSelect();
SQLSelect select = this.createSQLSelectParser().select();
stmt.setSelect(select);
accept(Token.SEMI);
@@ -3275,7 +3275,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public boolean visit(MySqlCursorDeclareStatement x) {
print0(ucase ? "DECLARE " : "declare ");
print0(x.getCursorName());
printExpr(x.getCursorName());
print0(ucase ? " CURSOR FOR" : " cursor for");
this.indentCount++;
println();
@@ -65,7 +65,8 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
}
public boolean visit(SQLSelectStatement x) {
if (repository != null) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
@@ -82,7 +83,8 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
// DUAL
public boolean visit(MySqlDeleteStatement x) {
if (repository != null) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
@@ -122,6 +124,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public boolean visit(MySqlInsertStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
setMode(x, Mode.Insert);
setAliasMap();
@@ -289,6 +296,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public boolean visit(MySqlReplaceStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
setMode(x, Mode.Replace);
setAliasMap();
@@ -466,6 +478,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public boolean visit(MySqlExplainStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
SQLName tableName = x.getTableName();
if (tableName != null) {
String table = tableName.toString();
@@ -1033,7 +1050,8 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public boolean visit(MySqlCreateTableStatement x) {
if (repository != null) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSourceImpl;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.FNVUtils;
public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
@@ -52,6 +53,9 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
}
public void setTableSource(SQLTableSource tableSource) {
if (tableSource != null) {
tableSource.setParent(this);
}
this.tableSource = tableSource;
}
@@ -60,6 +64,9 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
}
public void setMethod(SQLMethodInvokeExpr method) {
if (method != null) {
method.setParent(this);
}
this.method = method;
}
@@ -71,4 +78,35 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
this.columns = columns;
}
public SQLTableSource findTableSource(long alias_hash) {
long hash = this.alias_hash();
if (hash != 0 && hash == alias_hash) {
return this;
}
for (SQLName column : columns) {
if (column.name_hash_lower() == alias_hash) {
return this;
}
}
if (tableSource != null) {
return tableSource.findTableSource(alias_hash);
}
return null;
}
public SQLTableSource findTableSourceWithColumn(long columnNameHash) {
for (SQLName column : columns) {
if (column.name_hash_lower() == columnNameHash) {
return this;
}
}
if (tableSource != null) {
return tableSource.findTableSourceWithColumn(columnNameHash);
}
return null;
}
}
@@ -48,6 +48,10 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV
@Override
public boolean visit(OdpsInsertStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
return true;
}
@@ -145,4 +145,10 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr
}
return dbLink_hash;
}
@Override
public long hashCode64() {
// TODO hashCode64
return 0;
}
}
@@ -25,6 +25,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleInsertStatement extends SQLInsertStatement implements OracleStatement {
@@ -32,6 +33,10 @@ public class OracleInsertStatement extends SQLInsertStatement implements OracleS
private SQLErrorLoggingClause errorLogging;
private List<SQLHint> hints = new ArrayList<SQLHint>();
public OracleInsertStatement() {
dbType = JdbcConstants.ORACLE;
}
public void cloneTo(OracleInsertStatement x) {
super.cloneTo(x);
if (returning != null) {
@@ -37,7 +37,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
private ModelClause modelClause;
private List<SQLExpr> forUpdateOf;
private boolean skipLocked = false;
public OracleSelectQueryBlock clone() {
@@ -97,21 +97,6 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
return hints.size();
}
public List<SQLExpr> getForUpdateOf() {
if (forUpdateOf == null) {
forUpdateOf = new ArrayList<SQLExpr>(1);
}
return forUpdateOf;
}
public int getForUpdateOfSize() {
if (forUpdateOf == null) {
return 0;
}
return forUpdateOf.size();
}
public boolean isSkipLocked() {
return skipLocked;
}
@@ -110,6 +110,8 @@ public class OracleLexer extends Lexer {
map.put("FETCH", Token.FETCH);
map.put("TABLESPACE", Token.TABLESPACE);
map.put("PARTITION", Token.PARTITION);
map.put("TRUE", Token.TRUE);
map.put("FALSE", Token.FALSE);
map.put(",", Token.COMMA);
map.put("(", Token.LPAREN);
@@ -74,14 +74,22 @@ public class OracleSelectParser extends SQLSelectParser {
select.setQuery(query);
SQLOrderBy orderBy = this.parseOrderBy();
select.setOrderBy(orderBy);
OracleSelectQueryBlock queryBlock = null;
if (query instanceof SQLSelectQueryBlock) {
queryBlock = (OracleSelectQueryBlock) query;
if (queryBlock.getOrderBy() == null) {
queryBlock.setOrderBy(orderBy);
} else {
select.setOrderBy(orderBy);
}
if (orderBy != null) {
parseFetchClause(queryBlock);
}
} else {
select.setOrderBy(orderBy);
}
if (lexer.token() == (Token.FOR)) {
@@ -114,8 +122,15 @@ public class OracleSelectParser extends SQLSelectParser {
}
}
if (select.getOrderBy() == null) {
select.setOrderBy(this.exprParser.parseOrderBy());
if (lexer.token() == Token.ORDER) {
orderBy = this.exprParser.parseOrderBy();
if (queryBlock != null && queryBlock.getOrderBy() == null) {
queryBlock.setOrderBy(orderBy);
} else if (select.getOrderBy() == null){
select.setOrderBy(orderBy);
} else {
throw new ParserException("illegal state.");
}
}
if (lexer.token() == Token.WITH) {
@@ -416,6 +416,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
x.getModelClause().accept(this);
}
SQLOrderBy orderBy = x.getOrderBy();
if (orderBy != null) {
println();
orderBy.accept(this);
}
printFetchFirst(x);
if (x.isForUpdate()) {
@@ -63,6 +63,7 @@ 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;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.util.JdbcUtils;
public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor {
@@ -72,18 +73,13 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
public OracleSchemaStatVisitor(List<Object> parameters){
super(parameters);
super(JdbcConstants.ORACLE, parameters);
this.variants.put("DUAL", null);
this.variants.put("NOTFOUND", null);
this.variants.put("TRUE", null);
this.variants.put("FALSE", null);
}
@Override
public String getDbType() {
return JdbcUtils.ORACLE;
}
protected Column getColumn(SQLExpr expr) {
if (expr instanceof OracleOuterExpr) {
expr = ((OracleOuterExpr) expr).getExpr();
@@ -172,6 +168,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
public boolean visit(OracleUpdateStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
setAliasMap();
setMode(x, Mode.Update);
@@ -729,6 +730,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
@Override
public boolean visit(OracleMultiInsertStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
x.putAttribute("_original_use_mode", getMode());
setMode(x, Mode.Insert);
@@ -1355,7 +1361,15 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
@Override
public boolean visit(OracleCreatePackageStatement x) {
return true;
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
for (SQLStatement stmt : x.getStatements()) {
stmt.accept(this);
}
return false;
}
@Override
@@ -27,8 +27,6 @@ import com.alibaba.druid.util.JdbcConstants;
public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatement {
private SQLWithSubqueryClause with;
private List<SQLName> using = new ArrayList<SQLName>(2);
private boolean returning;
private String alias;
@@ -52,23 +50,7 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem
this.alias = alias;
}
public List<SQLName> getUsing() {
return using;
}
public void setUsing(List<SQLName> using) {
this.using = using;
}
public SQLWithSubqueryClause getWith() {
return with;
}
public void setWith(SQLWithSubqueryClause with) {
this.with = with;
}
protected void accept0(SQLASTVisitor visitor) {
accept0((PGASTVisitor) visitor);
@@ -90,14 +72,6 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem
PGDeleteStatement x = new PGDeleteStatement();
cloneTo(x);
if (with != null) {
x.setWith(with.clone());
}
for (SQLName item : using) {
SQLName item2 = item.clone();
item2.setParent(x);
x.using.add(item2);
}
x.returning = returning;
x.alias = alias;
@@ -23,19 +23,21 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatement {
private SQLWithSubqueryClause with;
private List<ValuesClause> valuesList = new ArrayList<ValuesClause>();
private SQLExpr returning;
private boolean defaultValues = false;
public PGInsertStatement() {
dbType = JdbcConstants.POSTGRESQL;
}
public void cloneTo(PGInsertStatement x) {
super.cloneTo(x);
if (with != null) {
x.setWith(with.clone());
}
for (ValuesClause v : valuesList) {
ValuesClause v2 = v.clone();
v2.setParent(x);
@@ -55,13 +57,6 @@ public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatem
this.returning = returning;
}
public SQLWithSubqueryClause getWith() {
return with;
}
public void setWith(SQLWithSubqueryClause with) {
this.with = with;
}
public ValuesClause getValues() {
if (valuesList.size() == 0) {
@@ -185,15 +185,9 @@ public class PGSQLStatementParser extends SQLStatementParser {
if (lexer.token() == Token.USING) {
lexer.nextToken();
for (;;) {
SQLName name = this.exprParser.name();
deleteStatement.getUsing().add(name);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
SQLTableSource tableSource = createSQLSelectParser().parseTableSource();
deleteStatement.setUsing(tableSource);
}
if (lexer.token() == (Token.WHERE)) {
@@ -246,10 +246,11 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
print0(x.getAlias());
}
if (x.getUsing().size() > 0) {
SQLTableSource using = x.getUsing();
if (using != null) {
println();
print0(ucase ? "USING " : "using ");
printAndAccept(x.getUsing(), ", ");
using.accept(this);
}
if (x.getWhere() != null) {
@@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr;
@@ -41,6 +42,7 @@ import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Mode;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.PGUtils;
public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisitor {
public PGSchemaStatVisitor() {
@@ -90,7 +92,8 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
@Override
public boolean visit(PGDeleteStatement x) {
if (repository != null) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
@@ -100,16 +103,9 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
setAliasMap();
for (SQLName name : x.getUsing()) {
String ident = name.toString();
TableStat stat = getTableStat(ident);
stat.incrementSelectCount();
Map<String, String> aliasMap = getAliasMap();
if (aliasMap != null) {
aliasMap.put(ident, ident);
}
SQLTableSource using = x.getUsing();
if (using != null) {
using.accept(this);
}
x.putAttribute("_original_use_mode", getMode());
@@ -133,6 +129,11 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
@Override
public boolean visit(PGInsertStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
setAliasMap();
if (x.getWith() != null) {
@@ -144,8 +145,9 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
String originalTable = getCurrentTable();
if (x.getTableName() instanceof SQLName) {
String ident = ((SQLName) x.getTableName()).toString();
SQLName tableName = x.getTableName();
{
String ident = tableName.toString();
setCurrentTable(ident);
x.putAttribute("_old_local_", originalTable);
@@ -182,8 +184,17 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
}
public boolean isPseudoColumn(long hash) {
return PGUtils.isPseudoColumn(hash);
}
@Override
public boolean visit(PGUpdateStatement x) {
if (repository != null
&& x.getParent() == null) {
repository.resolve(x);
}
Map<String, String> oldAliasMap = getAliasMap();
setAliasMap();
@@ -147,4 +147,10 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements
}
return schema_hash;
}
@Override
public long hashCode64() {
// TODO hashCode64
return 0;
}
}
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class SQLServerInsertStatement extends SQLInsertStatement implements SQLServerObject {
@@ -33,6 +34,10 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS
private SQLServerOutput output;
public SQLServerInsertStatement() {
dbType = JdbcConstants.SQL_SERVER;
}
public void cloneTo(SQLServerInsertStatement x) {
super.cloneTo(x);
x.defaultValues = defaultValues;