diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 66d0a3a5a9..7ed24920a3 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -299,7 +299,14 @@ public class PagerUtils { if (query instanceof SQLSelectQueryBlock) { OracleSelectQueryBlock queryBlock = (OracleSelectQueryBlock) query; - if (queryBlock.getGroupBy() == null && select.getOrderBy() == null && offset <= 0) { + SQLOrderBy orderBy = select.getOrderBy(); + if (orderBy == null && queryBlock.getOrderBy() != null) { + orderBy = queryBlock.getOrderBy(); + } + + if (queryBlock.getGroupBy() == null + && orderBy == null && offset <= 0) { + SQLExpr where = queryBlock.getWhere(); if (check && where instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr binaryOpWhere = (SQLBinaryOpExpr) where; @@ -664,12 +671,16 @@ public class PagerUtils { if (selectQuery != null) { + SQLOrderBy orderBy = selectQuery.getOrderBy(); + SQLObject parent = selectQuery.getParent(); - if (parent instanceof SQLSelect) { + if (orderBy == null && parent instanceof SQLSelect) { SQLSelect select = (SQLSelect) parent; - if (select.getOrderBy() == null || select.getOrderBy().getItems().size() == 0) { - unorderedLimitCount++; - } + orderBy = select.getOrderBy(); + } + + if (orderBy == null || orderBy.getItems().size() == 0) { + unorderedLimitCount++; } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDeclareItem.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDeclareItem.java index 7f53890876..93dedf9966 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDeclareItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDeclareItem.java @@ -25,7 +25,7 @@ public class SQLDeclareItem extends SQLObjectImpl implements SQLObjectWithDataTy protected Type type; - protected SQLExpr name; + protected SQLName name; protected SQLDataType dataType; @@ -33,16 +33,18 @@ public class SQLDeclareItem extends SQLObjectImpl implements SQLObjectWithDataTy protected List tableElementList = new ArrayList(); + protected transient SQLObject resolvedObject; + public SQLDeclareItem() { } - public SQLDeclareItem(SQLExpr name, SQLDataType dataType) { + public SQLDeclareItem(SQLName name, SQLDataType dataType) { this.setName(name); this.setDataType(dataType); } - public SQLDeclareItem(SQLExpr name, SQLDataType dataType, SQLExpr value) { + public SQLDeclareItem(SQLName name, SQLDataType dataType, SQLExpr value) { this.setName(name); this.setDataType(dataType); this.setValue(value); @@ -59,11 +61,11 @@ public class SQLDeclareItem extends SQLObjectImpl implements SQLObjectWithDataTy visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr name) { + public void setName(SQLName name) { if (name != null) { name.setParent(this); } @@ -112,4 +114,11 @@ public class SQLDeclareItem extends SQLObjectImpl implements SQLObjectWithDataTy this.type = type; } + public SQLObject getResolvedObject() { + return resolvedObject; + } + + public void setResolvedObject(SQLObject resolvedObject) { + this.resolvedObject = resolvedObject; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLName.java b/src/main/java/com/alibaba/druid/sql/ast/SQLName.java index 65f4e03c6f..cce3952f68 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLName.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLName.java @@ -21,4 +21,6 @@ public interface SQLName extends SQLExpr { SQLName clone(); long name_hash_lower(); + + long hashCode64(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLParameter.java b/src/main/java/com/alibaba/druid/sql/ast/SQLParameter.java index 9ba71eb29f..3248043b01 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLParameter.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLParameter.java @@ -22,7 +22,7 @@ import java.util.List; public class SQLParameter extends SQLObjectImpl implements SQLObjectWithDataType { - private SQLExpr name; + private SQLName name; private SQLDataType dataType; private SQLExpr defaultValue; private ParameterType paramType; @@ -43,11 +43,11 @@ public class SQLParameter extends SQLObjectImpl implements SQLObjectWithDataType this.defaultValue = deaultValue; } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr name) { + public void setName(SQLName name) { if (name != null) { name.setParent(this); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java index 91b2b48aa7..4c23ee085f 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java @@ -16,9 +16,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLDataType; -import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FNVUtils; @@ -32,7 +30,10 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { private transient Boolean parameter; private transient SQLColumnDefinition resolvedColumn; - private transient SQLTableSource resolvedTableSource; + private transient SQLParameter resolvedParameter; + private transient SQLDeclareItem resolvedDeclareItem; + + private transient SQLObject resolvedOwnerObject; public SQLIdentifierExpr(){ @@ -69,6 +70,11 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { } public long name_hash_lower() { + return hashCode64(); + } + + @Override + public long hashCode64() { if (hash_lower == 0 && name != null) { final int len = name.length(); @@ -183,7 +189,7 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { public SQLIdentifierExpr clone() { SQLIdentifierExpr x = new SQLIdentifierExpr(this.name); x.resolvedColumn = resolvedColumn; - x.resolvedTableSource = resolvedTableSource; + x.resolvedOwnerObject = resolvedOwnerObject; return x; } @@ -200,11 +206,39 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { } public SQLTableSource getResolvedTableSource() { - return resolvedTableSource; + if (resolvedOwnerObject instanceof SQLTableSource) { + return (SQLTableSource) resolvedOwnerObject; + } + + return null; } public void setResolvedTableSource(SQLTableSource resolvedTableSource) { - this.resolvedTableSource = resolvedTableSource; + this.resolvedOwnerObject = resolvedTableSource; + } + + public SQLObject getResolvedOwnerObject() { + return resolvedOwnerObject; + } + + public void setResolvedOwnerObject(SQLObject resolvedOwnerObject) { + this.resolvedOwnerObject = resolvedOwnerObject; + } + + public SQLParameter getResolvedParameter() { + return resolvedParameter; + } + + public void setResolvedParameter(SQLParameter resolvedParameter) { + this.resolvedParameter = resolvedParameter; + } + + public SQLDeclareItem getResolvedDeclareItem() { + return resolvedDeclareItem; + } + + public void setResolvedDeclareItem(SQLDeclareItem resolvedDeclareItem) { + this.resolvedDeclareItem = resolvedDeclareItem; } public SQLDataType computeDataType() { @@ -212,9 +246,9 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { return resolvedColumn.getDataType(); } - if (resolvedTableSource != null - && resolvedTableSource instanceof SQLSubqueryTableSource) { - SQLSelect select = ((SQLSubqueryTableSource) resolvedTableSource).getSelect(); + if (resolvedOwnerObject != null + && resolvedOwnerObject instanceof SQLSubqueryTableSource) { + SQLSelect select = ((SQLSubqueryTableSource) resolvedOwnerObject).getSelect(); SQLSelectQueryBlock queryBlock = select.getFirstQueryBlock(); if (queryBlock == null) { return null; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java index f432885a1c..edf9b50192 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java @@ -16,10 +16,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLDataType; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -33,7 +30,10 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { protected long name_hash_lower; private transient SQLColumnDefinition resolvedColumn; - private transient SQLTableSource resolvedTableSource; + + private transient SQLObject resolvedTableSource; + + private transient long hash_ower; public SQLPropertyExpr(String owner, String name){ this(new SQLIdentifierExpr(owner), name); @@ -75,6 +75,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { owner.setParent(this); } this.owner = owner; + this.hash_ower = 0; } public void setOwner(String owner) { @@ -87,6 +88,8 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { public void setName(String name) { this.name = name; + this.hash_ower = 0; + this.name_hash_lower = 0; } public void output(StringBuffer buf) { @@ -105,11 +108,15 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((owner == null) ? 0 : owner.hashCode()); - return result; + long hash = hashCode64(); + return (int)(hash ^ (hash >>> 32)); + } + + public long hashCode64() { + if (hash_ower == 0) { + hash_ower = FNVUtils.fnv_64_lower(this); + } + return hash_ower; } @Override @@ -175,6 +182,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { char c1 = name.charAt(len - 1); if ((c0 == '`' && c1 == '`') || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') || (c0 == '[' && c1 == ']')) { quote = true; } @@ -211,13 +219,33 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { } public SQLTableSource getResolvedTableSource() { - return resolvedTableSource; + if (resolvedTableSource instanceof SQLTableSource) { + return (SQLTableSource) resolvedTableSource; + } + + return null; } public void setResolvedTableSource(SQLTableSource resolvedTableSource) { this.resolvedTableSource = resolvedTableSource; } + public void setResolvedProcedure(SQLCreateProcedureStatement stmt) { + this.resolvedTableSource = stmt; + } + + public void setResolvedOwnerObject(SQLObject resolvedOwnerObject) { + this.resolvedTableSource = resolvedOwnerObject; + } + + public SQLCreateProcedureStatement getResolvedProcudure() { + if (this.resolvedTableSource instanceof SQLCreateProcedureStatement) { + return (SQLCreateProcedureStatement) this.resolvedTableSource; + } + + return null; + } + public SQLDataType computeDataType() { if (resolvedColumn != null) { return resolvedColumn.getDataType(); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java index 495805c697..a5414c60d9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java @@ -34,6 +34,10 @@ public class SQLBlockStatement extends SQLStatementImpl { public SQLStatement exception; + public SQLBlockStatement() { + + } + public List getStatementList() { return statementList; } @@ -110,4 +114,14 @@ public class SQLBlockStatement extends SQLStatementImpl { return x; } + + public SQLParameter findParameter(long hash) { + for (SQLParameter param : this.parameters) { + if (param.getName().name_hash_lower() == hash) { + return param; + } + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java index 01bdd98d22..4a4dd38a7a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java @@ -64,6 +64,10 @@ public abstract class SQLConstraintImpl extends SQLObjectImpl implements SQLCons this.name = name; } + public void setName(String name) { + this.setName(new SQLIdentifierExpr(name)); + } + public Boolean getEnable() { return enable; } @@ -107,7 +111,7 @@ public abstract class SQLConstraintImpl extends SQLObjectImpl implements SQLCons SQLIdentifierExpr identExpr = (SQLIdentifierExpr) this.name; String columnName = identExpr.getName(); columnName = SQLUtils.normalize(columnName, dbType); - identExpr.setName(columnName); + this.setName(columnName); } } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java index d48d7d592c..416419dfa7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java @@ -166,4 +166,14 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl implements SQL public void setModifiesSqlData(boolean modifiesSqlData) { this.modifiesSqlData = modifiesSqlData; } + + public SQLParameter findParameter(long hash) { + for (SQLParameter param : this.parameters) { + if (param.getName().name_hash_lower() == hash) { + return param; + } + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index a3373f83d7..b14f03bdf0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -31,6 +31,7 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FNVUtils; import com.alibaba.druid.util.ListDG; import com.alibaba.druid.util.lang.Consumer; +import oracle.sql.SQLUtil; public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLStatement, SQLCreateStatement { @@ -47,6 +48,8 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS protected SQLExpr comment; + protected SQLExprTableSource like; + public SQLCreateTableStatement(){ } @@ -159,6 +162,21 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS this.select = select; } + 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; + } + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { @@ -569,13 +587,6 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS identExpr.setName(tableName); } - if (name instanceof SQLIdentifierExpr) { - SQLIdentifierExpr identExpr = (SQLIdentifierExpr) name; - String tableName = identExpr.getName(); - tableName = SQLUtils.normalize(tableName); - identExpr.setName(tableName); - } - for (SQLTableElement element : this.tableElementList) { if (element instanceof SQLColumnDefinition) { SQLColumnDefinition column = (SQLColumnDefinition) element; @@ -901,8 +912,12 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS } public SQLCreateTableStatement clone() { - SQLCreateTableStatement x = new SQLCreateTableStatement(); + SQLCreateTableStatement x = new SQLCreateTableStatement(dbType); cloneTo(x); return x; } + + public String toString() { + return SQLUtils.toSQLString(this, dbType); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeclareStatement.java index b276ddd2c2..ae353a00a0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeclareStatement.java @@ -32,11 +32,11 @@ public class SQLDeclareStatement extends SQLStatementImpl { } - public SQLDeclareStatement(SQLExpr name, SQLDataType dataType) { + public SQLDeclareStatement(SQLName name, SQLDataType dataType) { this.addItem(new SQLDeclareItem(name, dataType)); } - public SQLDeclareStatement(SQLExpr name, SQLDataType dataType, SQLExpr value) { + public SQLDeclareStatement(SQLName name, SQLDataType dataType, SQLExpr value) { this.addItem(new SQLDeclareItem(name, dataType, value)); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java index dc10784a8b..852d150436 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java @@ -20,10 +20,12 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceable { + protected SQLWithSubqueryClause with; protected SQLTableSource tableSource; protected SQLExpr where; protected SQLTableSource from; + protected SQLTableSource using; protected boolean only = false; @@ -44,6 +46,10 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab } } + if (with != null) { + x.setWith(with.clone()); + } + if (tableSource != null) { x.setTableSource(tableSource.clone()); } @@ -53,6 +59,9 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab if (from != null) { x.setFrom(from.clone()); } + if (using != null) { + x.setUsing(using.clone()); + } x.only = only; } @@ -131,6 +140,7 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { + acceptChild(visitor, with); acceptChild(visitor, tableSource); acceptChild(visitor, where); } @@ -165,4 +175,23 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab public void setOnly(boolean only) { this.only = only; } + + public SQLTableSource getUsing() { + return using; + } + + public void setUsing(SQLTableSource using) { + this.using = using; + } + + public SQLWithSubqueryClause getWith() { + return with; + } + + public void setWith(SQLWithSubqueryClause with) { + if (with != null) { + with.setParent(this); + } + this.with = with; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java index a9aba9b6c4..39b10f61fd 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java @@ -33,6 +33,7 @@ public class SQLExprTableSource extends SQLTableSourceImpl { protected SQLExpr expr; private List partitions; + private SchemaObject schemaObject; public SQLExprTableSource(){ @@ -257,15 +258,20 @@ public class SQLExprTableSource extends SQLTableSourceImpl { } public SQLTableSource findTableSourceWithColumn(long columnName_hash) { - if (schemaObject == null) { - return null; + if (schemaObject != null) { + SQLStatement stmt = schemaObject.getStatement(); + if (stmt instanceof SQLCreateTableStatement) { + SQLCreateTableStatement createTableStmt = (SQLCreateTableStatement) stmt; + if (createTableStmt.findColumn(columnName_hash) != null) { + return this; + } + } } - SQLStatement stmt = schemaObject.getStatement(); - if (stmt instanceof SQLCreateTableStatement) { - SQLCreateTableStatement createTableStmt = (SQLCreateTableStatement) stmt; - if (createTableStmt.findColumn(columnName_hash) != null) { - return this; + if (expr instanceof SQLIdentifierExpr) { + SQLTableSource tableSource = ((SQLIdentifierExpr) expr).getResolvedTableSource(); + if (tableSource != null) { + return tableSource.findTableSourceWithColumn(columnName_hash); } } @@ -288,6 +294,13 @@ public class SQLExprTableSource extends SQLTableSourceImpl { } } + if (expr instanceof SQLPropertyExpr) { + long hash = ((SQLPropertyExpr) expr).hashCode64(); + if (hash == alias_hash) { + return this; + } + } + return null; } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index ad6a5b7039..b273bf108d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -18,13 +18,17 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import oracle.sql.SQLUtil; public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { - private String dbType; + protected SQLWithSubqueryClause with; + + protected String dbType; protected boolean upsert = false; // for phoenix @@ -39,6 +43,10 @@ public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { x.dbType = dbType; x.upsert = upsert; x.afterSemi = afterSemi; + + if (with != null) { + x.setWith(with.clone()); + } } public SQLInsertStatement clone() { @@ -148,4 +156,20 @@ public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { public void setAfterSemi(boolean afterSemi) { this.afterSemi = afterSemi; } + + + public SQLWithSubqueryClause getWith() { + return with; + } + + public void setWith(SQLWithSubqueryClause with) { + if (with != null) { + with.setParent(this); + } + this.with = with; + } + + public String toString() { + return SQLUtils.toSQLString(this, dbType); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLMergeStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLMergeStatement.java index bc479e85e5..e5ffcb562a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLMergeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLMergeStatement.java @@ -50,11 +50,7 @@ public class SQLMergeStatement extends SQLStatementImpl { } public String getAlias() { - return alias; - } - - public void setAlias(String alias) { - this.alias = alias; + return into.getAlias(); } public SQLTableSource getInto() { @@ -171,8 +167,8 @@ public class SQLMergeStatement extends SQLStatementImpl { public void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, columns); - acceptChild(visitor, columns); - acceptChild(visitor, columns); + acceptChild(visitor, values); + acceptChild(visitor, where); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index e5ad85a248..d1f76642b0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -186,10 +186,6 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { } public boolean match(long alias_hash) { - if (alias == null) { - return false; - } - long hash = alias_hash(); if (hash == alias_hash) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java index 448d644195..ac58ffb658 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java @@ -28,6 +28,8 @@ public class SQLSelectOrderByItem extends SQLObjectImpl implements SQLReplaceabl protected SQLOrderingSpecification type; protected NullsOrderType nullsOrderType; + protected transient SQLSelectItem resolvedSelectItem; + public SQLSelectOrderByItem(){ } @@ -140,4 +142,12 @@ public class SQLSelectOrderByItem extends SQLObjectImpl implements SQLReplaceabl x.nullsOrderType = nullsOrderType; return x; } + + public SQLSelectItem getResolvedSelectItem() { + return resolvedSelectItem; + } + + public void setResolvedSelectItem(SQLSelectItem resolvedSelectItem) { + this.resolvedSelectItem = resolvedSelectItem; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index 5974306ea9..eaa35ade82 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -20,9 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.repository.SchemaObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FNVUtils; @@ -52,6 +50,9 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery protected SQLLimit limit; + // for oracle + protected List forUpdateOf; + public SQLSelectQueryBlock(){ } @@ -313,6 +314,7 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery if (visitor.visit(this)) { acceptChild(visitor, this.selectList); acceptChild(visitor, this.from); + acceptChild(visitor, this.into); acceptChild(visitor, this.where); acceptChild(visitor, this.startWith); acceptChild(visitor, this.connectBy); @@ -370,6 +372,21 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return x; } + public List getForUpdateOf() { + if (forUpdateOf == null) { + forUpdateOf = new ArrayList(1); + } + return forUpdateOf; + } + + public int getForUpdateOfSize() { + if (forUpdateOf == null) { + return 0; + } + + return forUpdateOf.size(); + } + public void cloneTo(SQLSelectQueryBlock x) { x.distionOption = distionOption; @@ -484,6 +501,28 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return null; } + public boolean selectItemHashAllColumn() { + for (SQLSelectItem item : this.selectList) { + SQLExpr expr = item.getExpr(); + + boolean allColumn = expr instanceof SQLAllColumnExpr + || (expr instanceof SQLPropertyExpr && ((SQLPropertyExpr) expr).getName().equals("*")); + + if (allColumn) { + if (from instanceof SQLSubqueryTableSource) { + SQLSelect subSelect = ((SQLSubqueryTableSource) from).select; + SQLSelectQueryBlock queryBlock = subSelect.getQueryBlock(); + if (queryBlock != null) { + return queryBlock.selectItemHashAllColumn(); + } + } + return true; + } + } + + return false; + } + public SQLColumnDefinition findColumn(String columnName) { if (from == null) { return null; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java index 55996c4147..65c6ee3d46 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java @@ -106,7 +106,12 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab } public SQLColumnDefinition findColumn(String columnName) { - return null; + if (columnName == null) { + return null; + } + + long hash = FNVUtils.fnv_64_lower_normalized(alias); + return findColumn(hash); } public SQLColumnDefinition findColumn(long columnNameHash) { @@ -114,7 +119,12 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab } public SQLTableSource findTableSourceWithColumn(String columnName) { - return null; + if (columnName == null) { + return null; + } + + long hash = FNVUtils.fnv_64_lower_normalized(alias); + return findTableSourceWithColumn(hash); } public SQLTableSource findTableSourceWithColumn(long columnNameHash) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java index 3bb4417e76..e0509458d0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java @@ -18,10 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLReplaceable; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceable { @@ -33,6 +30,9 @@ public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceab protected SQLTableSource tableSource; protected List returning; + // for mysql + protected SQLOrderBy orderBy; + public SQLUpdateStatement(){ } @@ -136,6 +136,7 @@ public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceab acceptChild(visitor, from); acceptChild(visitor, items); acceptChild(visitor, where); + acceptChild(visitor, orderBy); } visitor.endVisit(this); } @@ -148,4 +149,16 @@ public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceab } return false; } + + + public SQLOrderBy getOrderBy() { + return orderBy; + } + + public void setOrderBy(SQLOrderBy orderBy) { + if (orderBy != null) { + orderBy.setParent(this); + } + this.orderBy = orderBy; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java index 8a8f7103ad..3f8f9dc3e8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java @@ -126,6 +126,15 @@ public class SQLWithSubqueryClause extends SQLObjectImpl { public List getColumns() { return columns; } + + public SQLTableSource findTableSourceWithColumn(long columnNameHash) { + for (SQLName column : columns) { + if (column.name_hash_lower() == columnNameHash) { + return this; + } + } + return null; + } } public Entry findEntry(long alias_hash) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCursorDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCursorDeclareStatement.java index 17ddaa90f9..d9357d475b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCursorDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCursorDeclareStatement.java @@ -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); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java index 3b81c58689..f1189c55fe 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java @@ -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); - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java index 3f644e0768..99018050a5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index 929ab8c4df..cc9bba6716 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -48,7 +48,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement private List optionHints = new ArrayList(); - 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 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 getOptionHints() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java index 54d11e4bee..85d0511ac6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java index cffbc3ef5b..a78fae44b1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlInsertStatement.java @@ -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 duplicateKeyUpdate = new ArrayList(); + public MySqlInsertStatement() { + dbType = JdbcConstants.MYSQL; + } + public void cloneTo(MySqlInsertStatement x) { super.cloneTo(x); x.lowPriority = lowPriority; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java index 80818274ca..b5a3f84795 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java @@ -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); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java index 7b52d3f98c..1a2cc452f6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java @@ -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; - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index af4241ae26..ac46ec5454 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -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 valueClauseList, int columnSize) { + private void parseValueClause(List 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); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index fb41680c8f..9c1e7cf2d1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -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(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 57c4121869..1809b7db3a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -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); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java index 1f3a66bedc..c73eb69a86 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java index 8b9c8737e1..070886bbb3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java index 0960579b5c..e47e874b6e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java @@ -145,4 +145,10 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr } return dbLink_hash; } + + @Override + public long hashCode64() { + // TODO hashCode64 + return 0; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java index 149cf14ba8..413b9790b9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleInsertStatement.java @@ -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 hints = new ArrayList(); + public OracleInsertStatement() { + dbType = JdbcConstants.ORACLE; + } + public void cloneTo(OracleInsertStatement x) { super.cloneTo(x); if (returning != null) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java index e88d67867d..d89197799e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java @@ -37,7 +37,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { private ModelClause modelClause; - private List forUpdateOf; + private boolean skipLocked = false; public OracleSelectQueryBlock clone() { @@ -97,21 +97,6 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { return hints.size(); } - public List getForUpdateOf() { - if (forUpdateOf == null) { - forUpdateOf = new ArrayList(1); - } - return forUpdateOf; - } - - public int getForUpdateOfSize() { - if (forUpdateOf == null) { - return 0; - } - - return forUpdateOf.size(); - } - public boolean isSkipLocked() { return skipLocked; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 169e54054c..29f7044036 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 6731536b6b..1e499b0bc1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -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) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index a3acad630d..991ce1ec0a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -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()) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 0fbd27ee8a..d62a337756 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -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 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 diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java index 1153d04171..85b08572f7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java @@ -27,8 +27,6 @@ import com.alibaba.druid.util.JdbcConstants; public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatement { - private SQLWithSubqueryClause with; - private List using = new ArrayList(2); private boolean returning; private String alias; @@ -52,23 +50,7 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem this.alias = alias; } - public List getUsing() { - return using; - } - public void setUsing(List 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; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java index 078f3374dc..7d0eec5eff 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGInsertStatement.java @@ -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 valuesList = new ArrayList(); 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) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index a022d1ca82..7f0e176431 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -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)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index ce1a92bef9..edc496e3a4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -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) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index 1ff241affc..171f48f916 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -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 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 oldAliasMap = getAliasMap(); setAliasMap(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java index 1eadba0bc3..c89736a5e7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java @@ -147,4 +147,10 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements } return schema_hash; } + + @Override + public long hashCode64() { + // TODO hashCode64 + return 0; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java index 4717df19fa..cafd94189b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java @@ -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; diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index f7ef0171ae..2fb3dbbb88 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -190,6 +190,8 @@ public class Lexer { int sp; int np; char ch; + long hash; + long hash_lower; Token token; String stringVal; } @@ -206,6 +208,8 @@ public class Lexer { savePoint.ch = ch; savePoint.token = token; savePoint.stringVal = stringVal; + savePoint.hash = hash; + savePoint.hash_lower = hash_lower; return this.savePoint = savePoint; } @@ -216,6 +220,8 @@ public class Lexer { this.ch = savePoint.ch; this.token = savePoint.token; this.stringVal = savePoint.stringVal; + this.hash = savePoint.hash; + this.hash_lower = savePoint.hash_lower; } public void reset() { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index b3a2897bf8..01ef14d1de 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.util.FNVUtils; import com.alibaba.druid.util.JdbcConstants; @@ -48,11 +49,25 @@ public class SQLSelectParser extends SQLParser { select.setWithSubQuery(with); } - select.setQuery(query()); - select.setOrderBy(parseOrderBy()); + SQLSelectQuery query = query(); + select.setQuery(query); - if (select.getOrderBy() == null) { - select.setOrderBy(parseOrderBy()); + SQLOrderBy orderBy = this.parseOrderBy(); + + if (query instanceof SQLSelectQueryBlock) { + SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; + + if (queryBlock.getOrderBy() == null) { + queryBlock.setOrderBy(orderBy); + } else { + select.setOrderBy(orderBy); + } + + if (orderBy != null) { + parseFetchClause(queryBlock); + } + } else { + select.setOrderBy(orderBy); } while (lexer.token == Token.HINT) { @@ -609,17 +624,20 @@ public class SQLSelectParser extends SQLParser { rightTableSource = new SQLExprTableSource(expr); } - if (lexer.identifierEquals("USING")) { + if (lexer.token == Token.USING + ||lexer.identifierEquals(FNVUtils.USING)) + { + Lexer.SavePoint savePoint = lexer.mark(); lexer.nextToken(); - if (lexer.token == Token.LPAREN) { - lexer.nextToken(); - this.exprParser.exprList(join.getUsing(), join); - accept(Token.RPAREN); - } else { - join.getUsing().add(this.expr()); - } - join.setAlias(this.tableAlias()); + if (lexer.token == Token.LPAREN + || lexer.token == Token.IDENTIFIER) { + lexer.reset(savePoint); + join.setRight(rightTableSource); + return join; + } else { + join.setAlias(this.tableAlias()); + } } else { rightTableSource.setAlias(this.tableAlias()); @@ -659,14 +677,16 @@ public class SQLSelectParser extends SQLParser { if (lexer.token == Token.ON) { lexer.nextToken(); join.setCondition(expr()); - } else if (lexer.identifierEquals("USING")) { + } else if (lexer.token == Token.USING + || lexer.identifierEquals(FNVUtils.USING)) { + Lexer.SavePoint savePoint = lexer.mark(); lexer.nextToken(); if (lexer.token == Token.LPAREN) { lexer.nextToken(); this.exprParser.exprList(join.getUsing(), join); accept(Token.RPAREN); } else { - join.getUsing().add(this.expr()); + lexer.reset(savePoint); } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 396de8ea8f..9e37fff984 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -369,7 +369,15 @@ public class SQLStatementParser extends SQLParser { } } + int size = statementList.size(); if (parseStatementListDialect(statementList)) { + if (parent != null) { + for (int i = size; i < statementList.size(); ++i) { + SQLStatement dialectStmt = statementList.get(i); + dialectStmt.setParent(parent); + } + } + continue; } @@ -2593,6 +2601,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.MERGE); SQLMergeStatement stmt = new SQLMergeStatement(); + stmt.setDbType(dbType); parseHints(stmt.getHints()); @@ -2608,7 +2617,7 @@ public class SQLStatementParser extends SQLParser { stmt.setInto(exprParser.name()); } - stmt.setAlias(tableAlias()); + stmt.getInto().setAlias(tableAlias()); accept(Token.USING); diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java index f550dec943..522f120b19 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; @@ -256,7 +257,8 @@ public class SchemaRepository { int optionsValue = SchemaResolveVisitor.Option.of(options); SchemaResolveVisitor resolveVisitor; - if (JdbcConstants.MYSQL.equals(dbType)) { + if (JdbcConstants.MYSQL.equals(dbType) + || JdbcConstants.SQLITE.equals(dbType)) { resolveVisitor = new SchemaResolveVisitorFactory.MySqlResolveVisitor(this, optionsValue); } else if (JdbcConstants.ORACLE.equals(dbType)) { resolveVisitor = new SchemaResolveVisitorFactory.OracleResolveVisitor(this, optionsValue); @@ -417,31 +419,6 @@ public class SchemaRepository { } - - - - - - - - protected void resolve(SchemaResolveVisitor visitor, SQLExprTableSource x) { - if (x.getSchemaObject() != null) { - return; - } - - SQLExpr expr = x.getExpr(); - if (expr instanceof SQLName) { - SchemaObject table = findTable((SQLName) expr); - if (table != null) { - x.setSchemaObject(table); - } - } - } - - - - - public SchemaObject findTable(SQLExprTableSource x) { if (x == null) { return null; @@ -648,6 +625,12 @@ public class SchemaRepository { if (queryBlock != null) { List selectList = queryBlock.getSelectList(); for (SQLSelectItem selectItem : selectList) { + SQLExpr selectItemExpr = selectItem.getExpr(); + if (selectItemExpr instanceof SQLAllColumnExpr + || (selectItemExpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) selectItemExpr).getName().equals("*"))) { + continue; + } + String name = selectItem.computeAlias(); SQLDataType dataType = selectItem.computeDataType(); SQLColumnDefinition column = new SQLColumnDefinition(); @@ -656,7 +639,34 @@ public class SchemaRepository { column.setDbType(dbType); x1.getTableElementList().add(column); } - x1.setSelect(null); + if (x1.getTableElementList().size() > 0) { + x1.setSelect(null); + } + } + } + + SQLExprTableSource like = x1.getLike(); + if (like != null) { + SchemaObject tableObject = null; + + SQLName name = like.getName(); + if (name != null) { + tableObject = findTable(name); + } + + SQLCreateTableStatement tableStmt = null; + if (tableObject != null) { + SQLStatement stmt = tableObject.getStatement(); + if (stmt instanceof SQLCreateTableStatement) { + tableStmt = (SQLCreateTableStatement) stmt; + } + } + + if (tableStmt != null) { + SQLName tableName = x1.getName(); + tableStmt.cloneTo(x1); + x1.setName(tableName); + x1.setLike((SQLExprTableSource) null); } } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java index c4c29b4f00..72c2b1e580 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java @@ -15,11 +15,15 @@ */ package com.alibaba.druid.sql.repository; +import com.alibaba.druid.sql.ast.SQLDeclareItem; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -70,6 +74,8 @@ public interface SchemaResolveVisitor extends SQLASTVisitor { private Map tableSourceMap; + protected Map declares; + public Context(SQLObject object, Context parent) { this.object = object; this.parent = parent; @@ -94,5 +100,19 @@ public interface SchemaResolveVisitor extends SQLASTVisitor { public void addTableSource(long alias_hash, SQLTableSource tableSource) { tableSourceMap.put(alias_hash, tableSource); } + + protected void declare(SQLDeclareItem x) { + if (declares == null) { + declares = new HashMap(); + } + declares.put(x.getName().name_hash_lower(), x); + } + + protected SQLDeclareItem findDeclare(long nameHash) { + if (declares == null) { + return null; + } + return declares.get(nameHash); + } } } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java index 6c3950b4b1..a9180a6d85 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -1,35 +1,29 @@ package com.alibaba.druid.sql.repository; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.*; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitorAdapter; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; -import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement; -import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; +import com.alibaba.druid.sql.dialect.odps.ast.*; import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitorAdapter; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; -import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; -import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; -import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; -import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.*; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitorAdapter; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerUpdateStatement; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; +import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.PGUtils; import java.util.ArrayList; import java.util.List; @@ -45,8 +39,23 @@ class SchemaResolveVisitorFactory { this.options = options; } + public boolean visit(MySqlRepeatStatement x) { + return true; + } + + public boolean visit(MySqlDeclareStatement x) { + for (SQLDeclareItem declareItem : x.getVarList()) { + visit(declareItem); + } + return false; + } + + public boolean visit(MySqlCursorDeclareStatement x) { + return true; + } + public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); return false; } @@ -55,6 +64,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLSelectQueryBlock x) { + resolve(this, x); + return false; + } + public boolean visit(SQLSelectItem x) { SQLExpr expr = x.getExpr(); if (expr instanceof SQLIdentifierExpr) { @@ -114,6 +128,66 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(MySqlInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(MySqlReplaceStatement x) { + Context ctx = createContext(x); + + SQLExprTableSource tableSource = x.getTableSource(); + ctx.setTableSource(tableSource); + visit(tableSource); + + for (SQLExpr column : x.getColumns()) { + column.accept(this); + } + + SQLQueryExpr queryExpr = x.getQuery(); + if (queryExpr != null) { + visit(queryExpr.getSubQuery()); + } + + popContext(); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -153,7 +227,12 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); + return false; + } + + public boolean visit(SQLSelectQueryBlock x) { + resolve(this, x); return false; } @@ -217,6 +296,41 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -254,13 +368,29 @@ class SchemaResolveVisitorFactory { this.options = options; } + public boolean visit(OracleCreatePackageStatement x) { + Context ctx = createContext(x); + + for (SQLStatement stmt : x.getStatements()) { + stmt.accept(this); + } + + popContext(); + return false; + } + public boolean visit(OracleSelectTableReference x) { - repository.resolve(this, x); + resolve(this, x); return false; } public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); + return false; + } + + public boolean visit(SQLSelectQueryBlock x) { + resolve(this, x); return false; } @@ -339,6 +469,74 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(OracleMultiInsertStatement x) { + Context ctx = createContext(x); + + SQLSelect select = x.getSubQuery(); + visit(select); + + OracleSelectSubqueryTableSource tableSource = new OracleSelectSubqueryTableSource(select); + tableSource.setParent(x); + ctx.setTableSource(tableSource); + + for (OracleMultiInsertStatement.Entry entry : x.getEntries()) { + entry.accept(this); + } + + popContext(); + return false; + } + + public boolean visit(OracleMultiInsertStatement.InsertIntoClause x) { + for (SQLExpr column : x.getColumns()) { + if (column instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identColumn = (SQLIdentifierExpr) column; + identColumn.setResolvedTableSource(x.getTableSource()); + } + } + return true; + } + + public boolean visit(OracleInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -376,7 +574,12 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); + return false; + } + + public boolean visit(SQLSelectQueryBlock x) { + resolve(this, x); return false; } @@ -445,6 +648,63 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(OdpsInsert x) { + Context ctx = createContext(x); + + SQLExprTableSource tableSource = x.getTableSource(); + if (tableSource != null) { + ctx.setTableSource(x.getTableSource()); + visit(tableSource); + } + + for (SQLAssignItem item : x.getPartitions()) { + item.accept(this); + } + + SQLSelect select = x.getQuery(); + if (select != null) { + visit(select); + } + + popContext(); + return false; + } + + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -482,7 +742,12 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); + return false; + } + + public boolean visit(SQLSelectQueryBlock x) { + resolve(this, x); return false; } @@ -491,6 +756,18 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(PGFunctionTableSource x) { + for (SQLParameter parameter : x.getParameters()) { + SQLName name = parameter.getName(); + if (name instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identName = (SQLIdentifierExpr) name; + identName.setResolvedTableSource(x); + } + } + + return false; + } + public boolean visit(SQLSelectItem x) { SQLExpr expr = x.getExpr(); if (expr instanceof SQLIdentifierExpr) { @@ -507,6 +784,10 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLIdentifierExpr x) { + if (PGUtils.isPseudoColumn(x.name_hash_lower())) { + return false; + } + resolve(this, x); return true; } @@ -563,6 +844,46 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(PGInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -600,7 +921,12 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); + return false; + } + + public boolean visit(SQLSelectQueryBlock x) { + resolve(this, x); return false; } @@ -669,6 +995,46 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLServerInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -706,7 +1072,7 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLExprTableSource x) { - repository.resolve(this, x); + resolve(this, x); return false; } @@ -770,6 +1136,41 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLInsertStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLAlterTableStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLMergeStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLCreateProcedureStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLBlockStatement x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLParameter x) { + resolve(this, x); + return false; + } + + public boolean visit(SQLDeclareItem x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -839,6 +1240,11 @@ class SchemaResolveVisitorFactory { visitor.visit(select); } + SchemaRepository repository = visitor.getRepository(); + if (repository != null) { + repository.acceptCreateTable(x); + } + visitor.popContext(); } @@ -862,6 +1268,18 @@ class SchemaResolveVisitorFactory { if (column instanceof SQLIdentifierExpr) { SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) column; identifierExpr.setResolvedTableSource(table); + visitor.visit(identifierExpr); + } else if (column instanceof SQLListExpr) { + SQLListExpr columnGroup = (SQLListExpr) column; + for (SQLExpr columnGroupItem : columnGroup.getItems()) { + if (columnGroupItem instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) columnGroupItem; + identifierExpr.setResolvedTableSource(table); + visitor.visit(identifierExpr); + } else { + columnGroupItem.accept(visitor); + } + } } else { column.accept(visitor); } @@ -876,29 +1294,46 @@ class SchemaResolveVisitorFactory { where.accept(visitor); } + SQLOrderBy orderBy = x.getOrderBy(); + if (orderBy != null) { + orderBy.accept(visitor); + } + + for (SQLExpr sqlExpr : x.getReturning()) { + sqlExpr.accept(visitor); + } + visitor.popContext(); } static void resolve(SchemaResolveVisitor visitor, SQLDeleteStatement x) { SchemaResolveVisitor.Context ctx = visitor.createContext(x); + SQLWithSubqueryClause with = x.getWith(); + if (with != null) { + visitor.visit(with); + } + SQLTableSource table = x.getTableSource(); SQLTableSource from = x.getFrom(); + if (from == null) { + from = x.getUsing(); + } + if (table == null && from != null) { table = from; from = null; } - ctx.setTableSource(table); - ctx.setFrom(from); + if (from != null) { + ctx.setFrom(from); + from.accept(visitor); + } if (table != null) { table.accept(visitor); - } - - if (from != null) { - from.accept(visitor); + ctx.setTableSource(table); } SQLExpr where = x.getWhere(); @@ -909,6 +1344,38 @@ class SchemaResolveVisitorFactory { visitor.popContext(); } + static void resolve(SchemaResolveVisitor visitor, SQLInsertStatement x) { + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + + SQLWithSubqueryClause with = x.getWith(); + if (with != null) { + visitor.visit(with); + } + + SQLTableSource table = x.getTableSource(); + + ctx.setTableSource(table); + + if (table != null) { + table.accept(visitor); + } + + for (SQLExpr column : x.getColumns()) { + column.accept(visitor); + } + + for (SQLInsertStatement.ValuesClause valuesClause : x.getValuesList()) { + valuesClause.accept(visitor); + } + + SQLSelect query = x.getQuery(); + if (query != null) { + visitor.visit(query); + } + + visitor.popContext(); + } + static void resolve(SchemaResolveVisitor visitor, SQLIdentifierExpr x) { SchemaResolveVisitor.Context ctx = visitor.getContext(); if (ctx == null) { @@ -919,47 +1386,125 @@ class SchemaResolveVisitorFactory { long hash = x.name_hash_lower(); SQLTableSource tableSource = null; + if ((hash == FNVUtils.LEVEL || hash == FNVUtils.CONNECT_BY_ISCYCLE) + && ctx.object instanceof SQLSelectQueryBlock) { + SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) ctx.object; + if (queryBlock.getStartWith() != null + || queryBlock.getConnectBy() != null) { + return; + } + } + SQLTableSource ctxTable = ctx.getTableSource(); - if (ctxTable instanceof SQLJoinTableSource - || ctxTable instanceof SQLSubqueryTableSource) { + if (ctxTable instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) ctxTable; + tableSource = join.findTableSourceWithColumn(hash); + if (tableSource == null) { + final SQLTableSource left = join.getLeft(), right = join.getRight(); + + if (left instanceof SQLSubqueryTableSource + && right instanceof SQLExprTableSource) { + SQLSelect leftSelect = ((SQLSubqueryTableSource) left).getSelect(); + if (leftSelect.getQuery() instanceof SQLSelectQueryBlock) { + boolean hasAllColumn = ((SQLSelectQueryBlock) leftSelect.getQuery()).selectItemHashAllColumn(); + if (!hasAllColumn) { + tableSource = right; + } + } + } else if (right instanceof SQLSubqueryTableSource + && left instanceof SQLExprTableSource) { + SQLSelect rightSelect = ((SQLSubqueryTableSource) right).getSelect(); + if (rightSelect.getQuery() instanceof SQLSelectQueryBlock) { + boolean hasAllColumn = ((SQLSelectQueryBlock) rightSelect.getQuery()).selectItemHashAllColumn(); + if (!hasAllColumn) { + tableSource = left; + } + } + } else if (left instanceof SQLExprTableSource && right instanceof SQLExprTableSource) { + SQLExprTableSource leftExprTableSource = (SQLExprTableSource) left; + SQLExprTableSource rightExprTableSource = (SQLExprTableSource) right; + + if (leftExprTableSource.getSchemaObject() != null + && rightExprTableSource.getSchemaObject() == null) { + tableSource = rightExprTableSource; + + } else if (rightExprTableSource.getSchemaObject() != null + && leftExprTableSource.getSchemaObject() == null) { + tableSource = leftExprTableSource; + } + } + } + } else if (ctxTable instanceof SQLSubqueryTableSource) { tableSource = ctxTable.findTableSourceWithColumn(hash); + } else if (ctxTable instanceof OdpsLateralViewTableSource) { + tableSource = ctxTable.findTableSourceWithColumn(hash); + + if (tableSource == null) { + tableSource = ((OdpsLateralViewTableSource) ctxTable).getTableSource(); + } } else { + SQLDeclareItem declareItem = ctx.findDeclare(hash); + if (declareItem != null) { + x.setResolvedDeclareItem(declareItem); + return; + } + + for (SchemaResolveVisitor.Context parentCtx = ctx.parent; + parentCtx != null; + parentCtx = parentCtx.parent) + { + declareItem = parentCtx.findDeclare(hash); + if (declareItem != null) { + x.setResolvedDeclareItem(declareItem); + return; + } + + if (parentCtx.object instanceof SQLBlockStatement) { + SQLBlockStatement block = (SQLBlockStatement) parentCtx.object; + SQLParameter parameter = block.findParameter(hash); + if (parameter != null) { + x.setResolvedParameter(parameter); + return; + } + } else if (parentCtx.object instanceof SQLCreateProcedureStatement) { + SQLCreateProcedureStatement createProc = (SQLCreateProcedureStatement) parentCtx.object; + SQLParameter parameter = createProc.findParameter(hash); + if (parameter != null) { + x.setResolvedParameter(parameter); + return; + } + } + } + tableSource = ctxTable; if (tableSource instanceof SQLExprTableSource) { SchemaObject table = ((SQLExprTableSource) tableSource).getSchemaObject(); if (table != null) { if (table.findColumn(hash) == null) { - tableSource = null; // maybe parent + SQLCreateTableStatement createStmt = null; + { + SQLStatement smt = table.getStatement(); + if (smt instanceof SQLCreateTableStatement) { + createStmt = (SQLCreateTableStatement) smt; + } + } + + if (createStmt != null && createStmt.getTableElementList().size() > 0) { + tableSource = null; // maybe parent + } } } } } if (tableSource instanceof SQLExprTableSource) { - SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); + SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; long identHash = identExpr.name_hash_lower(); - for (SchemaResolveVisitor.Context parentCtx = ctx.parent; - parentCtx != null; - parentCtx = parentCtx.parent) { - - if (parentCtx.object instanceof SQLSelect) { - SQLSelect select = (SQLSelect) parentCtx.object; - SQLWithSubqueryClause with = select.getWithSubQuery(); - if (with != null) { - SQLWithSubqueryClause.Entry entry = with.findEntry(identHash); - if (entry != null) { - tableSource = entry; - break; - } - } - } else if (parentCtx.object instanceof PGSelectStatement) { - - } - } + tableSource = unwrapAlias(ctx, tableSource, identHash); } } @@ -974,11 +1519,134 @@ class SchemaResolveVisitorFactory { if (ctxTable instanceof SQLJoinTableSource) { String alias = tableSource.computeAlias(); SQLPropertyExpr propertyExpr = new SQLPropertyExpr(new SQLIdentifierExpr(alias), ident, hash); + propertyExpr.setResolvedColumn(x.getResolvedColumn()); + propertyExpr.setResolvedTableSource(x.getResolvedTableSource()); SQLUtils.replaceInParent(x, propertyExpr); } } } + static void resolve(SchemaResolveVisitor visitor, SQLPropertyExpr x) { + SchemaResolveVisitor.Context ctx = visitor.getContext(); + if (ctx == null) { + return; + } + + long owner_hash = 0; + { + SQLExpr ownerObj = x.getOwner(); + if (ownerObj instanceof SQLIdentifierExpr) { + SQLIdentifierExpr owner = (SQLIdentifierExpr) ownerObj; + owner_hash = owner.name_hash_lower(); + } else if (ownerObj instanceof SQLPropertyExpr) { + owner_hash = ((SQLPropertyExpr) ownerObj).hashCode64(); + } + } + + SQLTableSource tableSource = null; + SQLTableSource ctxTable = ctx.getTableSource(); + + if (ctxTable != null) { + tableSource = ctxTable.findTableSource(owner_hash); + } + + if (tableSource == null) { + SQLTableSource ctxFrom = ctx.getFrom(); + if (ctxFrom != null) { + tableSource = ctxFrom.findTableSource(owner_hash); + } + } + + if (tableSource == null) { + for (SchemaResolveVisitor.Context parentCtx = ctx; + parentCtx != null; + parentCtx = parentCtx.parent) { + + SQLTableSource parentCtxTable = parentCtx.getTableSource(); + + if (parentCtxTable != null) { + tableSource = parentCtxTable.findTableSource(owner_hash); + if (tableSource == null) { + SQLTableSource ctxFrom = parentCtx.getFrom(); + if (ctxFrom != null) { + tableSource = ctxFrom.findTableSource(owner_hash); + } + } + + if (tableSource != null) { + break; + } + } else { + if (parentCtx.object instanceof SQLBlockStatement) { + SQLBlockStatement block = (SQLBlockStatement) parentCtx.object; + SQLParameter parameter = block.findParameter(owner_hash); + if (parameter != null) { + x.setResolvedOwnerObject(parameter); + return; + } + } + + SQLDeclareItem declareItem = parentCtx.findDeclare(owner_hash); + if (declareItem != null) { + SQLObject resolvedObject = declareItem.getResolvedObject(); + if (resolvedObject instanceof SQLCreateProcedureStatement) { + x.setResolvedProcedure((SQLCreateProcedureStatement) resolvedObject); + } + break; + } + } + } + } + + if (tableSource != null) { + x.setResolvedTableSource(tableSource); + SQLColumnDefinition column = tableSource.findColumn(x.name_hash_lower()); + if (column != null) { + x.setResolvedColumn(column); + } + } + } + + private static SQLTableSource unwrapAlias(SchemaResolveVisitor.Context ctx, SQLTableSource tableSource, long identHash) { + if (ctx == null) { + return tableSource; + } + + if (ctx.object instanceof SQLDeleteStatement + && (ctx.getTableSource() == null || tableSource == ctx.getTableSource()) + && ctx.getFrom() != null) { + SQLTableSource found = ctx.getFrom().findTableSource(identHash); + if (found != null) { + return found; + } + } + + for (SchemaResolveVisitor.Context parentCtx = ctx.parent; + parentCtx != null; + parentCtx = parentCtx.parent) { + + SQLWithSubqueryClause with = null; + if (parentCtx.object instanceof SQLSelect) { + SQLSelect select = (SQLSelect) parentCtx.object; + with = select.getWithSubQuery(); + } else if (parentCtx.object instanceof SQLDeleteStatement) { + SQLDeleteStatement delete = (SQLDeleteStatement) parentCtx.object; + with = delete.getWith(); + } else if (parentCtx.object instanceof SQLInsertStatement) { + SQLInsertStatement insertStmt = (SQLInsertStatement) parentCtx.object; + with = insertStmt.getWith(); + } + + if (with != null) { + SQLWithSubqueryClause.Entry entry = with.findEntry(identHash); + if (entry != null) { + return entry; + } + } + } + return tableSource; + } + static void resolve(SchemaResolveVisitor visitor, SQLSelectQueryBlock x) { SchemaResolveVisitor.Context ctx = visitor.createContext(x); @@ -996,6 +1664,13 @@ class SchemaResolveVisitorFactory { SQLSelectItem selectItem = selectList.get(i); SQLExpr expr = selectItem.getExpr(); if (expr instanceof SQLAllColumnExpr) { + SQLAllColumnExpr allColumnExpr = (SQLAllColumnExpr) expr; + if (from instanceof SQLExprTableSource) { + allColumnExpr.setResolvedTableSource(from); + } + + visitor.visit(allColumnExpr); + if (visitor.isEnabled(SchemaResolveVisitor.Option.ResolveAllColumn)) { extractColumns(visitor, from, columns); } @@ -1054,6 +1729,11 @@ class SchemaResolveVisitorFactory { } } + SQLExprTableSource into = x.getInto(); + if (into != null) { + into.accept(visitor); + } + SQLExpr where = x.getWhere(); if (where != null) { where.accept(visitor); @@ -1076,7 +1756,38 @@ class SchemaResolveVisitorFactory { SQLOrderBy orderBy = x.getOrderBy(); if (orderBy != null) { - orderBy.accept(visitor); + for (SQLSelectOrderByItem orderByItem : orderBy.getItems()) { + SQLExpr orderByItemExpr = orderByItem.getExpr(); + + if (orderByItemExpr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr orderByItemIdentExpr = (SQLIdentifierExpr) orderByItemExpr; + long hash = orderByItemIdentExpr.name_hash_lower(); + SQLSelectItem selectItem = x.findSelectItem(hash); + + if (selectItem != null) { + orderByItem.setResolvedSelectItem(selectItem); + + SQLExpr selectItemExpr = selectItem.getExpr(); + if (selectItemExpr instanceof SQLIdentifierExpr) { + orderByItemIdentExpr.setResolvedTableSource(((SQLIdentifierExpr) selectItemExpr).getResolvedTableSource()); + orderByItemIdentExpr.setResolvedColumn(((SQLIdentifierExpr) selectItemExpr).getResolvedColumn()); + } else if (selectItemExpr instanceof SQLPropertyExpr) { + orderByItemIdentExpr.setResolvedTableSource(((SQLPropertyExpr) selectItemExpr).getResolvedTableSource()); + orderByItemIdentExpr.setResolvedColumn(((SQLPropertyExpr) selectItemExpr).getResolvedColumn()); + } + continue; + } + } + + orderByItemExpr.accept(visitor); + } + } + + int forUpdateOfSize = x.getForUpdateOfSize(); + if (forUpdateOfSize > 0) { + for (SQLExpr sqlExpr : x.getForUpdateOf()) { + sqlExpr.accept(visitor); + } } visitor.popContext(); @@ -1104,64 +1815,43 @@ class SchemaResolveVisitorFactory { } } - static void resolve(SchemaResolveVisitor visitor, SQLPropertyExpr x) { - SchemaResolveVisitor.Context ctx = visitor.getContext(); - if (ctx == null) { - return; - } - - SQLIdentifierExpr owner; - { - SQLExpr ownerObj = x.getOwner(); - if (ownerObj instanceof SQLIdentifierExpr) { - owner = (SQLIdentifierExpr) ownerObj; - } else { - return; - } - } - long owner_hash = owner.name_hash_lower(); - - SQLTableSource ctxTable = ctx.getTableSource(); - - SQLTableSource tableSource = ctxTable.findTableSource(owner_hash); - if (tableSource == null) { - SQLTableSource ctxFrom = ctx.getFrom(); - if (ctxFrom != null) { - tableSource = ctxFrom.findTableSource(owner_hash); - } - } - - if (tableSource != null) { - x.setResolvedTableSource(tableSource); - SQLColumnDefinition column = tableSource.findColumn(x.name_hash_lower()); - if (column != null) { - x.setResolvedColumn(column); - } - } - } - static void resolve(SchemaResolveVisitor visitor, SQLAllColumnExpr x) { - SQLSelectQueryBlock queryBlock = null; - for (SQLObject parent = x.getParent(); parent != null; parent = parent.getParent()) { - if (parent instanceof SQLTableSource) { + SQLTableSource tableSource = x.getResolvedTableSource(); + + if (tableSource == null) { + SQLSelectQueryBlock queryBlock = null; + for (SQLObject parent = x.getParent(); parent != null; parent = parent.getParent()) { + if (parent instanceof SQLTableSource) { + return; + } + if (parent instanceof SQLSelectQueryBlock) { + queryBlock = (SQLSelectQueryBlock) parent; + break; + } + } + + if (queryBlock == null) { return; } - if (parent instanceof SQLSelectQueryBlock) { - queryBlock = (SQLSelectQueryBlock) parent; - break; + + SQLTableSource from = queryBlock.getFrom(); + if (from == null || from instanceof SQLJoinTableSource) { + return; + } + + x.setResolvedTableSource(from); + tableSource = from; + } + + if (tableSource instanceof SQLExprTableSource) { + SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); + if (expr instanceof SQLIdentifierExpr) { + SQLTableSource resolvedTableSource = ((SQLIdentifierExpr) expr).getResolvedTableSource(); + if (resolvedTableSource != null) { + x.setResolvedTableSource(resolvedTableSource); + } } } - - if (queryBlock == null) { - return; - } - - SQLTableSource from = queryBlock.getFrom(); - if (from == null || from instanceof SQLJoinTableSource) { - return; - } - - x.setResolvedTableSource(from); } static void resolve(SchemaResolveVisitor visitor, SQLSelect x) { @@ -1177,9 +1867,39 @@ class SchemaResolveVisitorFactory { query.accept(visitor); } + SQLSelectQueryBlock queryBlock = x.getFirstQueryBlock(); + SQLOrderBy orderBy = x.getOrderBy(); if (orderBy != null) { - visitor.visit(orderBy); + for (SQLSelectOrderByItem orderByItem : orderBy.getItems()) { + SQLExpr orderByItemExpr = orderByItem.getExpr(); + + if (orderByItemExpr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr orderByItemIdentExpr = (SQLIdentifierExpr) orderByItemExpr; + long hash = orderByItemIdentExpr.name_hash_lower(); + + SQLSelectItem selectItem = null; + if (queryBlock != null) { + selectItem = queryBlock.findSelectItem(hash); + } + + if (selectItem != null) { + orderByItem.setResolvedSelectItem(selectItem); + + SQLExpr selectItemExpr = selectItem.getExpr(); + if (selectItemExpr instanceof SQLIdentifierExpr) { + orderByItemIdentExpr.setResolvedTableSource(((SQLIdentifierExpr) selectItemExpr).getResolvedTableSource()); + orderByItemIdentExpr.setResolvedColumn(((SQLIdentifierExpr) selectItemExpr).getResolvedColumn()); + } else if (selectItemExpr instanceof SQLPropertyExpr) { + orderByItemIdentExpr.setResolvedTableSource(((SQLPropertyExpr) selectItemExpr).getResolvedTableSource()); + orderByItemIdentExpr.setResolvedColumn(((SQLPropertyExpr) selectItemExpr).getResolvedColumn()); + } + continue; + } + } + + orderByItemExpr.accept(visitor); + } } visitor.popContext(); @@ -1197,4 +1917,203 @@ class SchemaResolveVisitorFactory { } } + static void resolve(SchemaResolveVisitor visitor, SQLExprTableSource x) { + SQLExpr expr = x.getExpr(); + if (expr instanceof SQLName) { + if (x.getSchemaObject() != null) { + return; + } + + SchemaRepository repository = visitor.getRepository(); + if (repository != null) { + SchemaObject table = repository.findTable((SQLName) expr); + if (table != null) { + x.setSchemaObject(table); + } + } + + SQLIdentifierExpr identifierExpr = null; + + if (expr instanceof SQLIdentifierExpr) { + identifierExpr = (SQLIdentifierExpr) expr; + } else if (expr instanceof SQLPropertyExpr) { + SQLExpr owner = ((SQLPropertyExpr) expr).getOwner(); + if (owner instanceof SQLIdentifierExpr) { + identifierExpr = (SQLIdentifierExpr) owner; + } + } + + if (identifierExpr != null) { + SQLTableSource tableSource = unwrapAlias(visitor.getContext(), null, identifierExpr.name_hash_lower()); + if (tableSource != null) { + identifierExpr.setResolvedTableSource(tableSource); + } + } + + } else if (expr instanceof SQLMethodInvokeExpr) { + expr.accept(visitor); + } else { + expr.accept(visitor); + } + } + + static void resolve(SchemaResolveVisitor visitor, SQLAlterTableStatement x) { + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + + SQLTableSource tableSource = x.getTableSource(); + ctx.setTableSource(tableSource); + + for (SQLAlterTableItem item : x.getItems()) { + item.accept(visitor); + } + + visitor.popContext(); + } + + static void resolve(SchemaResolveVisitor visitor, SQLMergeStatement x) { + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + + SQLTableSource into = x.getInto(); + ctx.setTableSource(into); + + SQLTableSource using = x.getUsing(); + if (using != null) { + using.accept(visitor); + ctx.setFrom(using); + } + + SQLExpr on = x.getOn(); + if (on != null) { + on.accept(visitor); + } + + SQLMergeStatement.MergeUpdateClause updateClause = x.getUpdateClause(); + if (updateClause != null) { + for (SQLUpdateSetItem item : updateClause.getItems()) { + SQLExpr column = item.getColumn(); + + if (column instanceof SQLIdentifierExpr) { + ((SQLIdentifierExpr) column).setResolvedTableSource(into); + } else if (column instanceof SQLPropertyExpr) { + ((SQLPropertyExpr) column).setResolvedTableSource(into); + } else { + column.accept(visitor); + } + + SQLExpr value = item.getValue(); + if (value != null) { + value.accept(visitor); + } + } + + SQLExpr where = updateClause.getWhere(); + if (where != null) { + where.accept(visitor); + } + + SQLExpr deleteWhere = updateClause.getDeleteWhere(); + if (deleteWhere != null) { + deleteWhere.accept(visitor); + } + } + + SQLMergeStatement.MergeInsertClause insertClause = x.getInsertClause(); + if (insertClause != null) { + for (SQLExpr column : insertClause.getColumns()) { + if (column instanceof SQLIdentifierExpr) { + ((SQLIdentifierExpr) column).setResolvedTableSource(into); + } else if (column instanceof SQLPropertyExpr) { + ((SQLPropertyExpr) column).setResolvedTableSource(into); + } + column.accept(visitor); + } + for (SQLExpr value : insertClause.getValues()) { + value.accept(visitor); + } + SQLExpr where = insertClause.getWhere(); + if (where != null) { + where.accept(visitor); + } + } + + visitor.popContext(); + } + + static void resolve(SchemaResolveVisitor visitor, SQLCreateProcedureStatement x) { + { + SchemaResolveVisitor.Context parentCtx = visitor.getContext(); + if (parentCtx != null) { + SQLDeclareItem declareItem = new SQLDeclareItem(x.getName().clone(), null); + declareItem.setResolvedObject(x); + parentCtx.declare(declareItem); + } + } + + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + + for (SQLParameter parameter : x.getParameters()) { + parameter.accept0(visitor); + } + + SQLStatement block = x.getBlock(); + if (block != null) { + block.accept(visitor); + } + + visitor.popContext(); + } + + static void resolve(SchemaResolveVisitor visitor, SQLBlockStatement x) { + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + + for (SQLParameter parameter : x.getParameters()) { + parameter.accept0(visitor); + } + + for (SQLStatement stmt : x.getStatementList()) { + stmt.accept(visitor); + } + + SQLStatement exception = x.getException(); + if (exception != null) { + exception.accept(visitor); + } + + visitor.popContext(); + } + + static void resolve(SchemaResolveVisitor visitor, SQLParameter x) { + SQLExpr expr = x.getDefaultValue(); + + SchemaResolveVisitor.Context ctx = null; + if (expr != null) { + if (expr instanceof SQLQueryExpr) { + ctx = visitor.createContext(x); + + SQLSubqueryTableSource tableSource = new SQLSubqueryTableSource(((SQLQueryExpr) expr).getSubQuery()); + tableSource.setParent(x); + tableSource.setAlias(x.getName().getSimpleName()); + + ctx.setTableSource(tableSource); + } + + expr.accept(visitor); + } + + if (ctx != null) { + visitor.popContext(); + } + } + + static void resolve(SchemaResolveVisitor visitor, SQLDeclareItem x) { + SchemaResolveVisitor.Context ctx = visitor.getContext(); + if (ctx != null) { + ctx.declare(x); + } + + SQLName name = x.getName(); + if (name instanceof SQLIdentifierExpr) { + ((SQLIdentifierExpr) name).setResolvedDeclareItem(x); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 8cd48ab91b..f2200ecbbe 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -4649,11 +4649,6 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print0(ucase ? "INTO " : "into "); x.getInto().accept(this); - if (x.getAlias() != null) { - print(' '); - print0(x.getAlias()); - } - println(); print0(ucase ? "USING " : "using "); x.getUsing().accept(this); @@ -4940,7 +4935,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLWhileStatement x) { - if (x.getLabelName() != null && !x.getLabelName().equals("")) { + String label = x.getLabelName(); + + if (label != null && label.length() != 0) { print0(x.getLabelName()); print0(": "); } @@ -4957,8 +4954,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } println(); print0(ucase ? "END WHILE" : "end while"); - if (x.getLabelName() != null && !x.getLabelName().equals("")) print(' '); - print0(x.getLabelName()); + if (label != null && label.length() != 0) { + print(' '); + print0(label); + } return false; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index cc43605afe..62f2446ae3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -24,21 +24,27 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsLateralViewTableSource; import com.alibaba.druid.sql.dialect.odps.ast.OdpsValuesTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExpr; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitorAdapter; import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.repository.SchemaObject; import com.alibaba.druid.sql.repository.SchemaRepository; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Condition; import com.alibaba.druid.stat.TableStat.Mode; import com.alibaba.druid.stat.TableStat.Relationship; +import com.alibaba.druid.util.FNVUtils; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.StringUtils; @@ -47,7 +53,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { protected SchemaRepository repository; protected final HashMap tableStats = new LinkedHashMap(); - protected final Map columns = new LinkedHashMap(); + protected final Map columns = new LinkedHashMap(); protected final List conditions = new ArrayList(); protected final Set relationships = new LinkedHashSet(); protected final List orderByColumns = new ArrayList(); @@ -82,6 +88,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public SchemaStatVisitor(List parameters){ + this((String) null, parameters); + } + + public SchemaStatVisitor(String dbType, List parameters){ + this(new SchemaRepository(dbType), parameters); this.parameters = parameters; } @@ -113,13 +124,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } protected Column addColumn(String tableName, String columnName, long table_hash, long name_hash) { - tableName = handleName(tableName); - columnName = handleName(columnName); +// tableName = handleName(tableName); +// columnName = handleName(columnName); Column column = this.getColumn(tableName, columnName); if (column == null && columnName != null) { column = new Column(tableName, columnName); - columns.put(column, column); + columns.put(column.hashCode64(), column); } return column; } @@ -242,6 +253,74 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } private boolean visitOrderBy(SQLIdentifierExpr x) { + SQLTableSource tableSource = x.getResolvedTableSource(); + + String tableName = null; + if (tableSource instanceof SQLExprTableSource) { + SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr table = (SQLIdentifierExpr) expr; + tableName = table.getName(); + } else if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr table = (SQLPropertyExpr) expr; + tableName = table.toString(); + } else if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) expr; + if ("table".equalsIgnoreCase(methodInvokeExpr.getMethodName()) + && methodInvokeExpr.getParameters().size() == 1 + && methodInvokeExpr.getParameters().get(0) instanceof SQLName) { + SQLName table = (SQLName) methodInvokeExpr.getParameters().get(0); + + if (table instanceof SQLPropertyExpr) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) table; + SQLIdentifierExpr owner = (SQLIdentifierExpr) propertyExpr.getOwner(); + if (propertyExpr.getResolvedTableSource() != null + && propertyExpr.getResolvedTableSource() instanceof SQLExprTableSource) { + SQLExpr resolveExpr = ((SQLExprTableSource) propertyExpr.getResolvedTableSource()).getExpr(); + if (resolveExpr instanceof SQLName) { + tableName = resolveExpr.toString() + "." + propertyExpr.getName(); + } + } + } + + if (tableName == null) { + tableName = table.toString(); + } + } + } + } else if (tableSource instanceof SQLWithSubqueryClause.Entry + || tableSource instanceof SQLSubqueryTableSource) { + SQLTableSource xx = tableSource.findTableSourceWithColumn(x.name_hash_lower()); + if (xx != null) { + + } + // skip + } else { + boolean skip = false; + for (SQLObject parent = x.getParent();parent != null;parent = parent.getParent()) { + if (parent instanceof SQLSelectQueryBlock) { + SQLTableSource from = ((SQLSelectQueryBlock) parent).getFrom(); + + if (from instanceof OdpsValuesTableSource) { + skip = true; + break; + } + } else if (parent instanceof SQLSelectQuery) { + break; + } + } + } + + String identName = x.getName(); + if (tableName != null) { + orderByAddColumn(tableName, identName, x); + } else { + orderByAddColumn("UNKOWN", identName, x); + } + return false; + } + + private boolean visitOrderBy1(SQLIdentifierExpr x) { if (containsSubQuery(currentTable)) { return false; } @@ -580,8 +659,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } if (expr instanceof SQLPropertyExpr) { - SQLExpr owner = ((SQLPropertyExpr) expr).getOwner(); - String column = ((SQLPropertyExpr) expr).getName(); + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; + SQLExpr owner = propertyExpr.getOwner(); + String column = propertyExpr.getName(); if (owner instanceof SQLIdentifierExpr) { String tableName = ((SQLIdentifierExpr) owner).getName(); @@ -591,6 +671,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (aliasMap.containsKey(tableNameLower)) { table = aliasMap.get(tableNameLower); } + + if (propertyExpr.getResolvedTableSource() instanceof SQLSubqueryTableSource) { + table = null; + } if (containsSubQuery(tableNameLower)) { table = null; @@ -615,6 +699,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (isParam(identifierExpr)) { return null; } + + if (identifierExpr.getResolvedTableSource() instanceof SQLSubqueryTableSource) { + return null; + } + Column attrColumn = (Column) expr.getAttribute(ATTR_COLUMN); if (attrColumn != null) { return attrColumn; @@ -700,7 +789,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLInsertStatement x) { - if (repository != null) { + if (repository != null + && x.getParent() == null) { repository.resolve(x); } @@ -861,30 +951,129 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLPropertyExpr x) { - if (x.getOwner() instanceof SQLIdentifierExpr) { - SQLIdentifierExpr ownerExpr = (SQLIdentifierExpr) x.getOwner(); - String owner = ownerExpr.getName(); + return visit1(x); +// return visit2(x); + } - if (containsSubQuery(owner)) { + public boolean visit1(SQLPropertyExpr x) { + Column column = null; + String ident = x.getName(); + + SQLTableSource tableSource = x.getResolvedTableSource(); + if (tableSource instanceof SQLExprTableSource) { + SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); + + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr table = (SQLIdentifierExpr) expr; + SQLTableSource resolvedTableSource = table.getResolvedTableSource(); + if (resolvedTableSource instanceof SQLExprTableSource) { + expr = ((SQLExprTableSource) resolvedTableSource).getExpr(); + } + } else if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr table = (SQLPropertyExpr) expr; + SQLTableSource resolvedTableSource = table.getResolvedTableSource(); + if (resolvedTableSource instanceof SQLExprTableSource) { + expr = ((SQLExprTableSource) resolvedTableSource).getExpr(); + } + } + + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr table = (SQLIdentifierExpr) expr; + + SQLTableSource resolvedTableSource = table.getResolvedTableSource(); + if (resolvedTableSource instanceof SQLWithSubqueryClause.Entry) { + return false; + } + + column = addColumn(table.getName(), ident, table.name_hash_lower(), x.name_hash_lower()); + + if (column != null && isParentGroupBy(x)) { + this.groupByColumns.add(column); + } + x.putAttribute(ATTR_COLUMN, column); + } else if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr table = (SQLPropertyExpr) expr; + String tableName = table.toString(); + column = addColumn(tableName, ident, 0, x.name_hash_lower()); + + if (column != null && isParentGroupBy(x)) { + this.groupByColumns.add(column); + } + x.putAttribute(ATTR_COLUMN, column); + } else if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) expr; + if ("table".equalsIgnoreCase(methodInvokeExpr.getMethodName()) + && methodInvokeExpr.getParameters().size() == 1 + && methodInvokeExpr.getParameters().get(0) instanceof SQLName) { + SQLName table = (SQLName) methodInvokeExpr.getParameters().get(0); + + String tableName = null; + if (table instanceof SQLPropertyExpr) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) table; + SQLIdentifierExpr owner = (SQLIdentifierExpr) propertyExpr.getOwner(); + if (propertyExpr.getResolvedTableSource() != null + && propertyExpr.getResolvedTableSource() instanceof SQLExprTableSource) { + SQLExpr resolveExpr = ((SQLExprTableSource) propertyExpr.getResolvedTableSource()).getExpr(); + if (resolveExpr instanceof SQLName) { + tableName = resolveExpr.toString() + "." + propertyExpr.getName(); + } + } + } + + if (tableName == null) { + tableName = table.toString(); + } + + column = addColumn(tableName, ident, 0, x.name_hash_lower()); + } + } + } else if (tableSource instanceof SQLWithSubqueryClause.Entry + || tableSource instanceof SQLSubqueryTableSource) { + return false; + } else if (tableSource instanceof SQLUnionQueryTableSource) { + return false; + } else if (tableSource instanceof OdpsLateralViewTableSource) { + return false; + } else { + if (x.getResolvedProcudure() != null) { return false; } - owner = aliasWrap(owner); + boolean skip = false; + for (SQLObject parent = x.getParent();parent != null;parent = parent.getParent()) { + if (parent instanceof SQLSelectQueryBlock) { + SQLTableSource from = ((SQLSelectQueryBlock) parent).getFrom(); - if (owner != null) { - Column column = addColumn(owner, x.getName(), ownerExpr.name_hash_lower(), x.name_hash_lower()); - x.putAttribute(ATTR_COLUMN, column); - if (column != null) { - if (isParentGroupBy(x)) { - this.groupByColumns.add(column); - } - - if (column != null) { - setColumn(x, column); + if (from instanceof OdpsValuesTableSource) { + skip = true; + break; } + } else if (parent instanceof SQLSelectQuery) { + break; } } + if (!skip) { + column = handleUnkownColumn(ident); + } + if (column != null) { + x.putAttribute(ATTR_COLUMN, column); + } } + + if (column != null) { + SQLObject parent = x.getParent(); + if (parent instanceof SQLSelectOrderByItem) { + parent = parent.getParent(); + } + if (parent instanceof SQLPrimaryKey) { + column.setPrimaryKey(true); + } else if (parent instanceof SQLUnique) { + column.setUnique(true); + } + + setColumn(x, column); + } + return false; } @@ -1026,35 +1215,97 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return null; } - public boolean visit2(SQLIdentifierExpr x) { + public boolean visit(SQLIdentifierExpr x) { + return visit1(x); + } + + public boolean isPseudoColumn(long hash) { + return false; + } + + public boolean visit1(SQLIdentifierExpr x) { if (isParam(x)) { return false; } + SQLTableSource tableSource = x.getResolvedTableSource(); + if (x.getParent() instanceof SQLSelectOrderByItem) { + SQLSelectOrderByItem selectOrderByItem = (SQLSelectOrderByItem) x.getParent(); + if (selectOrderByItem.getResolvedSelectItem() != null) { + return false; + } + } + + if (tableSource == null + && (x.getResolvedParameter() != null + || x.getResolvedDeclareItem() != null)) + { + return false; + } + + long hash = x.name_hash_lower(); + if (isPseudoColumn(hash)) { + return false; + } + + if ((hash == FNVUtils.LEVEL || hash == FNVUtils.CONNECT_BY_ISCYCLE) + && x.getResolvedColumn() == null + && tableSource == null) { + return false; + } + Column column = null; String ident = x.getName(); - SQLTableSource tableSource = x.getResolvedTableSource(); if (tableSource instanceof SQLExprTableSource) { SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr table = (SQLIdentifierExpr) expr; - column = addColumn(table.getName(), ident, table.name_hash_lower(), x.name_hash_lower()); + column = addColumn(table.getName(), ident, table.name_hash_lower(), hash); if (column != null && isParentGroupBy(x)) { this.groupByColumns.add(column); } x.putAttribute(ATTR_COLUMN, column); - } else if (expr instanceof SQLPropertyExpr) { - SQLPropertyExpr table = (SQLPropertyExpr) expr; - String tableName = table.toString(); - column = addColumn(tableName, ident, 0, x.name_hash_lower()); + } else if (expr instanceof SQLPropertyExpr || expr instanceof OracleDbLinkExpr) { + String tableName = expr.toString(); + column = addColumn(tableName, ident, 0, hash); if (column != null && isParentGroupBy(x)) { this.groupByColumns.add(column); } x.putAttribute(ATTR_COLUMN, column); + } else if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) expr; + if ("table".equalsIgnoreCase(methodInvokeExpr.getMethodName()) + && methodInvokeExpr.getParameters().size() == 1 + && methodInvokeExpr.getParameters().get(0) instanceof SQLName) { + SQLName table = (SQLName) methodInvokeExpr.getParameters().get(0); + + String tableName = null; + if (table instanceof SQLPropertyExpr) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) table; + SQLIdentifierExpr owner = (SQLIdentifierExpr) propertyExpr.getOwner(); + if (propertyExpr.getResolvedTableSource() != null + && propertyExpr.getResolvedTableSource() instanceof SQLExprTableSource) { + SQLExpr resolveExpr = ((SQLExprTableSource) propertyExpr.getResolvedTableSource()).getExpr(); + if (resolveExpr instanceof SQLName) { + tableName = resolveExpr.toString() + "." + propertyExpr.getName(); + } + } + } + + if (tableName == null) { + tableName = table.toString(); + } + + column = addColumn(tableName, ident, 0, x.name_hash_lower()); + } } + } else if (tableSource instanceof SQLWithSubqueryClause.Entry + || tableSource instanceof SQLSubqueryTableSource + || tableSource instanceof OdpsLateralViewTableSource) { + return false; } else { boolean skip = false; for (SQLObject parent = x.getParent();parent != null;parent = parent.getParent()) { @@ -1094,80 +1345,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - public boolean visit(SQLIdentifierExpr x) { - if (isParam(x)) { - return false; - } - - String currentTable = getCurrentTable(); - - if (containsSubQuery(currentTable)) { - return false; - } - - String ident = x.toString(); - - if (variants.containsKey(ident)) { - return false; - } - - if ("LEVEL".equalsIgnoreCase(ident) || "CONNECT_BY_ISCYCLE".equalsIgnoreCase(ident)) { - for (SQLObject parent = x.getParent(); parent != null; parent = parent.getParent()) { - if (parent instanceof SQLSelectQueryBlock) { - SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) parent; - if (queryBlock.getStartWith() != null || queryBlock.getConnectBy() != null) { - return false; - } - break; - } - } - } - - Column column = null; - if (currentTable != null) { - column = addColumn(currentTable, ident, 0, x.name_hash_lower()); - - if (column != null && isParentGroupBy(x)) { - this.groupByColumns.add(column); - } - x.putAttribute(ATTR_COLUMN, column); - } else { - boolean skip = false; - for (SQLObject parent = x.getParent();parent != null;parent = parent.getParent()) { - if (parent instanceof SQLSelectQueryBlock) { - SQLTableSource from = ((SQLSelectQueryBlock) parent).getFrom(); - - if (from instanceof OdpsValuesTableSource) { - skip = true; - break; - } - } else if (parent instanceof SQLSelectQuery) { - break; - } - } - if (!skip) { - column = handleUnkownColumn(ident); - } - if (column != null) { - x.putAttribute(ATTR_COLUMN, column); - } - } - if (column != null) { - SQLObject parent = x.getParent(); - if (parent instanceof SQLSelectOrderByItem) { - parent = parent.getParent(); - } - if (parent instanceof SQLPrimaryKey) { - column.setPrimaryKey(true); - } else if (parent instanceof SQLUnique) { - column.setUnique(true); - } - - setColumn(x, column); - } - return false; - } - private boolean isParentSelectItem(SQLObject parent) { if (parent == null) { return false; @@ -1245,25 +1422,43 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLAllColumnExpr x) { - String currentTable = getCurrentTable(); + SQLTableSource tableSource = x.getResolvedTableSource(); - if (containsSubQuery(currentTable)) { - return false; - } - - if (x.getParent() instanceof SQLAggregateExpr) { - SQLAggregateExpr aggregateExpr = (SQLAggregateExpr) x.getParent(); - if ("count".equalsIgnoreCase(aggregateExpr.getMethodName())) { - return false; + if (tableSource instanceof SQLExprTableSource) { + SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; + SQLName expr = exprTableSource.getName(); + + SQLCreateTableStatement createStmt = null; + + SchemaObject tableObject = exprTableSource.getSchemaObject(); + if (tableObject != null) { + SQLStatement stmt = tableObject.getStatement(); + if (stmt instanceof SQLCreateTableStatement) { + createStmt = (SQLCreateTableStatement) stmt; + } + } + + if (createStmt != null + && createStmt.getTableElementList().size() > 0) { + SQLName tableName = createStmt.getName(); + for (SQLTableElement e : createStmt.getTableElementList()) { + if (e instanceof SQLColumnDefinition) { + SQLColumnDefinition columnDefinition = (SQLColumnDefinition) e; + SQLName columnName = columnDefinition.getName(); + Column column = addColumn(tableName.toString(), columnName.toString(), tableName.hashCode64(), columnName.hashCode64()); + if (isParentSelectItem(x.getParent())) { + column.setSelec(true); + } + } + } + } else if (expr != null) { + Column column = addColumn(expr.toString(), "*"); + if (isParentSelectItem(x.getParent())) { + column.setSelec(true); + } } } - if (currentTable != null) { - Column column = addColumn(currentTable, "*"); - if (isParentSelectItem(x.getParent())) { - column.setSelec(true); - } - } return false; } @@ -1276,7 +1471,16 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean containsColumn(String tableName, String columnName) { - return columns.containsKey(new Column(tableName, columnName)); + long hashCode; + + int p = tableName.indexOf('.'); + if (p != -1) { + SQLExpr owner = SQLUtils.toSQLExpr(tableName, dbType); + hashCode = FNVUtils.fnv_64_lower(new SQLPropertyExpr(owner, columnName)); + } else { + hashCode = FNVUtils.fnv_64_lower(tableName, columnName); + } + return columns.containsKey(hashCode); } public Collection getColumns() { @@ -1290,11 +1494,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { Column column = new Column(tableName, columnName); - return this.columns.get(column); + return this.columns.get(column.hashCode64()); } public boolean visit(SQLSelectStatement x) { - if (repository != null) { + if (repository != null + && x.getParent() == null) { repository.resolve(x); } @@ -1503,7 +1708,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLUpdateStatement x) { - if (repository != null) { + if (repository != null + && x.getParent() == null) { repository.resolve(x); } setAliasMap(); @@ -1534,7 +1740,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLDeleteStatement x) { - if (repository != null) { + if (repository != null + && x.getParent() == null) { repository.resolve(x); } @@ -1593,6 +1800,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLCreateTableStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + for (SQLTableElement e : x.getTableElementList()) { e.setParent(x); } @@ -1690,6 +1902,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLCreateViewStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + x.getSubQuery().accept(this); return false; } @@ -1716,6 +1933,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLAlterTableStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + String tableName = x.getName().toString(); TableStat stat = getTableStat(tableName); stat.incrementAlterCount(); @@ -1906,6 +2128,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLCreateProcedureStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + String name = x.getName().toString(); this.variants.put(name, x); accept(x.getBlock()); @@ -1914,6 +2141,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLCreateFunctionStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + String name = x.getName().toString(); this.variants.put(name, x); accept(x.getBlock()); @@ -1922,6 +2154,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLBlockStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + for (SQLParameter param : x.getParameters()) { param.setParent(x); @@ -2059,6 +2296,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLMergeStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + setAliasMap(); String originalTable = getCurrentTable(); @@ -2168,6 +2410,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLExplainStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + if (x.getStatement() != null) { accept(x.getStatement()); } @@ -2185,4 +2432,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } return true; } + + public boolean visit(SQLCreateMaterializedViewStatement x) { + if (repository != null + && x.getParent() == null) { + repository.resolve(x); + } + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index 80fdc07b1e..1f6c01ee4d 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -15,6 +15,11 @@ */ package com.alibaba.druid.stat; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.StringUtils; import java.util.ArrayList; @@ -423,6 +428,8 @@ public class TableStat { */ private String dataType; + protected long hashCode64; + public Column(String table, String name){ this.table = table; this.name = name; @@ -444,6 +451,28 @@ public class TableStat { return fullName; } + public long hashCode64() { + if (hashCode64 == 0) { + int p = table.indexOf('.'); + if (p != -1) { + String dbType = null; + if (table.indexOf('`') != -1) { + dbType = JdbcConstants.MYSQL; + } else if (table.indexOf('[') != -1) { + dbType = JdbcConstants.SQL_SERVER; + } else if (table.indexOf('@') != -1) { + dbType = JdbcConstants.ORACLE; + } + SQLExpr owner = SQLUtils.toSQLExpr(table, dbType); + hashCode64 = FNVUtils.fnv_64_lower(new SQLPropertyExpr(owner, name)); + } else { + hashCode64 = FNVUtils.fnv_64_lower(table, name); + } + } + + return hashCode64; + } + public boolean isWhere() { return where; } @@ -527,10 +556,8 @@ public class TableStat { } public int hashCode() { - int tableHashCode = table != null ? StringUtils.lowerHashCode(table) : 0; - int nameHashCode = name != null ? StringUtils.lowerHashCode(name) : 0; - - return tableHashCode + nameHashCode; + long hash = hashCode64(); + return (int)(hash ^ (hash >>> 32)); } public String toString() { @@ -542,34 +569,13 @@ public class TableStat { } public boolean equals(Object obj) { - if (!(obj instanceof Column)) { return false; } Column column = (Column) obj; - if (table == null) { - if (column.getTable() != null) { - return false; - } - } else { - if (!table.equalsIgnoreCase(column.getTable())) { - return false; - } - } - - if (name == null) { - if (column.getName() != null) { - return false; - } - } else { - if (!name.equalsIgnoreCase(column.getName())) { - return false; - } - } - - return true; + return hashCode64() == column.hashCode64(); } } diff --git a/src/main/java/com/alibaba/druid/util/FNVUtils.java b/src/main/java/com/alibaba/druid/util/FNVUtils.java index ac53248d5e..aad5b92810 100644 --- a/src/main/java/com/alibaba/druid/util/FNVUtils.java +++ b/src/main/java/com/alibaba/druid/util/FNVUtils.java @@ -15,7 +15,14 @@ */ package com.alibaba.druid.util; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; + +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.List; public class FNVUtils { public final static long HIGH_PRIORITY = fnv_64_lower("HIGH_PRIORITY"); @@ -81,6 +88,10 @@ public class FNVUtils { public final static long EXTRACT = fnv_64_lower("EXTRACT"); public final static long POSITION = fnv_64_lower("POSITION"); public final static long DUAL = fnv_64_lower("DUAL"); + public final static long LEVEL = fnv_64_lower("LEVEL"); + public final static long CONNECT_BY_ISCYCLE = fnv_64_lower("CONNECT_BY_ISCYCLE"); + public final static long CURRENT_TIMESTAMP = fnv_64_lower("CURRENT_TIMESTAMP"); + public final static long FALSE = fnv_64_lower("FALSE"); public static long fnv_64(String input) { if (input == null) { @@ -126,12 +137,13 @@ public class FNVUtils { char c1 = name.charAt(len - 1); if ((c0 == '`' && c1 == '`') || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') || (c0 == '[' && c1 == ']')) { quote = true; } } if (quote) { - return FNVUtils.fnv_64_lower(name, 1, len -1); + return FNVUtils.fnv_64_lower(name, 1, len - 1); } else { return FNVUtils.fnv_64_lower(name); } @@ -182,4 +194,134 @@ public class FNVUtils { } return hashCodes; } + + public static long fnv_64_lower(SQLPropertyExpr propertyExpr) { + List items = new ArrayList(); + items.add(propertyExpr.getName()); + + for (SQLExpr x = propertyExpr.getOwner();x != null;) { + if (x instanceof SQLPropertyExpr) { + SQLPropertyExpr p = (SQLPropertyExpr) x; + items.add(p.getName()); + x = p.getOwner(); + continue; + } + items.add(x.toString()); + break; + } + + Collections.reverse(items); + + long hashCode = 0xcbf29ce484222325L; + + for (int i = 0; i < items.size(); i++) { + if (i != 0) { + hashCode ^= '.'; + hashCode *= 0x100000001b3L; + } + + String item = items.get(i); + + boolean quote = false; + + int len = item.length(); + if (len > 2) { + char c0 = item.charAt(0); + char c1 = item.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + + int start = quote ? 1 : 0; + int end = quote ? len - 1 : len; + for (int j = start; j < end; ++j) { + char ch = item.charAt(j); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= 0x100000001b3L; + } + } + + return hashCode; + } + + public static long fnv_64_lower(String owner, String name) { + long hashCode = 0xcbf29ce484222325L; + + if (owner != null) { + String item = owner; + + boolean quote = false; + + int len = item.length(); + if (len > 2) { + char c0 = item.charAt(0); + char c1 = item.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + + int start = quote ? 1 : 0; + int end = quote ? len - 1 : len; + for (int j = start; j < end; ++j) { + char ch = item.charAt(j); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= 0x100000001b3L; + } + + hashCode ^= '.'; + hashCode *= 0x100000001b3L; + } + + + if (name != null) { + String item = name; + + boolean quote = false; + + int len = item.length(); + if (len > 2) { + char c0 = item.charAt(0); + char c1 = item.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + + int start = quote ? 1 : 0; + int end = quote ? len - 1 : len; + for (int j = start; j < end; ++j) { + char ch = item.charAt(j); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= 0x100000001b3L; + } + } + + return hashCode; + } } diff --git a/src/main/java/com/alibaba/druid/util/PGUtils.java b/src/main/java/com/alibaba/druid/util/PGUtils.java index 4e760f2814..0e75d86262 100644 --- a/src/main/java/com/alibaba/druid/util/PGUtils.java +++ b/src/main/java/com/alibaba/druid/util/PGUtils.java @@ -19,10 +19,7 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import javax.sql.XAConnection; @@ -73,4 +70,17 @@ public class PGUtils { return words.contains(name_lower); } + + private final static long[] pseudoColumnHashCodes; + static { + long[] array = { + FNVUtils.CURRENT_TIMESTAMP + }; + Arrays.sort(array); + pseudoColumnHashCodes = array; + } + + public static boolean isPseudoColumn(long hash) { + return Arrays.binarySearch(pseudoColumnHashCodes, hash) >= 0; + } } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index e0f383f73a..14182deee0 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -504,7 +504,9 @@ public abstract class WallProvider { try { WallContext.create(dbType); WallCheckResult result = checkInternal(sql); - return result.getViolations().isEmpty(); + return result + .getViolations() + .isEmpty(); } finally { if (originalContext == null) { diff --git a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallProvider.java b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallProvider.java index 61d3a71231..b2e8724e28 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallProvider.java @@ -39,7 +39,8 @@ public class MySqlWallProvider extends WallProvider { @Override public SQLStatementParser createParser(String sql) { - return new MySqlStatementParser(sql, SQLParserFeature.EnableSQLBinaryOpExprGroup); + return new MySqlStatementParser(sql, SQLParserFeature.EnableSQLBinaryOpExprGroup + ); } @Override diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 3f9ca781ef..269474afe2 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -22,31 +22,8 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; -import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr.Item; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLExistsExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLInListExpr; -import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLNotExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLValuableExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; @@ -112,8 +89,8 @@ public class WallVisitorUtils { } public static boolean check(WallVisitor visitor, SQLBinaryOpExpr x) { - - if (x.getOperator() == SQLBinaryOperator.BooleanOr || x.getOperator() == SQLBinaryOperator.BooleanAnd) { + if (x.getOperator() == SQLBinaryOperator.BooleanOr + || x.getOperator() == SQLBinaryOperator.BooleanAnd) { List groupList = SQLBinaryOpExpr.split(x); for (SQLExpr item : groupList) { item.accept(visitor); @@ -121,7 +98,8 @@ public class WallVisitorUtils { return false; } - if (x.getOperator() == SQLBinaryOperator.Add || x.getOperator() == SQLBinaryOperator.Concat) { + if (x.getOperator() == SQLBinaryOperator.Add + || x.getOperator() == SQLBinaryOperator.Concat) { List groupList = SQLBinaryOpExpr.split(x); if (groupList.size() >= 4) { int chrCount = 0; @@ -153,6 +131,10 @@ public class WallVisitorUtils { return true; } + public static boolean check(WallVisitor visitor, SQLBinaryOpExprGroup x) { + return true; + } + public static void check(WallVisitor visitor, SQLCreateTableStatement x) { String tableName = ((SQLName) x.getName()).getSimpleName(); WallContext context = WallContext.current(); @@ -246,8 +228,9 @@ public class WallVisitorUtils { Object whereValue = getConditionValue(visitor, where, visitor.getConfig().isSelectWhereAlwayTrueCheck()); if (Boolean.TRUE == whereValue) { - if (visitor.getConfig().isSelectWhereAlwayTrueCheck() && visitor.isSqlEndOfComment() - && !isSimpleConstExpr(where)) {// 简单表达式 + if (visitor.getConfig().isSelectWhereAlwayTrueCheck() + && visitor.isSqlEndOfComment() + && !isSimpleConstExpr(where)) {// 简单表达式 addViolation(visitor, ErrorCode.ALWAYS_TRUE, "select alway true condition not allow", x); } } @@ -262,8 +245,9 @@ public class WallVisitorUtils { } if (Boolean.TRUE == getConditionValue(visitor, x, visitor.getConfig().isSelectHavingAlwayTrueCheck())) { - if (visitor.getConfig().isSelectHavingAlwayTrueCheck() && visitor.isSqlEndOfComment() - && !isSimpleConstExpr(x)) { + if (visitor.getConfig().isSelectHavingAlwayTrueCheck() + && visitor.isSqlEndOfComment() + && !isSimpleConstExpr(x)) { addViolation(visitor, ErrorCode.ALWAYS_TRUE, "having alway true condition not allow", x); } } @@ -971,78 +955,30 @@ public class WallVisitorUtils { checkUpdateForMultiTenant(visitor, x); } + public static Object getValue(WallVisitor visitor, SQLBinaryOpExprGroup x) { + List groupList = x.getItems(); + + if (x.getOperator() == SQLBinaryOperator.BooleanOr) { + return getValue_or(visitor, groupList); + } + + if (x.getOperator() == SQLBinaryOperator.BooleanAnd) { + return getValue_and(visitor, groupList); + } + + return null; + } + public static Object getValue(WallVisitor visitor, SQLBinaryOpExpr x) { if (x.getOperator() == SQLBinaryOperator.BooleanOr) { List groupList = SQLBinaryOpExpr.split(x); - boolean allFalse = true; - for (int i = groupList.size() - 1; i >= 0; --i) { - SQLExpr item = groupList.get(i); - Object result = getValue(visitor, item); - Boolean booleanVal = SQLEvalVisitorUtils.castToBoolean(result); - if (Boolean.TRUE == booleanVal) { - final WallConditionContext wallContext = WallVisitorUtils.getWallConditionContext(); - if (wallContext != null && !isFirst(item)) { - wallContext.setPartAlwayTrue(true); - } - return true; - } - - if (Boolean.FALSE != booleanVal) { - allFalse = false; - } - } - - if (allFalse) { - return false; - } - - return null; + return getValue_or(visitor, groupList); } if (x.getOperator() == SQLBinaryOperator.BooleanAnd) { - List groupList = SQLBinaryOpExpr.split(x); - - int dalConst = 0; - Boolean allTrue = Boolean.TRUE; - for (int i = groupList.size() - 1; i >= 0; --i) { - - SQLExpr item = groupList.get(i); - Object result = getValue(visitor, item); - Boolean booleanVal = SQLEvalVisitorUtils.castToBoolean(result); - - if (Boolean.TRUE == booleanVal) { - final WallConditionContext wallContext = WallVisitorUtils.getWallConditionContext(); - if (wallContext != null && !isFirst(item)) { - wallContext.setPartAlwayTrue(true); - } - dalConst++; - } else if (Boolean.FALSE == booleanVal) { - final WallConditionContext wallContext = WallVisitorUtils.getWallConditionContext(); - if (wallContext != null && !isFirst(item)) { - wallContext.setPartAlwayFalse(true); - } - allTrue = Boolean.FALSE; - dalConst++; - } else { - if (allTrue != Boolean.FALSE) { - allTrue = null; - } - dalConst = 0; - } - - if (dalConst == 2 && visitor != null && !visitor.getConfig().isConditionDoubleConstAllow()) { - addViolation(visitor, ErrorCode.DOUBLE_CONST_CONDITION, "double const condition", x); - } - } - - if (Boolean.TRUE == allTrue) { - return true; - } else if (Boolean.FALSE == allTrue) { - return false; - } - return null; + return getValue_and(visitor, groupList); } boolean checkCondition = visitor != null @@ -1123,6 +1059,74 @@ public class WallVisitorUtils { return eval(visitor, dbType, x, Collections.emptyList()); } + private static Object getValue_or(WallVisitor visitor, List groupList) { + boolean allFalse = true; + for (int i = groupList.size() - 1; i >= 0; --i) { + SQLExpr item = groupList.get(i); + Object result = getValue(visitor, item); + Boolean booleanVal = SQLEvalVisitorUtils.castToBoolean(result); + if (Boolean.TRUE == booleanVal) { + final WallConditionContext wallContext = WallVisitorUtils.getWallConditionContext(); + if (wallContext != null && !isFirst(item)) { + wallContext.setPartAlwayTrue(true); + } + return true; + } + + if (Boolean.FALSE != booleanVal) { + allFalse = false; + } + } + + if (allFalse) { + return false; + } + + return null; + } + + private static Object getValue_and(WallVisitor visitor, List groupList) { + int dalConst = 0; + Boolean allTrue = Boolean.TRUE; + for (int i = groupList.size() - 1; i >= 0; --i) { + + SQLExpr item = groupList.get(i); + Object result = getValue(visitor, item); + Boolean booleanVal = SQLEvalVisitorUtils.castToBoolean(result); + + if (Boolean.TRUE == booleanVal) { + final WallConditionContext wallContext = WallVisitorUtils.getWallConditionContext(); + if (wallContext != null && !isFirst(item)) { + wallContext.setPartAlwayTrue(true); + } + dalConst++; + } else if (Boolean.FALSE == booleanVal) { + final WallConditionContext wallContext = WallVisitorUtils.getWallConditionContext(); + if (wallContext != null && !isFirst(item)) { + wallContext.setPartAlwayFalse(true); + } + allTrue = Boolean.FALSE; + dalConst++; + } else { + if (allTrue != Boolean.FALSE) { + allTrue = null; + } + dalConst = 0; + } + + if (dalConst == 2 && visitor != null && !visitor.getConfig().isConditionDoubleConstAllow()) { + addViolation(visitor, ErrorCode.DOUBLE_CONST_CONDITION, "double const condition", item); + } + } + + if (Boolean.TRUE == allTrue) { + return true; + } else if (Boolean.FALSE == allTrue) { + return false; + } + return null; + } + public static SQLExpr getFirst(SQLExpr x) { if (x instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr binary = (SQLBinaryOpExpr) x; @@ -1181,6 +1185,12 @@ public class WallVisitorUtils { return true; } + if (parent instanceof SQLBinaryOpExprGroup) { + if (x != ((SQLBinaryOpExprGroup) parent).getItems().get(0)) { + return false; + } + } + if (parent instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) parent; if (x == binaryExpr.getRight()) { @@ -1411,15 +1421,18 @@ public class WallVisitorUtils { } } - if (current.hasPartAlwayTrue() && !visitor.getConfig().isConditionAndAlwayTrueAllow()) { + if (current.hasPartAlwayTrue() + && !visitor.getConfig().isConditionAndAlwayTrueAllow()) { addViolation(visitor, ErrorCode.ALWAYS_TRUE, "part alway true condition not allow", x); } - if (current.hasPartAlwayFalse() && !visitor.getConfig().isConditionAndAlwayFalseAllow()) { + if (current.hasPartAlwayFalse() + && !visitor.getConfig().isConditionAndAlwayFalseAllow()) { addViolation(visitor, ErrorCode.ALWAYS_FALSE, "part alway false condition not allow", x); } - if (current.hasConstArithmetic() && !visitor.getConfig().isConstArithmeticAllow()) { + if (current.hasConstArithmetic() + && !visitor.getConfig().isConstArithmeticAllow()) { addViolation(visitor, ErrorCode.CONST_ARITHMETIC, "const arithmetic not allow", x); } @@ -1462,6 +1475,10 @@ public class WallVisitorUtils { return getValue(visitor, (SQLBinaryOpExpr) x); } + if (x instanceof SQLBinaryOpExprGroup) { + return getValue(visitor, (SQLBinaryOpExprGroup) x); + } + if (x instanceof SQLBooleanExpr) { return ((SQLBooleanExpr) x).getBooleanValue(); } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest10.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest10.java index 5ac354e9a0..996b3bb422 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest10.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest10.java @@ -32,6 +32,6 @@ public class MySqlWallTest10 extends TestCase { public void test_true() throws Exception { Assert.assertTrue(WallUtils.isValidateMySql(// - "SELECT t.*,a.param_id FROM lhwtag AS t RIGHT JOIN lhwtag_relation AS a USING(`tag_id`) WHERE a.`type_id`=1 AND a.`param_id` IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') ORDER BY t.`content_count`")); // 前置永真 + "SELECT t.*,a.param_id FROM lhwtag AS t RIGHT JOIN lhwtag_relation AS a USING(`tag_id`) WHERE a.`type_id`=1 AND a.`param_id` IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') ORDER BY t.`content_count`")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/HashTest_1_propertyExpr.java b/src/test/java/com/alibaba/druid/bvt/sql/HashTest_1_propertyExpr.java index 1544c08f0a..012fdb3b1c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/HashTest_1_propertyExpr.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/HashTest_1_propertyExpr.java @@ -2,6 +2,7 @@ package com.alibaba.druid.bvt.sql; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.util.FNVUtils; import junit.framework.TestCase; public class HashTest_1_propertyExpr extends TestCase { @@ -19,4 +20,28 @@ public class HashTest_1_propertyExpr extends TestCase { assertEquals(new SQLPropertyExpr("t","\"a\"").name_hash_lower() , new SQLPropertyExpr("t","`A`").name_hash_lower());; } + + public void test_issue_3() throws Exception { + assertEquals(new SQLPropertyExpr("ESCROW","HT_TASK_TRADE_HISTORY_NEW").name_hash_lower() + , new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").name_hash_lower());; + } + + public void test_issue_4() throws Exception { + assertEquals(new SQLPropertyExpr("ESCROW","HT_TASK_TRADE_HISTORY_NEW").hashCode64() + , new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").hashCode64());; + } + + public void test_issue_5() throws Exception { + assertEquals( + FNVUtils.fnv_64_lower("a.b") + , FNVUtils.fnv_64_lower(new SQLPropertyExpr("\"a\"","\"b\"")));; + } + + public void test_issue_6() throws Exception { + assertEquals( + FNVUtils.fnv_64_lower("ESCROW.HT_TASK_TRADE_HISTORY_NEW") + , FNVUtils.fnv_64_lower(new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"")));; + } + + //ESCROW.HT_TASK_TRADE_HISTORY_NEW } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLDeleteParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLDeleteParserTest.java index bd320ab75b..63424a8166 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLDeleteParserTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLDeleteParserTest.java @@ -32,8 +32,9 @@ public class DMLDeleteParserTest extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("DELETE LOW_PRIORITY FROM id1.id, id USING (t1) AS a" + // - "\nWHERE col1 = ?", output); + Assert.assertEquals("DELETE LOW_PRIORITY FROM id1.id, id\n" + + "USING t1 a\n" + + "WHERE col1 = ?", output); } public void testDelete_1() throws Exception { @@ -52,10 +53,10 @@ public class DMLDeleteParserTest extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("DELETE FROM offer.*, wp_image.*" + // - " USING (offer) AS a, wp_image b\n" + // - "WHERE a.member_id = b.member_id\n" + // - "\tAND a.member_id = 'abc'", output); + Assert.assertEquals("DELETE FROM offer.*, wp_image.*\n" + + "USING offer a, wp_image b\n" + + "WHERE a.member_id = b.member_id\n" + + "\tAND a.member_id = 'abc'", output); } public void testDelete_3() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2MergeTest.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2MergeTest.java index be01288206..a9395cf5ae 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2MergeTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2MergeTest.java @@ -38,15 +38,15 @@ public class DB2MergeTest extends DB2Test { DB2StatementParser parser = new DB2StatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); - print(statementList); + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); DB2SchemaStatVisitor visitor = new DB2SchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); @@ -54,8 +54,8 @@ public class DB2MergeTest extends DB2Test { Assert.assertEquals(4, visitor.getColumns().size()); Assert.assertEquals(2, visitor.getConditions().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sales"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("product"))); + Assert.assertTrue(visitor.containsTable("sales")); + Assert.assertTrue(visitor.containsTable("product")); // Assert.assertTrue(visitor.getColumns().contains(new Column("DSN8B10.EMP", "WORKDEPT"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_1.java index 4e9a064b9d..4057202b08 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_1.java @@ -42,8 +42,8 @@ public class DB2SelectTest_1 extends DB2Test { DB2SchemaStatVisitor visitor = new DB2SchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/DeleteSyntaxTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/DeleteSyntaxTest.java index 3397ffb929..c85146a5f3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/DeleteSyntaxTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/DeleteSyntaxTest.java @@ -72,11 +72,14 @@ public class DeleteSyntaxTest extends TestCase { SQLStatement stmt = stmtList.get(0); - Assert.assertEquals("DELETE FROM (a1, a2 USING (t1) AS a1)\n" + + Assert.assertEquals("DELETE FROM a1, a2\n" + + "USING t1 a1\n" + "\tINNER JOIN t2 a2\n" + "WHERE a1.id = a2.id", SQLUtils.toMySqlString(stmt)); - Assert.assertEquals("delete from (a1, a2 using (t1) as a1)" + // - "\n\tinner join t2 a2\nwhere a1.id = a2.id", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + Assert.assertEquals("delete from a1, a2\n" + + "using t1 a1\n" + + "\tinner join t2 a2\n" + + "where a1.id = a2.id", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } public void test_4() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java index 1a2af4ccd1..f2b3359db7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_0.java @@ -33,16 +33,18 @@ public class MySqlDeleteTest_0 extends MysqlTest { MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); + System.out.println(stmt); + Assert.assertEquals(1, statementList.size()); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java index 2f066741c0..19f5a85320 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_1.java @@ -36,32 +36,35 @@ public class MySqlDeleteTest_1 extends MysqlTest { List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); - Assert.assertEquals("DELETE FROM (a1, a2 USING (t1) AS a1)" - + "\n\tINNER JOIN t2 a2" - + "\nWHERE a1.id = a2.id;", SQLUtils.toMySqlString(stmt)); - Assert.assertEquals("delete from (a1, a2 using (t1) as a1)" - + "\n\tinner join t2 a2" - + "\nwhere a1.id = a2.id;", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + Assert.assertEquals("DELETE FROM a1, a2\n" + + "USING t1 a1\n" + + "\tINNER JOIN t2 a2\n" + + "WHERE a1.id = a2.id;", SQLUtils.toMySqlString(stmt)); + Assert.assertEquals("delete from a1, a2\n" + + "using t1 a1\n" + + "\tinner join t2 a2\n" + + "where a1.id = a2.id;", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); Assert.assertEquals(1, statementList.size()); + System.out.println(stmt.toString()); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); + System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(3, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getTables().size()); Assert.assertEquals(2, visitor.getColumns().size()); Assert.assertEquals(2, visitor.getConditions().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("a1"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("a2"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("a1", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("a2", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("t1", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java index 28f1073c71..15d013ba00 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_2.java @@ -49,8 +49,8 @@ public class MySqlDeleteTest_2 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java index 5ab7e1a7a9..40721496e9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java @@ -86,13 +86,15 @@ public class MySqlDeleteTest_3 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println(stmt); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(5, visitor.getTables().size()); - Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(6, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); @@ -100,6 +102,7 @@ public class MySqlDeleteTest_3 extends MysqlTest { Assert.assertTrue(visitor.getColumns().contains(new Column("t1", "s11"))); Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "s1"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "*"))); Assert.assertTrue(visitor.getColumns().contains(new Column("t3", "*"))); Assert.assertTrue(visitor.getColumns().contains(new Column("t4", "s1"))); Assert.assertTrue(visitor.getColumns().contains(new Column("t5", "*"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlExplainTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlExplainTest_0.java index 3b950eb290..edef10562a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlExplainTest_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlExplainTest_0.java @@ -40,8 +40,8 @@ public class MySqlExplainTest_0 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest.java index afc0e85e18..95fd6fd0e8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest.java @@ -44,8 +44,8 @@ public class MySqlReplaceTest extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest_1.java index 8954af9591..cf351341ce 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlReplaceTest_1.java @@ -160,17 +160,19 @@ public class MySqlReplaceTest_1 extends MysqlTest { assertEquals(1, statementList.size()); + System.out.println(stmt); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); -// System.out.println("coditions : " + visitor.getConditions()); -// System.out.println("orderBy : " + visitor.getOrderByColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(3, visitor.getTables().size()); - assertEquals(16, visitor.getColumns().size()); - assertEquals(8, visitor.getConditions().size()); + assertEquals(12, visitor.getColumns().size()); + assertEquals(4, visitor.getConditions().size()); assertTrue(visitor.containsTable("tb_001")); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java index 369d72b3f5..d863cc2288 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java @@ -62,25 +62,26 @@ public class MySqlCreateProcedureTest extends MysqlTest { MySqlStatementParser parser=new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + System.out.println(stmt); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest1.java index 4ee58c37d7..d86b88d284 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest1.java @@ -53,18 +53,17 @@ public class MySqlCreateProcedureTest1 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); statemen.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest12.java index ba85a8b4b7..d359366ee7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest12.java @@ -19,7 +19,9 @@ import com.alibaba.druid.sql.MysqlTest; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.util.JdbcConstants; +import org.junit.Assert; import java.util.List; @@ -64,14 +66,19 @@ public class MySqlCreateProcedureTest12 extends MysqlTest { SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(3, visitor.getTables().size()); - assertEquals(6, visitor.getColumns().size()); + assertEquals(4, visitor.getColumns().size()); assertEquals(2, visitor.getConditions().size()); + + Assert.assertTrue(visitor.containsColumn("_result", "node")); + Assert.assertTrue(visitor.containsColumn("nodes", "parent")); + Assert.assertTrue(visitor.containsColumn("nodes", "child")); + Assert.assertTrue(visitor.containsColumn("_tmp", "node")); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java index 0d22f0fdb2..125f426b52 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.util.JdbcConstants; +import org.junit.Assert; import java.util.List; @@ -49,14 +50,16 @@ public class MySqlCreateProcedureTest14 extends MysqlTest { SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(1, visitor.getTables().size()); - assertEquals(0, visitor.getColumns().size()); + assertEquals(1, visitor.getColumns().size()); assertEquals(0, visitor.getConditions().size()); + + assertTrue(visitor.containsColumn("mysql.user", "*")); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest2.java index 5a822ec4ab..f8e0f9c9d0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest2.java @@ -53,20 +53,20 @@ public class MySqlCreateProcedureTest2 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); statemen.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } + public void test_1() throws Exception { String sql="create or replace procedure sp_name(level int,age int)"+ " begin"+ @@ -78,26 +78,27 @@ public class MySqlCreateProcedureTest2 extends MysqlTest { MySqlStatementParser parser=new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + System.out.println(stmt); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } public void test_2() throws Exception { @@ -124,12 +125,11 @@ public class MySqlCreateProcedureTest2 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest3.java index 7b6afb93a3..3c9515d8b8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest3.java @@ -47,27 +47,29 @@ public class MySqlCreateProcedureTest3 extends MysqlTest { MySqlStatementParser parser=new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + System.out.println(stmt); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } + public void test_1() throws Exception { String sql="create or replace procedure sp_name(level int,age int)"+ " begin"+ @@ -93,13 +95,12 @@ public class MySqlCreateProcedureTest3 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } public void test_2() throws Exception { @@ -127,12 +128,11 @@ public class MySqlCreateProcedureTest3 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest4.java index 1c24bc3815..3a36ea7d3c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest4.java @@ -47,26 +47,27 @@ public class MySqlCreateProcedureTest4 extends MysqlTest { MySqlStatementParser parser=new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + System.out.println(stmt); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } public void test_1() throws Exception { String sql="create or replace procedure sp_name(level int,age int)"+ @@ -93,13 +94,12 @@ public class MySqlCreateProcedureTest4 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest5.java index 8fe7843435..8277def041 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest5.java @@ -46,15 +46,17 @@ public class MySqlCreateProcedureTest5 extends MysqlTest { MySqlStatementParser parser=new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + System.out.println(stmt); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); @@ -64,8 +66,8 @@ public class MySqlCreateProcedureTest5 extends MysqlTest { assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - assertTrue(visitor.getColumns().contains(new Column("test", "id"))); -// assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + assertTrue(visitor.containsColumn("test", "id")); +// assertTrue(visitor.containsColumn("test", "age"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest6.java index 38012463d1..235bef6b81 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest6.java @@ -50,19 +50,18 @@ public class MySqlCreateProcedureTest6 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); statemen.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } public void test_1() throws Exception { String sql="create or replace procedure sp_name(in level int,in age int)"+ @@ -85,13 +84,12 @@ public class MySqlCreateProcedureTest6 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } public void test_2() throws Exception { String sql="create or replace procedure sp_name(out level int,out age int)"+ @@ -114,14 +112,14 @@ public class MySqlCreateProcedureTest6 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } + public void test_3() throws Exception { String sql="create or replace procedure sp_name(inout level int,inout age int)"+ " begin"+ @@ -143,13 +141,12 @@ public class MySqlCreateProcedureTest6 extends MysqlTest { // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest11.java index 1cf4c89cd4..d6640c1cb3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest11.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest11.java @@ -59,9 +59,9 @@ public class MySqlCreateTableTest11 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tmall_campaign"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("tmall_campaign", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("tmall_campaign", "campaign_name"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("tmall_campaign", "create_date"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("tmall_campaign", "delete_flag"))); + Assert.assertTrue(visitor.containsColumn("tmall_campaign", "id")); + Assert.assertTrue(visitor.containsColumn("tmall_campaign", "campaign_name")); + Assert.assertTrue(visitor.containsColumn("tmall_campaign", "create_date")); + Assert.assertTrue(visitor.containsColumn("tmall_campaign", "delete_flag")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest12.java index 2b36878c50..8942aee04f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest12.java @@ -41,8 +41,8 @@ public class MySqlCreateTableTest12 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); statemen.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); @@ -52,6 +52,6 @@ public class MySqlCreateTableTest12 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "blob_col"))); + Assert.assertTrue(visitor.containsColumn("test", "blob_col")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest13.java index 88b3091a7e..f2effa4fb3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest13.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest13.java @@ -62,7 +62,7 @@ public class MySqlCreateTableTest13 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("xx_video"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("xx_video", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("xx_video", "video_url"))); + Assert.assertTrue(visitor.containsColumn("xx_video", "id")); + Assert.assertTrue(visitor.containsColumn("xx_video", "video_url")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java index 698f18f3b6..9ac0765119 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java @@ -83,7 +83,7 @@ public class MySqlCreateTableTest14 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("OptionList"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("OptionList", "ID"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("OptionList", "OptionCount"))); + Assert.assertTrue(visitor.containsColumn("OptionList", "ID")); + Assert.assertTrue(visitor.containsColumn("OptionList", "OptionCount")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest15.java index 9a4dbaa6db..9f8a3545d2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest15.java @@ -64,7 +64,7 @@ public class MySqlCreateTableTest15 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("xxx"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("xxx", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("xxx", "amount"))); + Assert.assertTrue(visitor.containsColumn("xxx", "id")); + Assert.assertTrue(visitor.containsColumn("xxx", "amount")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest18.java index 628618839f..7773cab71c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest18.java @@ -69,6 +69,6 @@ public class MySqlCreateTableTest18 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey( new TableStat.Name("t_awards"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("t_awards", "f_type"))); + Assert.assertTrue(visitor.containsColumn("t_awards", "f_type")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest48.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest48.java index fd7dfb608f..9a784fcb74 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest48.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest48.java @@ -39,16 +39,18 @@ public class MySqlCreateTableTest48 extends MysqlTest { MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement stmt = parser.parseCreateTable(); + System.out.println(stmt); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertEquals(6, visitor.getColumns().size()); + Assert.assertEquals(5, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("AO_E8B6CC_REPO_TO_CHANGESET"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest5.java index a5db1bf880..a32c7f8656 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest5.java @@ -60,7 +60,7 @@ public class MySqlCreateTableTest5 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("test", "dspcode"))); + Assert.assertTrue(visitor.containsColumn("test", "id")); + Assert.assertTrue(visitor.containsColumn("test", "dspcode")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_18.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_18.java index aac10e6942..6094beb350 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_18.java @@ -54,13 +54,13 @@ public class MySqlSelectTest_18 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); statemen.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(15, visitor.getColumns().size()); + Assert.assertEquals(14, visitor.getColumns().size()); Assert.assertEquals(2, visitor.getConditions().size()); Assert.assertTrue(visitor.getColumns().contains(new Column("sys_user", "id"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_54.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_54.java new file mode 100644 index 0000000000..cb9d8fd701 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_54.java @@ -0,0 +1,106 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql.select; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlSelectTest_54 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "SELECT t.*,a.param_id FROM lhwtag AS t RIGHT JOIN lhwtag_relation AS a USING(`tag_id`) WHERE a.`type_id`=1 AND a.`param_id` IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') ORDER BY t.`content_count`"; + + System.out.println(sql); + + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL, true); + SQLStatement stmt = statementList.get(0); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + +// assertEquals(1, visitor.getTables().size()); +// assertEquals(1, visitor.getColumns().size()); +// assertEquals(0, visitor.getConditions().size()); +// assertEquals(0, visitor.getOrderByColumns().size()); + + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("SELECT t.*, a.param_id\n" + + "FROM lhwtag t\n" + + "\tRIGHT JOIN lhwtag_relation a USING (`tag_id`)\n" + + "WHERE a.`type_id` = 1\n" + + "\tAND a.`param_id` IN (\n" + + "\t\t'0', \n" + + "\t\t'1', \n" + + "\t\t'2', \n" + + "\t\t'3', \n" + + "\t\t'4', \n" + + "\t\t'5', \n" + + "\t\t'6', \n" + + "\t\t'7', \n" + + "\t\t'8', \n" + + "\t\t'9'\n" + + "\t)\n" + + "ORDER BY t.`content_count`", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("select t.*, a.param_id\n" + + "from lhwtag t\n" + + "\tright join lhwtag_relation a using (`tag_id`)\n" + + "where a.`type_id` = 1\n" + + "\tand a.`param_id` in (\n" + + "\t\t'0', \n" + + "\t\t'1', \n" + + "\t\t'2', \n" + + "\t\t'3', \n" + + "\t\t'4', \n" + + "\t\t'5', \n" + + "\t\t'6', \n" + + "\t\t'7', \n" + + "\t\t'8', \n" + + "\t\t'9'\n" + + "\t)\n" + + "order by t.`content_count`", // + output); + } + + { + String output = SQLUtils.toMySqlString(stmt, new SQLUtils.FormatOption(true, true, true)); + assertEquals("SELECT t.*, a.param_id\n" + + "FROM lhwtag t\n" + + "\tRIGHT JOIN lhwtag_relation a USING (`tag_id`)\n" + + "WHERE a.`type_id` = ?\n" + + "\tAND a.`param_id` IN (?)\n" + + "ORDER BY t.`content_count`", // + output); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_update.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_update.java index 6054436701..0c90f3374c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_update.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_update.java @@ -41,8 +41,6 @@ public class MySqlSelectTest_update extends MysqlTest { Assert.assertEquals(1, statementList.size()); - String output = SQLUtils.toMySqlString(stmt); - String expected = "SELECT current_no" + "\nFROM UPDATE wlb_waybill_branch_rule" + "\nSET current_no = current_no + ?, gmt_modified = now()" @@ -52,13 +50,13 @@ public class MySqlSelectTest_update extends MysqlTest { + "\nORDER BY current_no DESC" + "\nLIMIT 10"; - Assert.assertEquals(expected, output); + Assert.assertEquals(expected, stmt.toString()); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); @@ -66,5 +64,11 @@ public class MySqlSelectTest_update extends MysqlTest { Assert.assertEquals(5, visitor.getColumns().size()); Assert.assertEquals(4, visitor.getConditions().size()); Assert.assertEquals(0, visitor.getOrderByColumns().size()); + + Assert.assertTrue(visitor.containsColumn("wlb_waybill_branch_rule", "current_no")); + Assert.assertTrue(visitor.containsColumn("wlb_waybill_branch_rule", "gmt_modified")); + Assert.assertTrue(visitor.containsColumn("wlb_waybill_branch_rule", "id")); + Assert.assertTrue(visitor.containsColumn("wlb_waybill_branch_rule", "status")); + Assert.assertTrue(visitor.containsColumn("wlb_waybill_branch_rule", "end_no")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_4.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_4.java index d5c4216b42..071998d6bb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_4.java @@ -35,15 +35,16 @@ public class MySqlUpdateTest_4 extends MysqlTest { MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); -// print(statementList); + + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseHintTest_parallel.java b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseHintTest_parallel.java index f73f0413da..3953edd6be 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseHintTest_parallel.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseHintTest_parallel.java @@ -50,10 +50,11 @@ public class OceanbaseHintTest_parallel extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); -// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); + Assert.assertTrue(visitor.containsTable("t1")); + Assert.assertTrue(visitor.containsColumn("t1", "*")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java index 24a8d7c250..1e625d01ec 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java @@ -41,21 +41,23 @@ public class OdpsSelectTest12 extends TestCase { List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); SQLStatement stmt = statementList.get(0); + System.out.println(stmt); + Assert.assertEquals(1, statementList.size()); SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); -// Assert.assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest22.java index f084498d35..a1b998cde7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest22.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest22.java @@ -147,12 +147,12 @@ public class OdpsSelectTest22 extends TestCase { // System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(2, visitor.getTables().size()); - assertEquals(17, visitor.getColumns().size()); + assertEquals(15, visitor.getColumns().size()); assertEquals(6, visitor.getConditions().size()); System.out.println(SQLUtils.formatOdps(sql)); -// assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); + assertTrue(visitor.containsColumn("alimama_algo.fund_mlr_n_chicago_user_track_distinct_shark", "item_id")); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest24.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest24.java index dd20bb6020..4d6ffc8769 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest24.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest24.java @@ -200,17 +200,19 @@ public class OdpsSelectTest24 extends TestCase { SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS); stmt.accept(visitor); + + System.out.println(stmt); -// System.out.println("Tables : " + visitor.getTables()); + System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(3, visitor.getTables().size()); - assertEquals(20, visitor.getColumns().size()); - assertEquals(16, visitor.getConditions().size()); + assertEquals(18, visitor.getColumns().size()); + assertEquals(12, visitor.getConditions().size()); - System.out.println(SQLUtils.formatOdps(sql)); +// System.out.println(SQLUtils.formatOdps(sql)); // assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest25.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest25.java index 0406122415..e902bdc883 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest25.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest25.java @@ -119,12 +119,14 @@ public class OdpsSelectTest25 extends TestCase { List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); SQLStatement stmt = statementList.get(0); + System.out.println(stmt); + assertEquals(1, statementList.size()); SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); + System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); @@ -133,9 +135,14 @@ public class OdpsSelectTest25 extends TestCase { assertEquals(6, visitor.getColumns().size()); assertEquals(2, visitor.getConditions().size()); - System.out.println(SQLUtils.formatOdps(sql)); +// System.out.println(SQLUtils.formatOdps(sql)); -// assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); + assertTrue(visitor.containsColumn("ids_openapp_dau_d", "dt")); + assertTrue(visitor.containsColumn("openapp_log_d", "uid")); + assertTrue(visitor.containsColumn("openapp_log_d", "pv")); + assertTrue(visitor.containsColumn("openapp_log_d", "v")); + assertTrue(visitor.containsColumn("openapp_log_d", "utype")); + assertTrue(visitor.containsColumn("openapp_log_d", "dt")); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java index 8e574cf9d3..24e5cecdf3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java @@ -14,9 +14,11 @@ public class ExportSelectListColumnsTest2 extends TestCase { String sql = "SELECT * " + "\n FROM fund_base_cv_ad_auction_ocr_pv_tfs a" + "\n WHERE ds=20150819"; - + String text = udf.evaluate(sql, "odps"); Assert.assertEquals("fund_base_cv_ad_auction_ocr_pv_tfs.*", text); + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleDeleteTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleDeleteTest.java index ba415c4f2c..d6f23b04f8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleDeleteTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleDeleteTest.java @@ -34,13 +34,14 @@ public class OracleDeleteTest extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); - print(statementList); + SQLStatement stmt = statementList.get(0); + + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); @@ -53,9 +54,9 @@ public class OracleDeleteTest extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("BILLING_LOG_MONITOR"))); // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); // - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("BILLING_LOG_MONITOR", "guid"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + Assert.assertTrue(visitor.containsColumn("BILLING_LOG_MONITOR", "guid")); + // Assert.assertTrue(visitor.containsColumn("employees", "salary")); + // Assert.assertTrue(visitor.containsColumn("employees", "commission_pct")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleListAggTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleListAggTest1.java index a33832fa2d..dc71877404 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleListAggTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleListAggTest1.java @@ -58,7 +58,7 @@ public class OracleListAggTest1 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertEquals(8, visitor.getColumns().size()); + Assert.assertEquals(9, visitor.getColumns().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("WEP_USER_ROLE"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("WEP_ROLE"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java index 71b48b0fd5..cc8f48d989 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java @@ -32,13 +32,15 @@ public class OracleMergeTest3 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); - print(statementList); + SQLStatement stmt = statementList.get(0); + + + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); @@ -51,13 +53,13 @@ public class OracleMergeTest3 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tab$"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.mon_mods_all$"))); - Assert.assertEquals(16, visitor.getColumns().size()); + Assert.assertEquals(15, visitor.getColumns().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); + Assert.assertTrue(visitor.containsColumn("sys.mon_mods$", "obj#")); +// Assert.assertTrue(visitor.containsColumn("employees", "salary")); +// Assert.assertTrue(visitor.containsColumn("employees", "department_id")); +// Assert.assertTrue(visitor.containsColumn("bonuses", "employee_id")); +// Assert.assertTrue(visitor.containsColumn("bonuses", "bonus")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest5.java index c821eeb4f7..d5e3920617 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest5.java @@ -58,13 +58,9 @@ public class OracleMergeTest5 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("MEMBER_LAST_LOGIN_HZ"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("MEMBER_LAST_LOGIN"))); - Assert.assertEquals(12, visitor.getColumns().size()); + Assert.assertEquals(13, visitor.getColumns().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); + Assert.assertTrue(visitor.containsColumn("MEMBER_LAST_LOGIN_HZ", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java index 6fd6e237ba..b32ae314f9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java @@ -55,13 +55,15 @@ public class OracleMergeTest6 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("console_stb_ipstatus"))); - Assert.assertEquals(6, visitor.getColumns().size()); + Assert.assertEquals(7, visitor.getColumns().size()); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "stbid")); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "ip")); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "port")); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "status")); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "time")); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "id")); + Assert.assertTrue(visitor.containsColumn("console_stb_ipstatus", "firsttime")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest2.java index 8896412b4c..7b33f4f62c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest2.java @@ -44,28 +44,30 @@ public class OracleUpdateTest2 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); System.out.println("coditions : " + visitor.getConditions()); System.out.println("relationships : " + visitor.getRelationships()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("wrh$_tempfile"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("x$kcctf"))); + assertTrue(visitor.getTables().containsKey(new TableStat.Name("wrh$_tempfile"))); + assertTrue(visitor.getTables().containsKey(new TableStat.Name("x$kcctf"))); - Assert.assertEquals(4, visitor.getTables().size()); - Assert.assertEquals(18, visitor.getColumns().size()); + assertEquals(4, visitor.getTables().size()); + assertEquals(15, visitor.getColumns().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("table1", "column"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("table2", "expr"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("table2", "column"))); + assertTrue(visitor.containsColumn("wrh$_tempfile", "snap_id")); + assertTrue(visitor.containsColumn("wrh$_tempfile", "filename")); + assertTrue(visitor.containsColumn("wrh$_tempfile", "tsname")); + assertTrue(visitor.containsColumn("ts$", "name")); + assertTrue(visitor.containsColumn("v$tempfile", "ts#")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest11.java index a43f76e6be..fef32559fc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest11.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest11.java @@ -57,7 +57,11 @@ public class OracleBlockTest11 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - print(statementList); + + for (SQLStatement stmt : statementList) { + System.out.println(stmt); + System.out.println(); + } Assert.assertEquals(3, statementList.size()); @@ -80,6 +84,9 @@ public class OracleBlockTest11 extends OracleTest { Assert.assertEquals(4, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getConditions().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + Assert.assertTrue(visitor.containsColumn("employees", "*")); + Assert.assertTrue(visitor.containsColumn("emp", "employee_id")); + Assert.assertTrue(visitor.containsColumn("emp", "*")); + Assert.assertTrue(visitor.containsColumn("emp", "salary")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest22_comment.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest22_comment.java index b19c5b99ec..df4dfd28bd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest22_comment.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest22_comment.java @@ -72,10 +72,11 @@ public class OracleBlockTest22_comment extends OracleTest { assertTrue(visitor.getTables().containsKey(new TableStat.Name("USER_OBJECTS"))); - assertEquals(1, visitor.getColumns().size()); + assertEquals(2, visitor.getColumns().size()); assertEquals(1, visitor.getConditions().size()); assertEquals(0, visitor.getRelationships().size()); - assertTrue(visitor.getColumns().contains(new TableStat.Column("USER_OBJECTS", "OBJECT_TYPE"))); + assertTrue(visitor.containsColumn("USER_OBJECTS", "OBJECT_TYPE")); + assertTrue(visitor.containsColumn("USER_OBJECTS", "*")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreatePackageTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreatePackageTest0.java index 14b1c4469c..924691742d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreatePackageTest0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreatePackageTest0.java @@ -224,8 +224,12 @@ public class OracleCreatePackageTest0 extends OracleTest { Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(11, visitor.getColumns().size()); + Assert.assertEquals(5, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.containsColumn("employees", "employee_id")); + Assert.assertTrue(visitor.containsColumn("employees", "*")); + Assert.assertTrue(visitor.containsColumn("departments", "department_id")); + Assert.assertTrue(visitor.containsColumn("employees", "salary")); + Assert.assertTrue(visitor.containsColumn("employees", "commission_pct")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java index 24133425c1..b598753082 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java @@ -66,10 +66,11 @@ public class OracleCreateProcedureTest2 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("accounts"))); - Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getConditions().size()); Assert.assertEquals(0, visitor.getRelationships().size()); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + Assert.assertTrue(visitor.containsColumn("accounts", "balance")); + Assert.assertTrue(visitor.containsColumn("accounts", "account_id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest10.java index de0bf6849b..fefab14777 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest10.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest10.java @@ -56,7 +56,7 @@ public class OracleCreateTableTest10 extends OracleTest { Assert.assertEquals(21, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SYS.WRI$_OPTSTAT_HISTHEAD_HISTORY", "OBJ#"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + Assert.assertTrue(visitor.containsColumn("SYS.WRI$_OPTSTAT_HISTHEAD_HISTORY", "OBJ#")); + // Assert.assertTrue(visitor.containsColumn("pivot_table", "order_mode")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java index 066df80ff4..4e01e531a9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest18.java @@ -89,6 +89,6 @@ public class OracleCreateTableTest18 extends OracleTest { Assert.assertEquals(5, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SONAR.AUTHORS", "ID"))); + Assert.assertTrue(visitor.containsColumn("SONAR.AUTHORS", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java index 80642efb1b..911fb11cf4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest19.java @@ -117,6 +117,6 @@ public class OracleCreateTableTest19 extends OracleTest { Assert.assertEquals(4, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SONAR.ACTIVE_DASHBOARDS", "ID"))); + Assert.assertTrue(visitor.containsColumn("SONAR.ACTIVE_DASHBOARDS", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java index 9a36d992c7..bd9d67a80e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest20.java @@ -103,6 +103,6 @@ public class OracleCreateTableTest20 extends OracleTest { Assert.assertEquals(6, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SONAR.ACTIVE_RULE_NOTES", "ID"))); + Assert.assertTrue(visitor.containsColumn("SONAR.ACTIVE_RULE_NOTES", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest41.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest41.java index be79b62cfa..6dd1344383 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest41.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest41.java @@ -157,6 +157,6 @@ public class OracleCreateTableTest41 extends OracleTest { Assert.assertEquals(6, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "BLOB_COL"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "BLOB_COL")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest42.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest42.java index 484204716a..439c03d978 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest42.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest42.java @@ -97,6 +97,6 @@ public class OracleCreateTableTest42 extends OracleTest { Assert.assertEquals(6, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "GROUP_NAME"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "GROUP_NAME")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java index b77b255c05..e412c59971 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java @@ -102,6 +102,6 @@ public class OracleCreateTableTest43 extends OracleTest { Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "DNAME"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "DNAME")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest44.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest44.java index 053e65f9bd..d8b3b91ea4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest44.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest44.java @@ -152,6 +152,6 @@ public class OracleCreateTableTest44 extends OracleTest { Assert.assertEquals(11, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "PK1"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "PK1")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest45.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest45.java index e4ed60554c..4cfccc363c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest45.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest45.java @@ -98,6 +98,6 @@ public class OracleCreateTableTest45 extends OracleTest { Assert.assertEquals(9, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest46.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest46.java index 3c39f38f2b..d1b8ed898a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest46.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest46.java @@ -118,6 +118,6 @@ public class OracleCreateTableTest46 extends OracleTest { Assert.assertEquals(9, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest47.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest47.java index 2891160656..3e7c07f842 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest47.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest47.java @@ -147,6 +147,6 @@ public class OracleCreateTableTest47 extends OracleTest { Assert.assertEquals(12, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest48.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest48.java index 62d799ff99..8bb5fb3ad0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest48.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest48.java @@ -123,6 +123,6 @@ public class OracleCreateTableTest48 extends OracleTest { Assert.assertEquals(11, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest49.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest49.java index d16f4f10db..938643743b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest49.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest49.java @@ -254,6 +254,6 @@ public class OracleCreateTableTest49 extends OracleTest { Assert.assertEquals(44, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest5.java index 079ea6519e..fdd792cd66 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest5.java @@ -54,8 +54,8 @@ public class OracleCreateTableTest5 extends OracleTest { Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SYS.SYS_TEMP_0FD9D670A_93E068F3", "C0"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SYS.SYS_TEMP_0FD9D670A_93E068F3", "C1"))); + Assert.assertTrue(visitor.containsColumn("SYS.SYS_TEMP_0FD9D670A_93E068F3", "C0")); + Assert.assertTrue(visitor.containsColumn("SYS.SYS_TEMP_0FD9D670A_93E068F3", "C1")); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java index f24a50e88c..ccc3e1e90b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java @@ -298,6 +298,6 @@ public class OracleCreateTableTest50 extends OracleTest { Assert.assertEquals(58, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest51.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest51.java index 565444d7f5..4faeb096b1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest51.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest51.java @@ -83,6 +83,6 @@ public class OracleCreateTableTest51 extends OracleTest { Assert.assertEquals(3, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "A"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "A")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest52.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest52.java index 9ef4614008..4385782e54 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest52.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest52.java @@ -122,6 +122,6 @@ public class OracleCreateTableTest52 extends OracleTest { Assert.assertEquals(11, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest53.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest53.java index ae3dd7218b..8b2e91feb6 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest53.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest53.java @@ -126,6 +126,6 @@ public class OracleCreateTableTest53 extends OracleTest { Assert.assertEquals(13, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "RUNID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "RUNID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest54.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest54.java index e56b3a6e83..cead06d338 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest54.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest54.java @@ -89,6 +89,6 @@ public class OracleCreateTableTest54 extends OracleTest { Assert.assertEquals(6, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "LOAD"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "LOAD")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest55.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest55.java index 8dfbf2fd8e..63297b63d1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest55.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest55.java @@ -103,6 +103,6 @@ public class OracleCreateTableTest55 extends OracleTest { Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "I"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "I")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest56.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest56.java index 1099db2539..329cf2bc39 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest56.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest56.java @@ -120,6 +120,6 @@ public class OracleCreateTableTest56 extends OracleTest { Assert.assertEquals(10, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "SNAP_ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "SNAP_ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest57.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest57.java index 1f714fc92f..a9b2795d6f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest57.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest57.java @@ -199,6 +199,6 @@ public class OracleCreateTableTest57 extends OracleTest { Assert.assertEquals(58, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest58.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest58.java index 974e48e73d..5d92be1b34 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest58.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest58.java @@ -146,6 +146,6 @@ public class OracleCreateTableTest58 extends OracleTest { Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest59.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest59.java index 15661e477d..b49254c044 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest59.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest59.java @@ -101,6 +101,6 @@ public class OracleCreateTableTest59 extends OracleTest { Assert.assertEquals(9, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "CATEGORY_ROOT_DESC"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "CATEGORY_ROOT_DESC")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest6.java index 83aebf80df..1e90df5193 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest6.java @@ -53,8 +53,8 @@ public class OracleCreateTableTest6 extends OracleTest { Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SYS.SYS_TEMP_0FD9D66FD_93E068F3", "C0"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SYS.SYS_TEMP_0FD9D66FD_93E068F3", "C1"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + Assert.assertTrue(visitor.containsColumn("SYS.SYS_TEMP_0FD9D66FD_93E068F3", "C0")); + Assert.assertTrue(visitor.containsColumn("SYS.SYS_TEMP_0FD9D66FD_93E068F3", "C1")); + // Assert.assertTrue(visitor.containsColumn("pivot_table", "order_mode"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest60.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest60.java index c2145838df..6b086bf95b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest60.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest60.java @@ -90,6 +90,6 @@ public class OracleCreateTableTest60 extends OracleTest { Assert.assertEquals(5, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "MEMBER_ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "MEMBER_ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest61.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest61.java index 2021be2a45..4fb32a99ee 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest61.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest61.java @@ -165,6 +165,6 @@ public class OracleCreateTableTest61 extends OracleTest { Assert.assertEquals(17, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest62.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest62.java index 317105e2d0..ea37a2f667 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest62.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest62.java @@ -135,6 +135,6 @@ public class OracleCreateTableTest62 extends OracleTest { Assert.assertEquals(18, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "MEMBER_ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "MEMBER_ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest64.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest64.java index 3c86a68cde..ed79e9e37f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest64.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest64.java @@ -144,6 +144,6 @@ public class OracleCreateTableTest64 extends OracleTest { Assert.assertEquals(18, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "STOREID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "STOREID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest65.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest65.java index 2aef448d78..a9725e7ddb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest65.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest65.java @@ -145,6 +145,6 @@ public class OracleCreateTableTest65 extends OracleTest { Assert.assertEquals(18, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID_"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID_")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest66.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest66.java index 25a5e0d966..249b971e59 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest66.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest66.java @@ -392,6 +392,6 @@ public class OracleCreateTableTest66 extends OracleTest { Assert.assertEquals(52, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SC_001.TB_001", "ID"))); + Assert.assertTrue(visitor.containsColumn("SC_001.TB_001", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest68.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest68.java index 04db724715..ecfb1e1340 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest68.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest68.java @@ -88,6 +88,6 @@ public class OracleCreateTableTest68 extends OracleTest { assertEquals(3, visitor.getColumns().size()); - assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + assertTrue(visitor.containsColumn("JWGZPT.A", "XM")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest7.java index ea7f7827f8..cf6dc981ff 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest7.java @@ -55,10 +55,10 @@ public class OracleCreateTableTest7 extends OracleTest { Assert.assertEquals(4, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "C0"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "opcode"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "partno"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "rid"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + Assert.assertTrue(visitor.containsColumn("ALIBABA1949.SYS_JOURNAL_209051", "C0")); + Assert.assertTrue(visitor.containsColumn("ALIBABA1949.SYS_JOURNAL_209051", "opcode")); + Assert.assertTrue(visitor.containsColumn("ALIBABA1949.SYS_JOURNAL_209051", "partno")); + Assert.assertTrue(visitor.containsColumn("ALIBABA1949.SYS_JOURNAL_209051", "rid")); + // Assert.assertTrue(visitor.containsColumn("pivot_table", "order_mode"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest8.java index fe359daa95..1c11ae1ea7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest8.java @@ -63,9 +63,9 @@ public class OracleCreateTableTest8 extends OracleTest { Assert.assertEquals(3, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_NEW_CLUSTER_YZS_0210", "PRODUCT_ID"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_NEW_CLUSTER_YZS_0210", "NEW_CLUSTER_ID"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_NEW_CLUSTER_YZS_0210", "STATUS"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + Assert.assertTrue(visitor.containsColumn("PRODUCT_NEW_CLUSTER_YZS_0210", "PRODUCT_ID")); + Assert.assertTrue(visitor.containsColumn("PRODUCT_NEW_CLUSTER_YZS_0210", "NEW_CLUSTER_ID")); + Assert.assertTrue(visitor.containsColumn("PRODUCT_NEW_CLUSTER_YZS_0210", "STATUS")); + // Assert.assertTrue(visitor.containsColumn("pivot_table", "order_mode"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest9.java index 4222545566..52f6cbc6d2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest9.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest9.java @@ -58,13 +58,13 @@ public class OracleCreateTableTest9 extends OracleTest { Assert.assertEquals(4, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", "ID"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", - "dmltype$$"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", - "snapid"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", - "change_vector$$"))); + Assert.assertTrue(visitor.containsColumn("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", "ID")); + Assert.assertTrue(visitor.containsColumn("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", + "dmltype$$")); + Assert.assertTrue(visitor.containsColumn("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", + "snapid")); + Assert.assertTrue(visitor.containsColumn("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", + "change_vector$$")); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java index de3749955b..43f3326b2f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java @@ -97,8 +97,10 @@ public class OracleCreateViewTest4 extends OracleTest { Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(12, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("sys.V_$SESSION", "SID"))); + Assert.assertTrue(visitor.containsColumn("sys.V_$SESSION", "username")); + Assert.assertTrue(visitor.containsColumn("sys.V_$SESSION", "SID")); + Assert.assertTrue(visitor.containsColumn("sys.V_$SESSION", "row_wait_obj#")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest20_first.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest20_first.java index b39153f164..b5b72b9543 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest20_first.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest20_first.java @@ -75,13 +75,13 @@ public class OracleInsertTest20_first extends OracleTest { OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("relationships : " + visitor.getRelationships()); assertEquals(6, visitor.getTables().size()); - assertEquals(8, visitor.getColumns().size()); + assertEquals(7, visitor.getColumns().size()); assertTrue(visitor.getTables().containsKey(new TableStat.Name("orders"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest4.java index 1e6a5f9506..8340454bb8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest4.java @@ -89,7 +89,7 @@ public class OracleInsertTest4 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.user$"))); Assert.assertEquals(9, visitor.getTables().size()); - Assert.assertEquals(42, visitor.getColumns().size()); + Assert.assertEquals(36, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest6.java index 8cfe665f13..d016a6be84 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest6.java @@ -45,7 +45,7 @@ public class OracleInsertTest6 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); Assert.assertEquals(9, visitor.getTables().size()); - Assert.assertEquals(42, visitor.getColumns().size()); + Assert.assertEquals(36, visitor.getColumns().size()); // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("raises"))); // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest7.java index 2ca9b93904..2ca9863a18 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest7.java @@ -45,7 +45,7 @@ public class OracleInsertTest7 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); Assert.assertEquals(9, visitor.getTables().size()); - Assert.assertEquals(42, visitor.getColumns().size()); + Assert.assertEquals(36, visitor.getColumns().size()); // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("raises"))); // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest9.java index 8ad7a2a3d7..1c2d8a610c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest9.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/insert/OracleInsertTest9.java @@ -37,13 +37,14 @@ public class OracleInsertTest9 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); - print(statementList); + SQLStatement stmt = statementList.get(0); + + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); @@ -51,10 +52,10 @@ public class OracleInsertTest9 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(14, visitor.getColumns().size()); - - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ZFJ_EN_CLICK"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ZFJ_EN_CLICK_201202@!"))); +// Assert.assertEquals(14, visitor.getColumns().size()); +// +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ZFJ_EN_CLICK"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ZFJ_EN_CLICK_201202@!"))); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ZFJ_EN_CLICK", "P_M"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest11.java index d2476ce928..13c523e01c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest11.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest11.java @@ -69,7 +69,7 @@ public class OracleSelectTest11 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("IMAGE_REPOSITORY"))); - Assert.assertEquals(8, visitor.getColumns().size()); + Assert.assertEquals(17, visitor.getColumns().size()); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("IMAGE_REPOSITORY", "rowid"))); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("IMAGE_REPOSITORY", "COMPANY_ID"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest12.java index 996f985515..a1951ee7cc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest12.java @@ -37,13 +37,13 @@ public class OracleSelectTest12 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); @@ -51,14 +51,16 @@ public class OracleSelectTest12 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + assertEquals(1, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("BUSINESS_ORDER"))); + assertTrue(visitor.getTables().containsKey(new TableStat.Name("BUSINESS_ORDER"))); - Assert.assertEquals(4, visitor.getColumns().size()); + assertEquals(5, visitor.getColumns().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + assertTrue(visitor.containsColumn("BUSINESS_ORDER", "parent_id")); + assertTrue(visitor.containsColumn("BUSINESS_ORDER", "SELLER_SEQ")); + assertTrue(visitor.containsColumn("BUSINESS_ORDER", "order_from")); + assertTrue(visitor.containsColumn("BUSINESS_ORDER", "status")); + assertTrue(visitor.containsColumn("business_order", "ID")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest19.java index c5658dae9f..57df036f4e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest19.java @@ -61,10 +61,10 @@ public class OracleSelectTest19 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.dba_data_files"))); - Assert.assertEquals(18, visitor.getColumns().size()); + Assert.assertEquals(17, visitor.getColumns().size()); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + Assert.assertTrue(visitor.containsColumn("sys.dba_data_files", "file_name")); + Assert.assertTrue(visitor.containsColumn("v$datafile", "status")); + Assert.assertTrue(visitor.containsColumn("sys.dba_data_files", "tablespace_name")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest21.java index 83b99a52aa..62e33f0209 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest21.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest21.java @@ -76,7 +76,7 @@ public class OracleSelectTest21 extends OracleTest { Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "WAIT_CLASS"))); Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "EVENT_ID"))); - Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(8, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest22.java index 264ec91931..aff706374d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest22.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest22.java @@ -51,11 +51,8 @@ public class OracleSelectTest22 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY"))); - Assert.assertEquals(14, visitor.getColumns().size()); + Assert.assertEquals(15, visitor.getColumns().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW", "HT_TASK_TRADE_HISTORY.ID"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW", "HT_TASK_TRADE_HISTORY.GMT_MODIFIED"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW", "HT_TASK_TRADE_HISTORY.GMT_CREATE"))); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW", "ESCROW.HT_TASK_TRADE_HISTORY.TRADE_ID"))); + Assert.assertTrue(visitor.containsColumn("ESCROW.HT_TASK_TRADE_HISTORY", "*")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest24.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest24.java index 5879652d36..4e81cde2f0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest24.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest24.java @@ -54,7 +54,7 @@ public class OracleSelectTest24 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY"))); - Assert.assertEquals(4, visitor.getColumns().size()); + Assert.assertEquals(5, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.HT_TASK_TRADE_HISTORY", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest26.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest26.java index 2bb9e6717f..a1c4b13a7e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest26.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest26.java @@ -61,7 +61,7 @@ public class OracleSelectTest26 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("wl_wh_in"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("wl_wh_out"))); - Assert.assertEquals(21, visitor.getColumns().size()); + Assert.assertEquals(20, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest27.java index eedaf8abf2..60c513c437 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest27.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest27.java @@ -36,13 +36,14 @@ public class OracleSelectTest27 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); - print(statementList); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); stmt.accept(visitor); + System.out.println(stmt.toString()); + System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); System.out.println("coditions : " + visitor.getConditions()); @@ -55,10 +56,10 @@ public class OracleSelectTest27 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("search.retl_table_config_search"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.col$"))); - Assert.assertEquals(19, visitor.getColumns().size()); + Assert.assertEquals(18, visitor.getColumns().size()); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + Assert.assertTrue(visitor.containsColumn("search.retl_table_config_search", "tid")); + Assert.assertTrue(visitor.containsColumn("dba_objects", "owner")); + Assert.assertTrue(visitor.containsColumn("search.retl_table_config_search", "TSCHEMA")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest31.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest31.java index e5e5d1ded2..9871dd6d93 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest31.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest31.java @@ -38,13 +38,14 @@ public class OracleSelectTest31 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); - print(statementList); + SQLStatement stmt = statementList.get(0); + + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java index c2d60fed85..15ab020a10 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java @@ -52,6 +52,8 @@ public class OracleSelectTest38 extends OracleTest { List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); +// System.out.println(stmt.toString()); + { String result = SQLUtils.toOracleString(stmt); Assert.assertEquals("SELECT *\n" + @@ -153,6 +155,8 @@ public class OracleSelectTest38 extends OracleTest { Assert.assertEquals(1, statementList.size()); + System.out.println(stmt); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); stmt.accept(visitor); @@ -166,10 +170,11 @@ public class OracleSelectTest38 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("acduser.vw_acd_info"))); - Assert.assertEquals(12, visitor.getColumns().size()); + Assert.assertEquals(18, visitor.getColumns().size()); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "sglx"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_sc_kreis_code_lv2", "kreis_code"))); // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest40.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest40.java index f00c6203dd..d7cea37c57 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest40.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest40.java @@ -30,7 +30,7 @@ public class OracleSelectTest40 extends OracleTest { String sql = // "WITH a AS (" + // " SELECT to_char(csl.create_time,'yyyyMMdd') create_time, cwl.client_key ck, csl.src_id src_id " + // - " FROM xxxx csl, xxxx cwl " + // + " FROM t0 csl, t1 cwl " + // " WHERE 1 =1 AND csl.src_id = cwl.src_id AND csl.curr_url = cwl.curr_url " + // " AND to_char(csl.create_time,'yyyyMMdd') BETWEEN ? " + // " AND ? AND cwl.day = to_char(csl.create_time,'yyyyMMdd') " + // @@ -38,7 +38,7 @@ public class OracleSelectTest40 extends OracleTest { ", b AS (" + // " SELECT itn.buyerpaytime, itn.esc_orderid, itn.oldck, " + // " MAX(con.PAYED_AMOUNT) gmv, MAX(con.buyer_onlyid) buyer " + // - " FROM xxxx itn, xxxx don, xxxx con " + // + " FROM t01 itn, t02 don, t03 con " + // " WHERE don.esc_orderid = itn.esc_orderid " + // " AND con.esc_orderid = itn.esc_orderid " + // " AND don.order_status IN (4,5,6,7,8) AND itn.buyerpaytime BETWEEN ? AND ? " + // @@ -65,9 +65,9 @@ public class OracleSelectTest40 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(6, visitor.getTables().size()); - Assert.assertEquals(15, visitor.getColumns().size()); + Assert.assertEquals(19, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest41.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest41.java index 4814146ab8..09199d74f2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest41.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest41.java @@ -72,9 +72,9 @@ public class OracleSelectTest41 extends OracleTest { Assert.assertEquals(4, visitor.getTables().size()); - Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(8, visitor.getColumns().size()); - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + assertTrue(visitor.containsColumn("AA", "USERID")); // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest50.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest50.java index 86867e8abd..6a49e5ebbd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest50.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest50.java @@ -49,7 +49,7 @@ public class OracleSelectTest50 extends OracleTest { Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(20, visitor.getColumns().size()); + Assert.assertEquals(19, visitor.getColumns().size()); String text = TestUtils.outputOracle(stmt); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest57.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest57.java index 8541674977..4cf8e02fc2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest57.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest57.java @@ -52,7 +52,7 @@ public class OracleSelectTest57 extends OracleTest { Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getColumns().size()); { String text = SQLUtils.toOracleString(stmt); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java index 421998c30c..0bdc8dab46 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java @@ -81,7 +81,7 @@ public class OracleSelectTest64_with_recursive extends OracleTest { "\t\tWHERE parent_id IS NULL\n" + "\t\tUNION ALL\n" + "\t\t-- Recursive member.\n" + - "\t\tSELECT t2.id, t2.parent_id, lvl + 1\n" + + "\t\tSELECT t2.id, t2.parent_id, t1.lvl + 1\n" + "\t\tFROM tab1 t2, t1\n" + "\t\tWHERE t2.parent_id = t1.id\n" + "\t)\n" + @@ -103,7 +103,7 @@ public class OracleSelectTest64_with_recursive extends OracleTest { "\t\twhere parent_id is null\n" + "\t\tunion all\n" + "\t\t-- Recursive member.\n" + - "\t\tselect t2.id, t2.parent_id, lvl + 1\n" + + "\t\tselect t2.id, t2.parent_id, t1.lvl + 1\n" + "\t\tfrom tab1 t2, t1\n" + "\t\twhere t2.parent_id = t1.id\n" + "\t)\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest68.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest68.java index 69f7d3fca0..39fa6e2093 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest68.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest68.java @@ -48,7 +48,7 @@ public class OracleSelectTest68 extends OracleTest { Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertEquals(10, visitor.getColumns().size()); +// Assert.assertEquals(10, visitor.getColumns().size()); { String text = SQLUtils.toOracleString(stmt); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java index 27638869bb..fa89d7996a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java @@ -65,7 +65,7 @@ public class OracleSelectTest71 extends OracleTest { assertEquals(5, visitor.getTables().size()); - assertEquals(26, visitor.getColumns().size()); + assertEquals(24, visitor.getColumns().size()); { String text = SQLUtils.toOracleString(stmt); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest74_translate.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest74_translate.java index beb7ff8f81..59e90f2a92 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest74_translate.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest74_translate.java @@ -28,11 +28,11 @@ public class OracleSelectTest74_translate extends OracleTest { public void test_0() throws Exception { String sql = // - "SELECT TRANSLATE(SUBSTR(TRIM(E.BZ)||\n" + - " TRIM(I.BZ)||\n" + - " TRIM(H.MC)||\n" + - " TRIM(A.MLPH)||\n" + - " TRIM(A.MLXZ),1,35)\n" + + "SELECT TRANSLATE(SUBSTR(TRIM(T.BZ)||\n" + + " TRIM(T.BZ)||\n" + + " TRIM(T.MC)||\n" + + " TRIM(T.MLPH)||\n" + + " TRIM(T.MLXZ),1,35)\n" + " USING CHAR_CS) FROM T"; // OracleStatementParser parser = new OracleStatementParser(sql); @@ -53,12 +53,12 @@ public class OracleSelectTest74_translate extends OracleTest { assertEquals(1, visitor.getTables().size()); - assertEquals(5, visitor.getColumns().size()); + assertEquals(4, visitor.getColumns().size()); { String text = SQLUtils.toOracleString(stmt); - assertEquals("SELECT TRANSLATE(SUBSTR(TRIM(E.BZ) || TRIM(I.BZ) || TRIM(H.MC) || TRIM(A.MLPH) || TRIM(A.MLXZ), 1, 35) USING CHAR_CS)\n" + + assertEquals("SELECT TRANSLATE(SUBSTR(TRIM(T.BZ) || TRIM(T.BZ) || TRIM(T.MC) || TRIM(T.MLPH) || TRIM(T.MLXZ), 1, 35) USING CHAR_CS)\n" + "FROM T", text); } // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest75_comment.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest75_comment.java index d1c5077695..caea7141f7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest75_comment.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest75_comment.java @@ -51,7 +51,7 @@ public class OracleSelectTest75_comment extends OracleTest { assertEquals(1, visitor.getTables().size()); - assertEquals(2, visitor.getColumns().size()); +// assertEquals(2, visitor.getColumns().size()); { String text = SQLUtils.toOracleString(stmt); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest9.java index 3fe42dad31..72521e3de8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest9.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest9.java @@ -38,13 +38,13 @@ public class OracleSelectTest9 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); print(statementList); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_dblink.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_dblink.java index 3142e4dec3..1e029c05d8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_dblink.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleOutputVisitorTest_dblink.java @@ -44,7 +44,7 @@ public class OracleOutputVisitorTest_dblink extends TestCase { Assert.assertEquals(true, visitor.containsTable("master@emp")); Assert.assertEquals(1, visitor.getColumns().size()); - Assert.assertEquals(true, visitor.getColumns().contains(new Column("master@emp", "salary"))); + Assert.assertEquals(true, visitor.containsColumn("master@emp", "salary")); StringBuilder buf = new StringBuilder(); OracleOutputVisitor outputVisitor = new OracleOutputVisitor(buf); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleSchemaStatVisitorTest_Subquery.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleSchemaStatVisitorTest_Subquery.java index be8de502b6..a2abd74830 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleSchemaStatVisitorTest_Subquery.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleSchemaStatVisitorTest_Subquery.java @@ -28,7 +28,7 @@ import com.alibaba.druid.stat.TableStat.Column; public class OracleSchemaStatVisitorTest_Subquery extends TestCase { public void test_0() throws Exception { - String sql = "SELECT id2, name2 FROM (select id, name from users where ROWNUM < 10) a"; + String sql = "SELECT id, name FROM (select id, name from users where ROWNUM < 10) a"; OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest5.java index 64e7777231..979d7cdf99 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest5.java @@ -32,13 +32,15 @@ public class PGDeleteTest5 extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); + System.out.println(stmt); + Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest6.java index 2e33b25f1c..1a1b839820 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest6.java @@ -40,19 +40,21 @@ public class PGDeleteTest6 extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); + System.out.println(stmt); + Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); + System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products_log"))); Assert.assertTrue(visitor.getColumns().size() == 1); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest8.java index f3d5be509c..cedc637692 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest8.java @@ -40,25 +40,25 @@ public class PGDeleteTest8 extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); -// print(statementList); + SQLStatement stmt = statementList.get(0); - Assert.assertEquals(1, statementList.size()); + System.out.println(stmt); + + assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("parts"))); + assertTrue(visitor.getTables().containsKey(new TableStat.Name("parts"))); - Assert.assertTrue(visitor.getColumns().size() == 3); + assertEquals(2, visitor.getColumns().size() ); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("parts", "sub_part"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("parts", "sub_part"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("parts", "part"))); + assertTrue(visitor.containsColumn("parts", "sub_part")); + assertTrue(visitor.containsColumn("parts", "sub_part")); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest2.java index 9182ffb9a6..e6bd0bf819 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGInsertTest2.java @@ -42,8 +42,8 @@ public class PGInsertTest2 extends PGTest { PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); statemen.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("films"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java index 222a048c78..dfa1e8fd44 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java @@ -34,5 +34,7 @@ public class PGAlterTableAddUnique0 extends PGTest { Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); Assert.assertTrue(visitor.getColumns().size() == 1); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("products", "product_no"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest.java index 8e3082de16..3a4f01f7ee 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest.java @@ -40,20 +40,22 @@ public class PGSelectTest extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); + System.out.println(stmt); + Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); String mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.POSTGRESQL); System.out.println(mergedSql); @@ -64,20 +66,20 @@ public class PGSelectTest extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // System.out.println("Tables : " + visitor.getTables()); // System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); String mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.POSTGRESQL); System.out.println(mergedSql); @@ -88,20 +90,20 @@ public class PGSelectTest extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // System.out.println("Tables : " + visitor.getTables()); // System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); String mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.POSTGRESQL); System.out.println(mergedSql); @@ -125,7 +127,7 @@ public class PGSelectTest extends PGTest { // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); String mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.POSTGRESQL); System.out.println(mergedSql); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest14.java index f90a2db515..1a5702b3a3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest14.java @@ -52,7 +52,7 @@ public class PGSelectTest14 extends PGTest { System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - assertEquals(4, visitor.getColumns().size()); + assertEquals(3, visitor.getColumns().size()); assertEquals(1, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest15.java index 67ee600b9d..b87e2df3cf 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest15.java @@ -62,7 +62,7 @@ public class PGSelectTest15 extends PGTest { System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest16.java index 1b6750b692..35528a09a0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest16.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest16.java @@ -44,19 +44,20 @@ public class PGSelectTest16 extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); -// print(statementList); + SQLStatement stmt = statementList.get(0); + + System.out.println(stmt); assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - assertEquals(7, visitor.getColumns().size()); + assertEquals(3, visitor.getColumns().size()); assertEquals(1, visitor.getTables().size()); assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "id"))); @@ -66,8 +67,6 @@ public class PGSelectTest16 extends PGTest { // assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "path"))); // assertTrue(visitor.getColumns().contains(new TableStat.Column("search_graph", "link"))); // assertTrue(visitor.getColumns().contains(new TableStat.Column("graph", "cycle"))); - assertTrue(visitor.getColumns().contains(new TableStat.Column("sg", "depth"))); - assertTrue(visitor.getColumns().contains(new TableStat.Column("sg", "link"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest17.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest17.java index 51f0f09c44..609e43cddb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest17.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest17.java @@ -55,7 +55,7 @@ public class PGSelectTest17 extends PGTest { System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(5, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest18.java index 920940ca13..dd820bf09c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest18.java @@ -68,8 +68,8 @@ public class PGSelectTest18 extends PGTest { PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); Assert.assertEquals(0, visitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest4.java index 9d798a8bce..62bd6b4a3b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest4.java @@ -35,19 +35,19 @@ public class PGSelectTest4 extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); // print(statementList); Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // System.out.println("Tables : " + visitor.getTables()); // System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getTables().size()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest42.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest42.java index 42bd81a97f..f7267fc9a5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest42.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest42.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; import org.junit.Assert; import java.util.List; @@ -50,11 +51,15 @@ public class PGSelectTest42 extends PGTest { PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(4, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getColumns().size()); Assert.assertEquals(2, visitor.getTables().size()); + + assertTrue(visitor.containsColumn("sys_account", "online")); + assertTrue(visitor.containsColumn("sys_account", "id")); + assertTrue(visitor.containsColumn("auto_handler_online", "account_id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest50.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest50.java index f3ca08d87b..5ee0df0839 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest50.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest50.java @@ -77,11 +77,15 @@ public class PGSelectTest50 extends TestCase { SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - assertEquals(4, visitor.getColumns().size()); + assertEquals(3, visitor.getColumns().size()); assertEquals(2, visitor.getTables().size()); + + assertTrue(visitor.containsColumn("itsm_system_role_menu", "menu_id")); + assertTrue(visitor.containsColumn("itsm_system_menu", "menu_id")); + assertTrue(visitor.containsColumn("itsm_system_menu", "parent_id")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest54.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest54.java index ade73e7067..e97cabc3d9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest54.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest54.java @@ -51,8 +51,8 @@ public class PGSelectTest54 extends TestCase { SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType); stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); assertEquals(14, visitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest6.java index 327591732a..929ebad8cb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest6.java @@ -50,7 +50,7 @@ public class PGSelectTest6 extends PGTest { // System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(4, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getTables().size()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest7.java index 1465291011..ff0a037ac4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest7.java @@ -56,7 +56,7 @@ public class PGSelectTest7 extends PGTest { // System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(20, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest8.java index 026a6d50d0..5c3bd28acb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest8.java @@ -35,19 +35,20 @@ public class PGSelectTest8 extends PGTest { PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); -// print(statementList); + SQLStatement stmt = statementList.get(0); + +// System.out.println(stmt); Assert.assertEquals(1, statementList.size()); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // System.out.println("Tables : " + visitor.getTables()); // System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); - Assert.assertEquals(8, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest12.java index 9cdcde9e92..1c5e66cfdd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest12.java @@ -50,7 +50,7 @@ public class SchemaStatTest12 extends TestCase { System.out.println(statVisitor.getConditions()); assertEquals(3, relationships.size()); - Assert.assertEquals(21, statVisitor.getColumns().size()); + Assert.assertEquals(22, statVisitor.getColumns().size()); Assert.assertEquals(20, statVisitor.getConditions().size()); assertEquals(1, statVisitor.getFunctions().size()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest3.java index fee4cea778..37c9bf2a4b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest3.java @@ -20,11 +20,12 @@ public class SchemaStatTest3 extends TestCase { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); SQLStatement stmt = parser.parseStatementList().get(0); - SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType); - stmt.accept(statVisitor); + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType); + stmt.accept(visitor); - System.out.println(statVisitor.getColumns()); + System.out.println(visitor.getColumns()); - Assert.assertEquals(0, statVisitor.getColumns().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertTrue(visitor.containsColumn("t", "*")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlite/SQLite_SelectTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlite/SQLite_SelectTest_0.java index 1f70509232..625f28fc7a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlite/SQLite_SelectTest_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlite/SQLite_SelectTest_0.java @@ -35,16 +35,16 @@ public class SQLite_SelectTest_0 extends MysqlTest { String sql = "select first_name, last_name from mytable limit 3, 4"; List statementList = SQLUtils.parseStatements(sql, JdbcConstants.SQLITE); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); print(statementList); Assert.assertEquals(1, statementList.size()); SchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_1.java index ab11e86f99..c21a0fa0c4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_1.java @@ -64,9 +64,9 @@ public class SQLServerCreateTableTest_1 extends TestCase { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("projects"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("projects", "id"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("projects", "name"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("projects", "enabled"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("projects", "scope"))); + Assert.assertTrue(visitor.containsColumn("projects", "id")); + Assert.assertTrue(visitor.containsColumn("projects", "name")); + Assert.assertTrue(visitor.containsColumn("projects", "enabled")); + Assert.assertTrue(visitor.containsColumn("projects", "scope")); } }