diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java b/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java index 51c8867c59..d89c44253a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java @@ -26,7 +26,7 @@ public class SQLOver extends SQLObjectImpl { protected SQLOrderBy orderBy; // for db2 - protected SQLExpr of; + protected SQLName of; protected SQLExpr windowing; protected WindowingType windowingType = WindowingType.ROWS; @@ -71,11 +71,11 @@ public class SQLOver extends SQLObjectImpl { this.orderBy = orderBy; } - public SQLExpr getOf() { + public SQLName getOf() { return of; } - public void setOf(SQLExpr of) { + public void setOf(SQLName of) { if (of != null) { of.setParent(this); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index 9776cd858a..b73e1583e9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -133,7 +133,9 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.arguments); + acceptChild(visitor, this.keep); acceptChild(visitor, this.over); + acceptChild(visitor, this.withinGroup); } visitor.endVisit(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 4d84009076..a0c8816a41 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 @@ -22,12 +22,12 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FnvHash; public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { - protected String name; - private transient String lowerName; - private transient long hashCode64; + protected String name; + private String lowerName; + private long hashCode64; - private transient SQLObject resolvedColumn; - private transient SQLObject resolvedOwnerObject; + private SQLObject resolvedColumn; + private SQLObject resolvedOwnerObject; public SQLIdentifierExpr(){ @@ -125,6 +125,10 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { return null; } + public SQLObject getResolvedColumnObject() { + return resolvedColumn; + } + public void setResolvedColumn(SQLColumnDefinition resolvedColumn) { this.resolvedColumn = resolvedColumn; } 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 a863b77549..6a6ac7b228 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 @@ -29,7 +29,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { private transient long hashCode64; private transient SQLColumnDefinition resolvedColumn; - private transient SQLObject resolvedTableSource; + private transient SQLObject resolvedOwnerObject; public SQLPropertyExpr(String owner, String name){ this(new SQLIdentifierExpr(owner), name); @@ -119,7 +119,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { } else if (owner == null){ hash = FnvHash.BASIC; } else { - hash = FnvHash.fnv_64_lower(owner.toString()); + hash = FnvHash.fnv1a_64_lower(owner.toString()); hash ^= '.'; hash *= FnvHash.PRIME; @@ -170,7 +170,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { x.hashCode64 = hashCode64; x.resolvedColumn = resolvedColumn; - x.resolvedTableSource = resolvedTableSource; + x.resolvedOwnerObject = resolvedOwnerObject; return x; } @@ -214,41 +214,45 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { } public SQLTableSource getResolvedTableSource() { - if (resolvedTableSource instanceof SQLTableSource) { - return (SQLTableSource) resolvedTableSource; + if (resolvedOwnerObject instanceof SQLTableSource) { + return (SQLTableSource) resolvedOwnerObject; } return null; } public void setResolvedTableSource(SQLTableSource resolvedTableSource) { - this.resolvedTableSource = resolvedTableSource; + this.resolvedOwnerObject = resolvedTableSource; } public void setResolvedProcedure(SQLCreateProcedureStatement stmt) { - this.resolvedTableSource = stmt; + this.resolvedOwnerObject = stmt; } public void setResolvedOwnerObject(SQLObject resolvedOwnerObject) { - this.resolvedTableSource = resolvedOwnerObject; + this.resolvedOwnerObject = resolvedOwnerObject; } public SQLCreateProcedureStatement getResolvedProcudure() { - if (this.resolvedTableSource instanceof SQLCreateProcedureStatement) { - return (SQLCreateProcedureStatement) this.resolvedTableSource; + if (this.resolvedOwnerObject instanceof SQLCreateProcedureStatement) { + return (SQLCreateProcedureStatement) this.resolvedOwnerObject; } return null; } + public SQLObject getResolvedOwnerObject() { + return resolvedOwnerObject; + } + public SQLDataType computeDataType() { if (resolvedColumn != null) { 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/statement/SQLExprTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java index 3e59fc7c8b..8fe274feff 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 @@ -32,7 +32,6 @@ public class SQLExprTableSource extends SQLTableSourceImpl { protected SQLExpr expr; private List partitions; - private SchemaObject schemaObject; public SQLExprTableSource(){ 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 41ab8bbb68..c80de2de4d 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 @@ -50,7 +50,10 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery protected SQLLimit limit; // for oracle - protected List forUpdateOf; + protected List forUpdateOf; + + protected List distributeBy; + protected List sortBy; public SQLSelectQueryBlock(){ @@ -308,6 +311,14 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery this.noCycle = noCycle; } + public List getDistributeBy() { + return distributeBy; + } + + public List getSortBy() { + return sortBy; + } + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { @@ -500,7 +511,7 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return null; } - public boolean selectItemHashAllColumn() { + public boolean selectItemHasAllColumn() { for (SQLSelectItem item : this.selectList) { SQLExpr expr = item.getExpr(); @@ -512,7 +523,7 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery SQLSelect subSelect = ((SQLSubqueryTableSource) from).select; SQLSelectQueryBlock queryBlock = subSelect.getQueryBlock(); if (queryBlock != null) { - return queryBlock.selectItemHashAllColumn(); + return queryBlock.selectItemHasAllColumn(); } } return true; @@ -522,6 +533,23 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return false; } + public SQLSelectItem findAllColumnSelectItem() { + SQLSelectItem allColumnItem = null; + for (SQLSelectItem item : this.selectList) { + SQLExpr expr = item.getExpr(); + + boolean allColumn = expr instanceof SQLAllColumnExpr + || (expr instanceof SQLPropertyExpr && ((SQLPropertyExpr) expr).getName().equals("*")); + + if (allColumnItem != null) { + return null; // duplicateAllColumn + } + allColumnItem = item; + } + + return allColumnItem; + } + public SQLColumnDefinition findColumn(String columnName) { if (from == null) { return null; 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 e0509458d0..6331e58b5e 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 @@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceable { + protected SQLWithSubqueryClause with; // for pg protected final List items = new ArrayList(); protected SQLExpr where; @@ -161,4 +162,15 @@ public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceab } this.orderBy = orderBy; } + + 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/SQLWithSubqueryClause.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java index 432d549649..cf21d3a0bf 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 @@ -132,6 +132,15 @@ public class SQLWithSubqueryClause extends SQLObjectImpl { return this; } } + + if (subQuery != null) { + SQLSelectQueryBlock queryBlock = subQuery.getFirstQueryBlock(); + if (queryBlock != null) { + if (queryBlock.findSelectItem(columnNameHash) != null) { + return this; + } + } + } return null; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java index 4790a8fc60..de4ce926bd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java @@ -36,10 +36,10 @@ public class DB2ExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM", "ROW_NUMBER", "ROWNUMBER" }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index f8fa1a3c8d..da6c781729 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -63,10 +63,10 @@ public class MySqlExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "GROUP_CONCAT", "MAX", "MIN", "STDDEV", "SUM" }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } 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 2d0a504241..76b66a766c 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 @@ -69,9 +69,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS repository.resolve(x); } - setAliasMap(); - getAliasMap().put("DUAL", null); - return true; } @@ -87,8 +84,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS repository.resolve(x); } - setAliasMap(); - setMode(x, Mode.Delete); accept(x.getFrom()); @@ -96,10 +91,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS x.getTableSource().accept(this); if (x.getTableSource() instanceof SQLExprTableSource) { - SQLName tableName = (SQLName) ((SQLExprTableSource) x.getTableSource()).getExpr(); - String ident = tableName.toString(); - - TableStat stat = this.getTableStat(ident); + TableStat stat = this.getTableStat(x.getExprTableSource()); stat.incrementDeleteCount(); } @@ -112,7 +104,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } public void endVisit(MySqlDeleteStatement x) { - setAliasMap(null); } @Override @@ -129,27 +120,10 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS setMode(x, Mode.Insert); - setAliasMap(); + TableStat stat = getTableStat(x.getTableSource()); - SQLName tableName = x.getTableName(); - - String ident = null; - if (tableName instanceof SQLIdentifierExpr) { - ident = ((SQLIdentifierExpr) tableName).getName(); - } else if (tableName instanceof SQLPropertyExpr) { - SQLPropertyExpr propertyExpr = (SQLPropertyExpr) tableName; - if (propertyExpr.getOwner() instanceof SQLIdentifierExpr) { - ident = propertyExpr.toString(); - } - } - - if (ident != null) { - TableStat stat = getTableStat(ident); + if (stat != null) { stat.incrementInsertCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, x.getAlias(), ident); - putAliasMap(aliasMap, ident, ident); } accept(x.getColumns()); @@ -299,26 +273,12 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS setMode(x, Mode.Replace); - setAliasMap(); - SQLName tableName = x.getTableName(); - String ident = null; - if (tableName instanceof SQLIdentifierExpr) { - ident = ((SQLIdentifierExpr) tableName).getName(); - } else if (tableName instanceof SQLPropertyExpr) { - SQLPropertyExpr propertyExpr = (SQLPropertyExpr) tableName; - if (propertyExpr.getOwner() instanceof SQLIdentifierExpr) { - ident = propertyExpr.toString(); - } - } + TableStat stat = getTableStat(tableName); - if (ident != null) { - TableStat stat = getTableStat(ident); + if (stat != null) { stat.incrementInsertCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, ident, ident); } accept(x.getColumns()); @@ -480,7 +440,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS SQLName tableName = x.getTableName(); if (tableName != null) { String table = tableName.toString(); - getTableStat(table); + getTableStat(tableName); SQLName columnName = x.getColumnName(); if (columnName != null) { @@ -1217,12 +1177,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlDeclareStatement x) { - for (SQLDeclareItem item : x.getVarList()) { - SQLName var = (SQLName) item.getName(); - this.variants.put(var.toString(), var); - } - - return false; + return true; } @Override @@ -1355,4 +1310,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlFlushStatement x) { } + + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java index a8c7bffbb0..6b2f87b3e5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java @@ -35,11 +35,9 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { protected List hints; - protected List distributeBy = new ArrayList(); - protected List sortBy = new ArrayList(2); - public OdpsSelectQueryBlock(){ - + distributeBy = new ArrayList(); + sortBy = new ArrayList(2); } public SQLOrderBy getOrderBy() { @@ -50,13 +48,7 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { this.orderBy = orderBy; } - public List getDistributeBy() { - return distributeBy; - } - public List getSortBy() { - return sortBy; - } @Override public int hashCode() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java index 3e68e15634..15d4677c3f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java @@ -46,10 +46,10 @@ public class OdpsExprParser extends SQLExprParser { "ROW_NUMBER", "WM_CONCAT"// }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } 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 5c3193ee33..4c68e05500 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 @@ -64,20 +64,14 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV public boolean visit(OdpsInsert x) { setMode(x, TableStat.Mode.Insert); - setAliasMap(); - SQLExprTableSource tableSource = x.getTableSource(); SQLExpr tableName = tableSource.getExpr(); if (tableName instanceof SQLName) { String ident = ((SQLName) tableName).toString(); - - TableStat stat = getTableStat(ident); + TableStat stat = getTableStat(tableName); stat.incrementInsertCount(); - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, tableSource.getAlias(), ident); - putAliasMap(aliasMap, ident, ident); } for (SQLAssignItem partition : x.getPartitions()) { @@ -289,11 +283,6 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV @Override public boolean visit(OdpsValuesTableSource x) { - Map aliasMap = getAliasMap(); - if (aliasMap != null && x.getAlias() != null) { - putAliasMap(aliasMap, x.getAlias(), null); - addSubQuery(x.getAlias(), x); - } return false; } } 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 3a7e3fee2b..770a008c65 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 @@ -143,7 +143,7 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr } else if (expr == null){ hash = FnvHash.BASIC; } else { - hash = FnvHash.fnv_64_lower(expr.toString()); + hash = FnvHash.fnv1a_64_lower(expr.toString()); hash ^= '.'; hash *= FnvHash.PRIME; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 42c93af979..cd90bec0a0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -111,10 +111,10 @@ public class OracleExprParser extends SQLExprParser { "VARIANCE", // "WM_CONCAT" }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } 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 b0c9d723b8..719ae7bd51 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.FnvConstants; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.JdbcUtils; @@ -74,10 +75,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public OracleSchemaStatVisitor(List 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); } protected Column getColumn(SQLExpr expr) { @@ -90,42 +87,25 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public boolean visit(OracleSelectTableReference x) { SQLExpr expr = x.getExpr(); - - if (expr instanceof SQLMethodInvokeExpr) { - SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) expr; - if ("TABLE".equalsIgnoreCase(methodInvoke.getMethodName()) && methodInvoke.getParameters().size() == 1) { - expr = methodInvoke.getParameters().get(0); - } - } - - Map aliasMap = getAliasMap(); + TableStat stat = getTableStat(x); if (expr instanceof SQLName) { - String ident; + if (((SQLName) expr).nameHashCode64() == FnvConstants.DUAL) { + return false; + } + if (expr instanceof SQLPropertyExpr) { - String owner = ((SQLPropertyExpr) expr).getOwner().toString(); - String name = ((SQLPropertyExpr) expr).getName(); - - if (aliasMap.containsKey(owner)) { - owner = aliasMap.get(owner); + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; + if (isSubQueryOrParamOrVariant(propertyExpr)) { + return false; + } + } else if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; + if (isSubQueryOrParamOrVariant(identifierExpr)) { + return false; } - ident = owner + "." + name; - } else { - ident = expr.toString(); } - if (containsSubQuery(ident)) { - return false; - } - - if ("DUAL".equalsIgnoreCase(ident)) { - return false; - } - - x.putAttribute(ATTR_TABLE, ident); - - TableStat stat = getTableStat(ident); - Mode mode = getMode(); switch (mode) { case Delete: @@ -147,23 +127,15 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle break; } - putAliasMap(aliasMap, x.getAlias(), ident); - putAliasMap(aliasMap, ident, ident); return false; } - accept(x.getExpr()); + // accept(x.getExpr()); return false; } public void endVisit(SQLSelect x) { - if (x.getQuery() != null) { - String table = (String) x.getQuery().getAttribute(ATTR_TABLE); - if (table != null) { - x.putAttribute(ATTR_TABLE, table); - } - } } public boolean visit(OracleUpdateStatement x) { @@ -172,7 +144,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle repository.resolve(x); } - setAliasMap(); setMode(x, Mode.Update); SQLTableSource tableSource = x.getTableSource(); @@ -187,10 +158,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle TableStat stat = getTableStat(ident); stat.incrementUpdateCount(); - - Map aliasMap = getAliasMap(); - aliasMap.put(ident, ident); - aliasMap.put(tableSource.getAlias(), ident); } else { tableSource.accept(this); } @@ -220,9 +187,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } } - visit((SQLSelectQueryBlock) x); - - return true; + return visit((SQLSelectQueryBlock) x); } public void endVisit(OracleSelectQueryBlock x) { @@ -366,29 +331,29 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleSelectJoin x) { super.visit(x); - - for (SQLExpr item : x.getUsing()) { - if (item instanceof SQLIdentifierExpr) { - String columnName = ((SQLIdentifierExpr) item).getName(); - String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); - String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); - if (leftTable != null && rightTable != null) { - Relationship relationship = new Relationship(); - relationship.setLeft(new Column(leftTable, columnName)); - relationship.setRight(new Column(rightTable, columnName)); - relationship.setOperator("USING"); - relationships.add(relationship); - } - - if (leftTable != null) { - addColumn(leftTable, columnName); - } - - if (rightTable != null) { - addColumn(rightTable, columnName); - } - } - } +// +// for (SQLExpr item : x.getUsing()) { +// if (item instanceof SQLIdentifierExpr) { +// String columnName = ((SQLIdentifierExpr) item).getName(); +// String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); +// String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); +// if (leftTable != null && rightTable != null) { +// Relationship relationship = new Relationship(); +// relationship.setLeft(new Column(leftTable, columnName)); +// relationship.setRight(new Column(rightTable, columnName)); +// relationship.setOperator("USING"); +// relationships.add(relationship); +// } +// +// if (leftTable != null) { +// addColumn(leftTable, columnName); +// } +// +// if (rightTable != null) { +// addColumn(rightTable, columnName); +// } +// } +// } return false; } @@ -422,18 +387,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle accept(x.getSelect()); accept(x.getPivot()); accept(x.getFlashback()); - - String table = (String) x.getSelect().getAttribute(ATTR_TABLE); - if (x.getAlias() != null) { - if (table != null) { - this.aliasMap.put(x.getAlias(), table); - } - addSubQuery(x.getAlias(), x.getSelect()); - } - - if (table != null) { - x.putAttribute(ATTR_TABLE, table); - } return false; } @@ -471,15 +424,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleWithSubqueryEntry x) { - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - String alias = x.getAlias(); - - if (alias != null) { - putAliasMap(aliasMap, alias, null); - addSubQuery(alias, x.getSubQuery()); - } - } x.getSubQuery().accept(this); return false; } @@ -701,14 +645,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle TableStat stat = getTableStat(ident); stat.incrementInsertCount(); - - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - if (x.getAlias() != null) { - putAliasMap(aliasMap, x.getAlias(), ident); - } - putAliasMap(aliasMap, ident, ident); - } } accept(x.getColumns()); @@ -734,8 +670,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle x.putAttribute("_original_use_mode", getMode()); setMode(x, Mode.Insert); - setAliasMap(); - accept(x.getSubQuery()); accept(x.getEntries()); @@ -1008,12 +942,8 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleForStatement x) { - SQLName index = x.getIndex(); - this.getVariants().put(index.toString(), x); - x.getRange().accept(this); accept(x.getStatements()); - return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java index b37749b890..45a584932e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGUpdateStatement.java @@ -25,8 +25,6 @@ public class PGUpdateStatement extends SQLUpdateStatement implements PGSQLStatem private boolean only = false; - private SQLWithSubqueryClause with; - public PGUpdateStatement(){ super (JdbcConstants.POSTGRESQL); } @@ -39,14 +37,6 @@ public class PGUpdateStatement extends SQLUpdateStatement implements PGSQLStatem this.only = only; } - public SQLWithSubqueryClause getWith() { - return with; - } - - public void setWith(SQLWithSubqueryClause with) { - this.with = with; - } - protected void accept0(SQLASTVisitor visitor) { accept0((PGASTVisitor) visitor); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 24408391e8..1a46dbddef 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -54,10 +54,10 @@ public class PGExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM", "ROW_NUMBER" }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } 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 c1abe30383..7fa3609060 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 @@ -101,8 +101,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit x.getWith().accept(this); } - setAliasMap(); - SQLTableSource using = x.getUsing(); if (using != null) { using.accept(this); @@ -111,9 +109,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit x.putAttribute("_original_use_mode", getMode()); setMode(x, Mode.Delete); - String ident = ((SQLIdentifierExpr) x.getTableName()).getName(); - - TableStat stat = getTableStat(ident, x.getAlias()); + TableStat stat = getTableStat(x.getTableName()); stat.incrementDeleteCount(); accept(x.getWhere()); @@ -133,8 +129,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit repository.resolve(x); } - setAliasMap(); - if (x.getWith() != null) { x.getWith().accept(this); } @@ -149,14 +143,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit TableStat stat = getTableStat(ident); stat.incrementInsertCount(); - - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - if (x.getAlias() != null) { - aliasMap.put(x.getAlias(), ident); - } - aliasMap.put(ident, ident); - } } accept(x.getColumns()); @@ -191,10 +177,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit repository.resolve(x); } - Map oldAliasMap = getAliasMap(); - - setAliasMap(); - if (x.getWith() != null) { x.getWith().accept(this); } @@ -206,14 +188,9 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit accept(x.getFrom()); - Map aliasMap = getAliasMap(); - aliasMap.put(ident, ident); - accept(x.getItems()); accept(x.getWhere()); - setAliasMap(oldAliasMap); - return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java index 20c8f3f350..1dc5182824 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -44,10 +44,10 @@ public class SQLServerExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "ROW_NUMBER", "STDDEV", "SUM" }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index 1d61a46eb5..af93a8a2aa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -84,16 +84,11 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL @Override public boolean visit(SQLServerUpdateStatement x) { - setAliasMap(); - String ident = x.getTableName().toString(); TableStat stat = getTableStat(ident); stat.incrementUpdateCount(); - Map aliasMap = getAliasMap(); - aliasMap.put(ident, ident); - accept(x.getItems()); accept(x.getFrom()); accept(x.getWhere()); 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 76b7ed1278..9fa5fcfbeb 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -1529,7 +1529,7 @@ public class Lexer { if (stringVal == null) { stringVal = subString(mark, bufPos); } - this.hash_lower = FnvHash.fnv_64_lower(stringVal); + this.hash_lower = FnvHash.fnv1a_64_lower(stringVal); } return this.hash_lower == hash_lower; } @@ -1539,7 +1539,7 @@ public class Lexer { if (stringVal == null) { stringVal = subString(mark, bufPos); } - this.hash_lower = FnvHash.fnv_64_lower(stringVal); + this.hash_lower = FnvHash.fnv1a_64_lower(stringVal); } return hash_lower; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index d3239cee81..18d1fe64d8 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -56,10 +56,10 @@ public class SQLExprParser extends SQLParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM" }; - AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FnvHash.fnv_64_lower(str); + long hash = FnvHash.fnv1a_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } @@ -896,7 +896,6 @@ public class SQLExprParser extends SQLParser { } String methodName = null; - boolean isAggregate = false; String aggMethodName = null; SQLMethodInvokeExpr methodInvokeExpr; SQLExpr owner = null; @@ -933,7 +932,7 @@ public class SQLExprParser extends SQLParser { } else if (expr instanceof SQLPropertyExpr) { methodName = expr.toString(); aggMethodName = SQLUtils.normalize(methodName); - hash_lower = FnvHash.fnv_64_lower(aggMethodName); + hash_lower = FnvHash.fnv1a_64_lower(aggMethodName); aggMethodName = getAggreateFunction(hash_lower); owner = ((SQLPropertyExpr) expr).getOwner(); @@ -1229,7 +1228,7 @@ public class SQLExprParser extends SQLParser { } public boolean isAggreateFunction(String word) { - long hash_lower = FnvHash.fnv_64_lower(word); + long hash_lower = FnvHash.fnv1a_64_lower(word); return isAggreateFunction(hash_lower); } @@ -1296,7 +1295,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.OF) { lexer.nextToken(); - SQLExpr of = this.expr(); + SQLName of = this.name(); over.setOf(of); } 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 eea4d4431c..f4b8c5abe5 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -203,6 +203,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -346,6 +351,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -397,12 +407,28 @@ class SchemaResolveVisitorFactory { public boolean visit(OracleForStatement x) { Context ctx = createContext(x); - SQLExpr index = x.getIndex(); + SQLName index = x.getIndex(); + SQLExpr range = x.getRange(); + if (index != null) { + SQLDeclareItem declareItem = new SQLDeclareItem(index, null); + declareItem.setParent(x); + + if (index instanceof SQLIdentifierExpr) { + ((SQLIdentifierExpr) index).setResolvedDeclareItem(declareItem); + } + declareItem.setResolvedObject(range); + ctx.declare(declareItem); + if (range instanceof SQLQueryExpr) { + SQLSelect select = ((SQLQueryExpr) range).getSubQuery(); + SQLSubqueryTableSource tableSource = new SQLSubqueryTableSource(select); + declareItem.setResolvedObject(tableSource); + } + index.accept(this); } - SQLExpr range = x.getRange(); + if (range != null) { range.accept(this); } @@ -583,6 +609,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -751,6 +782,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -930,6 +966,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -1081,6 +1122,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -1217,6 +1263,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLOver x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -1297,6 +1348,11 @@ class SchemaResolveVisitorFactory { static void resolve(SchemaResolveVisitor visitor, SQLUpdateStatement x) { SchemaResolveVisitor.Context ctx = visitor.createContext(x); + SQLWithSubqueryClause with = x.getWith(); + if (with != null) { + with.accept(visitor); + } + SQLTableSource table = x.getTableSource(); SQLTableSource from = x.getFrom(); @@ -1453,7 +1509,7 @@ class SchemaResolveVisitorFactory { && right instanceof SQLExprTableSource) { SQLSelect leftSelect = ((SQLSubqueryTableSource) left).getSelect(); if (leftSelect.getQuery() instanceof SQLSelectQueryBlock) { - boolean hasAllColumn = ((SQLSelectQueryBlock) leftSelect.getQuery()).selectItemHashAllColumn(); + boolean hasAllColumn = ((SQLSelectQueryBlock) leftSelect.getQuery()).selectItemHasAllColumn(); if (!hasAllColumn) { tableSource = right; } @@ -1462,7 +1518,7 @@ class SchemaResolveVisitorFactory { && left instanceof SQLExprTableSource) { SQLSelect rightSelect = ((SQLSubqueryTableSource) right).getSelect(); if (rightSelect.getQuery() instanceof SQLSelectQueryBlock) { - boolean hasAllColumn = ((SQLSelectQueryBlock) rightSelect.getQuery()).selectItemHashAllColumn(); + boolean hasAllColumn = ((SQLSelectQueryBlock) rightSelect.getQuery()).selectItemHasAllColumn(); if (!hasAllColumn) { tableSource = left; } @@ -1629,8 +1685,10 @@ class SchemaResolveVisitorFactory { SQLDeclareItem declareItem = parentCtx.findDeclare(owner_hash); if (declareItem != null) { SQLObject resolvedObject = declareItem.getResolvedObject(); - if (resolvedObject instanceof SQLCreateProcedureStatement) { - x.setResolvedProcedure((SQLCreateProcedureStatement) resolvedObject); + if (resolvedObject instanceof SQLCreateProcedureStatement + || resolvedObject instanceof SQLCreateFunctionStatement + || resolvedObject instanceof SQLTableSource) { + x.setResolvedOwnerObject(resolvedObject); } break; } @@ -1661,7 +1719,7 @@ class SchemaResolveVisitorFactory { } } - for (SchemaResolveVisitor.Context parentCtx = ctx.parent; + for (SchemaResolveVisitor.Context parentCtx = ctx; parentCtx != null; parentCtx = parentCtx.parent) { @@ -1675,6 +1733,9 @@ class SchemaResolveVisitorFactory { } else if (parentCtx.object instanceof SQLInsertStatement) { SQLInsertStatement insertStmt = (SQLInsertStatement) parentCtx.object; with = insertStmt.getWith(); + } else if (parentCtx.object instanceof SQLUpdateStatement) { + SQLUpdateStatement updateStmt = (SQLUpdateStatement) parentCtx.object; + with = updateStmt.getWith(); } if (with != null) { @@ -2082,17 +2143,20 @@ class SchemaResolveVisitorFactory { } static void resolve(SchemaResolveVisitor visitor, SQLCreateFunctionStatement x) { + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + { + SQLDeclareItem declareItem = new SQLDeclareItem(x.getName().clone(), null); + declareItem.setResolvedObject(x); + SchemaResolveVisitor.Context parentCtx = visitor.getContext(); if (parentCtx != null) { - SQLDeclareItem declareItem = new SQLDeclareItem(x.getName().clone(), null); - declareItem.setResolvedObject(x); parentCtx.declare(declareItem); + } else { + ctx.declare(declareItem); } } - SchemaResolveVisitor.Context ctx = visitor.createContext(x); - for (SQLParameter parameter : x.getParameters()) { parameter.accept(visitor); } @@ -2105,17 +2169,21 @@ class SchemaResolveVisitorFactory { visitor.popContext(); } static void resolve(SchemaResolveVisitor visitor, SQLCreateProcedureStatement x) { + SchemaResolveVisitor.Context ctx = visitor.createContext(x); + { + SQLDeclareItem declareItem = new SQLDeclareItem(x.getName().clone(), null); + declareItem.setResolvedObject(x); + + SchemaResolveVisitor.Context parentCtx = visitor.getContext(); if (parentCtx != null) { - SQLDeclareItem declareItem = new SQLDeclareItem(x.getName().clone(), null); - declareItem.setResolvedObject(x); parentCtx.declare(declareItem); + } else { + ctx.declare(declareItem); } } - SchemaResolveVisitor.Context ctx = visitor.createContext(x); - for (SQLParameter parameter : x.getParameters()) { parameter.accept(visitor); } @@ -2212,6 +2280,23 @@ class SchemaResolveVisitorFactory { } } + static void resolve(SchemaResolveVisitor visitor, SQLOver x) { + SQLName of = x.getOf(); + SQLOrderBy orderBy = x.getOrderBy(); + List partitionBy = x.getPartitionBy(); + + + if (of == null // skip if of is not null + && orderBy != null) { + orderBy.accept(visitor); + } + + if (partitionBy != null) { + for (SQLExpr expr : partitionBy) { + expr.accept(visitor); + } + } + } private static boolean checkParameter(SchemaResolveVisitor visitor, SQLIdentifierExpr x) { if (x.getResolvedParameter() != null) { @@ -2245,6 +2330,24 @@ class SchemaResolveVisitorFactory { return true; } } + + if (parentCtx.object instanceof SQLSelect) { + SQLSelect select = (SQLSelect) parentCtx.object; + SQLWithSubqueryClause with = select.getWithSubQuery(); + if (with != null) { + SQLWithSubqueryClause.Entry entry = with.findEntry(hash); + if (entry != null) { + x.setResolvedTableSource(entry); + return true; + } + } + } + + SQLDeclareItem declareItem = parentCtx.findDeclare(hash); + if (declareItem != null) { + x.setResolvedDeclareItem(declareItem); + break; + } } 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 6751600c5f..3d8b9b13cc 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -35,7 +35,6 @@ 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.repository.SchemaObject; import com.alibaba.druid.sql.repository.SchemaRepository; import com.alibaba.druid.stat.TableStat; @@ -61,17 +60,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { protected final List aggregateFunctions = new ArrayList(); protected final List functions = new ArrayList(2); - protected final Map subQueryMap = new LinkedHashMap(); - - protected final Map variants = new LinkedHashMap(); - - protected Map aliasMap = new LinkedHashMap(); - - protected String currentTable; - - public final static String ATTR_TABLE = "_table_"; - public final static String ATTR_COLUMN = "_column_"; - private List parameters; private Mode mode; @@ -124,9 +112,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } protected Column addColumn(String tableName, String columnName, long table_hash, long name_hash) { -// tableName = handleName(tableName); -// columnName = handleName(columnName); - Column column = this.getColumn(tableName, columnName); if (column == null && columnName != null) { column = new Column(tableName, columnName); @@ -136,10 +121,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public TableStat getTableStat(String tableName, String alias) { - if (variants.containsKey(tableName)) { - return null; - } - tableName = handleName(tableName); TableStat.Name tableNameObj = new TableStat.Name(tableName); @@ -147,7 +128,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (stat == null) { stat = new TableStat(); tableStats.put(new TableStat.Name(tableName), stat); - putAliasMap(aliasMap, alias, tableName); } return stat; } @@ -189,31 +169,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { ident = ident.replaceAll("'", ""); } } - ident = aliasWrap(ident); - return ident; } - public Map getVariants() { - return variants; - } - public void setAliasMap() { - this.setAliasMap(new HashMap()); } - public void clearAliasMap() { - this.aliasMap = null; - } - - public void setAliasMap(Map aliasMap) { - this.aliasMap = aliasMap; - } - - public Map getAliasMap() { - return aliasMap; - } - protected Mode getMode() { return mode; } @@ -298,37 +259,31 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - private boolean visitOrderBy1(SQLIdentifierExpr x) { - if (containsSubQuery(currentTable)) { - return false; - } - - String identName = x.getName(); - if (aliasMap != null && aliasMap.containsKey(identName) && aliasMap.get(identName) == null) { - return false; - } - - if (currentTable != null) { - orderByAddColumn(currentTable, identName, x); - } else { - orderByAddColumn("UNKOWN", identName, x); - } - return false; - } - private boolean visitOrderBy(SQLPropertyExpr x) { - if (x.getOwner() instanceof SQLIdentifierExpr) { - String owner = ((SQLIdentifierExpr) x.getOwner()).getName(); + if (isSubQueryOrParamOrVariant(x)) { + return false; + } - if (containsSubQuery(owner)) { - return false; + String owner = null; + + SQLTableSource tableSource = x.getResolvedTableSource(); + if (tableSource instanceof SQLExprTableSource) { + SQLExpr tableSourceExpr = ((SQLExprTableSource) tableSource).getExpr(); + if (tableSourceExpr instanceof SQLName) { + owner = tableSourceExpr.toString(); } + } - owner = aliasWrap(owner); + if (owner == null && x.getOwner() instanceof SQLIdentifierExpr) { + owner = ((SQLIdentifierExpr) x.getOwner()).getName(); + } - if (owner != null) { - orderByAddColumn(owner, x.getName(), x); - } + if (owner == null) { + return false; + } + + if (owner != null) { + orderByAddColumn(owner, x.getName(), x); } return false; @@ -438,7 +393,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLPropertyExpr x) { - return visitOrderBy(x); + SQLExpr unwrapped = unwrapExpr(x); + if (unwrapped instanceof SQLPropertyExpr) { + visitOrderBy((SQLPropertyExpr) unwrapped); + } else if (unwrapped instanceof SQLIdentifierExpr) { + visitOrderBy((SQLIdentifierExpr) unwrapped); + } + return false; } } @@ -464,7 +425,33 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } } x.accept(orderByVisitor); - return true; + + for (SQLSelectOrderByItem orderByItem : x.getItems()) { + statExpr( + orderByItem.getExpr()); + } + + return false; + } + + public boolean visit(SQLOver x) { + SQLName of = x.getOf(); + SQLOrderBy orderBy = x.getOrderBy(); + List partitionBy = x.getPartitionBy(); + + + if (of == null // skip if of is not null + && orderBy != null) { + orderBy.accept(this); + } + + if (partitionBy != null) { + for (SQLExpr expr : partitionBy) { + expr.accept(this); + } + } + + return false; } protected SQLASTVisitor createOrderByVisitor(SQLOrderBy x) { @@ -619,54 +606,43 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } protected Column getColumn(SQLExpr expr) { - Map aliasMap = getAliasMap(); - if (aliasMap == null) { - return null; - } - - if (expr instanceof SQLMethodInvokeExpr) { - SQLMethodInvokeExpr methodInvokeExp = (SQLMethodInvokeExpr) expr; - if (methodInvokeExp.getParameters().size() == 1) { - SQLExpr firstExpr = methodInvokeExp.getParameters().get(0); - return getColumn(firstExpr); - } - } + final SQLExpr original = expr; - if (expr instanceof SQLCastExpr) { - expr = ((SQLCastExpr) expr).getExpr(); - } + // unwrap + expr = unwrapExpr(expr); if (expr instanceof SQLPropertyExpr) { SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; + SQLExpr owner = propertyExpr.getOwner(); String column = propertyExpr.getName(); - if (owner instanceof SQLIdentifierExpr) { - String tableName = ((SQLIdentifierExpr) owner).getName(); + if (owner instanceof SQLName) { + String tableName = owner.toString(); String table = tableName; - String tableNameLower = tableName.toLowerCase(); - - if (aliasMap.containsKey(tableNameLower)) { - table = aliasMap.get(tableNameLower); - } +// String tableNameLower = tableName.toLowerCase(); +// +// if (aliasMap.containsKey(tableNameLower)) { +// table = aliasMap.get(tableNameLower); +// } - if (propertyExpr.getResolvedTableSource() instanceof SQLSubqueryTableSource) { - table = null; - } - - if (containsSubQuery(tableNameLower)) { + SQLObject resolvedOwnerObject = propertyExpr.getResolvedOwnerObject(); + if (resolvedOwnerObject instanceof SQLSubqueryTableSource + || resolvedOwnerObject instanceof SQLCreateProcedureStatement + || resolvedOwnerObject instanceof SQLCreateFunctionStatement) { table = null; } - if (variants.containsKey(table)) { - return null; + if (resolvedOwnerObject instanceof SQLExprTableSource) { + SQLExpr tableSourceExpr = ((SQLExprTableSource) resolvedOwnerObject).getExpr(); + if (tableSourceExpr instanceof SQLName) { + table = tableSourceExpr.toString(); + } } if (table != null) { return new Column(table, column); } - - return handleSubQueryColumn(tableName, column); } return null; @@ -682,9 +658,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return null; } - Column attrColumn = (Column) expr.getAttribute(ATTR_COLUMN); - if (attrColumn != null) { - return attrColumn; + if (identifierExpr.getResolvedDeclareItem() != null || identifierExpr.getResolvedParameter() != null) { + return null; } String column = identifierExpr.getName(); @@ -692,39 +667,147 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { String table = null; SQLTableSource tableSource = identifierExpr.getResolvedTableSource(); if (tableSource instanceof SQLExprTableSource) { - SQLName tableName = ((SQLExprTableSource) tableSource).getName(); + SQLExpr tableSourceExpr = ((SQLExprTableSource) tableSource).getExpr(); + SQLName tableName = null; + + if (tableSourceExpr != null && !(tableSourceExpr instanceof SQLName)) { + tableSourceExpr = unwrapExpr(tableSourceExpr); + } + + if (tableSourceExpr instanceof SQLName) { + tableName = (SQLName) tableSourceExpr; + } + if (tableName != null) { table = tableName.toString(); } } - if (table != null && aliasMap.containsKey(table)) { - table = aliasMap.get(table); - if (table == null) { - return null; - } - } - if (table != null) { return new Column(table, column); } - if (variants.containsKey(column)) { - return null; - } - return new Column("UNKNOWN", column); } return null; } + private SQLExpr unwrapExpr(SQLExpr expr) { + SQLExpr original = expr; + + for (;;) { + if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExp = (SQLMethodInvokeExpr) expr; + if (methodInvokeExp.getParameters().size() == 1) { + SQLExpr firstExpr = methodInvokeExp.getParameters().get(0); + expr = firstExpr; + continue; + } + } + + if (expr instanceof SQLCastExpr) { + expr = ((SQLCastExpr) expr).getExpr(); + continue; + } + + if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; + + SQLTableSource resolvedTableSource = propertyExpr.getResolvedTableSource(); + if (resolvedTableSource instanceof SQLSubqueryTableSource) { + SQLSelect select = ((SQLSubqueryTableSource) resolvedTableSource).getSelect(); + SQLSelectQueryBlock queryBlock = select.getFirstQueryBlock(); + if (queryBlock != null) { + if (queryBlock.getGroupBy() != null) { + if (original.getParent() instanceof SQLBinaryOpExpr) { + SQLExpr other = ((SQLBinaryOpExpr) original.getParent()).other(original); + if (!SQLExprUtils.isLiteralExpr(other)) { + break; + } + } + } + + SQLSelectItem selectItem = queryBlock.findSelectItem(propertyExpr + .nameHashCode64()); + if (selectItem != null) { + expr = selectItem.getExpr(); + continue; + + } else if (queryBlock.selectItemHasAllColumn()) { + SQLTableSource allColumnTableSource = null; + + SQLTableSource from = queryBlock.getFrom(); + if (from instanceof SQLJoinTableSource) { + SQLSelectItem allColumnSelectItem = queryBlock.findAllColumnSelectItem(); + if (allColumnSelectItem != null && allColumnSelectItem.getExpr() instanceof SQLPropertyExpr) { + SQLExpr owner = ((SQLPropertyExpr) allColumnSelectItem.getExpr()).getOwner(); + if (owner instanceof SQLName) { + allColumnTableSource = from.findTableSource(((SQLName) owner).nameHashCode64()); + } + } + } else { + allColumnTableSource = from; + } + + if (allColumnTableSource == null) { + break; + } + + propertyExpr = propertyExpr.clone(); + propertyExpr.setResolvedTableSource(allColumnTableSource); + + if (allColumnTableSource instanceof SQLExprTableSource) { + propertyExpr.setOwner(((SQLExprTableSource) allColumnTableSource).getExpr().clone()); + } + expr = propertyExpr; + continue; + } + } + } else if (resolvedTableSource instanceof SQLExprTableSource) { + SQLExprTableSource exprTableSource = (SQLExprTableSource) resolvedTableSource; + if (exprTableSource.getSchemaObject() != null) { + break; + } + + SQLTableSource redirectTableSource = null; + SQLExpr tableSourceExpr = exprTableSource.getExpr(); + if (tableSourceExpr instanceof SQLIdentifierExpr) { + redirectTableSource = ((SQLIdentifierExpr) tableSourceExpr).getResolvedTableSource(); + } else if (tableSourceExpr instanceof SQLPropertyExpr) { + redirectTableSource = ((SQLPropertyExpr) tableSourceExpr).getResolvedTableSource(); + } + + if (redirectTableSource == resolvedTableSource) { + redirectTableSource = null; + } + + if (redirectTableSource != null) { + propertyExpr = propertyExpr.clone(); + if (redirectTableSource instanceof SQLExprTableSource) { + propertyExpr.setOwner(((SQLExprTableSource) redirectTableSource).getExpr().clone()); + } + propertyExpr.setResolvedTableSource(redirectTableSource); + expr = propertyExpr; + continue; + } + + propertyExpr = propertyExpr.clone(); + propertyExpr.setOwner(tableSourceExpr); + expr = propertyExpr; + break; + } + } + break; + } + + return expr; + } + @Override public boolean visit(SQLTruncateStatement x) { setMode(x, Mode.Delete); - setAliasMap(); - for (SQLExprTableSource tableSource : x.getTableSources()) { SQLName name = (SQLName) tableSource.getExpr(); @@ -732,9 +815,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { TableStat stat = getTableStat(ident); stat.incrementDeleteCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, ident, ident); } return false; @@ -750,17 +830,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDropTableStatement x) { setMode(x, Mode.Insert); - setAliasMap(); - for (SQLExprTableSource tableSource : x.getTableSources()) { SQLName name = (SQLName) tableSource.getExpr(); String ident = name.toString(); TableStat stat = getTableStat(ident); stat.incrementDropCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, ident, ident); } return false; @@ -775,17 +850,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { setMode(x, Mode.Insert); - setAliasMap(); - if (x.getTableName() instanceof SQLName) { String ident = ((SQLName) x.getTableName()).toString(); TableStat stat = getTableStat(ident); stat.incrementInsertCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, x.getAlias(), ident); - putAliasMap(aliasMap, ident, ident); } accept(x.getColumns()); @@ -820,9 +889,14 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { setMode(x, Mode.Select); - if (x.getFrom() instanceof SQLSubqueryTableSource) { - x.getFrom().accept(this); - return false; +// if (x.getFrom() instanceof SQLSubqueryTableSource) { +// x.getFrom().accept(this); +// return false; +// } + + SQLTableSource from = x.getFrom(); + if (from != null) { + from.accept(this); // 提前执行,获得aliasMap } SQLExprTableSource into = x.getInto(); @@ -838,39 +912,65 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { stat.incrementInsertCount(); } } + into.accept(this); } - if (x.getFrom() instanceof SQLExprTableSource) { - SQLExprTableSource tableSource = (SQLExprTableSource) x.getFrom(); - if (tableSource.getExpr() instanceof SQLName) { - String ident = tableSource.getExpr().toString(); + for (SQLSelectItem selectItem : x.getSelectList()) { + statExpr( + selectItem.getExpr()); + } - x.putAttribute(ATTR_TABLE, ident); - if (x.getParent() instanceof SQLSelect) { - x.getParent().putAttribute(ATTR_TABLE, ident); - } + SQLExpr where = x.getWhere(); + if (where != null) { + statExpr(where); + } + + SQLExpr startWith = x.getStartWith(); + if (startWith != null) { + statExpr(startWith); + } + + SQLExpr connectBy = x.getConnectBy(); + if (connectBy != null) { + statExpr(connectBy); + } + + SQLSelectGroupByClause groupBy = x.getGroupBy(); + if (groupBy != null) { + for (SQLExpr expr : groupBy.getItems()) { + statExpr(expr); } } - if (x.getFrom() != null) { - x.getFrom().accept(this); // 提前执行,获得aliasMap - String table = (String) x.getFrom().getAttribute(ATTR_TABLE); - if (table != null) { - x.putAttribute(ATTR_TABLE, table); + SQLOrderBy orderBy = x.getOrderBy(); + if (orderBy != null) { + this.visit(orderBy); + } + + SQLExpr first = x.getFirst(); + if(first != null) { + statExpr(first); + } + + List distributeBy = x.getDistributeBy(); + if (distributeBy != null) { + for (SQLExpr expr : distributeBy) { + statExpr(expr); } } - // String ident = x.getTable().toString(); - // - // TableStat stat = getTableStat(ident); - // stat.incrementInsertCount(); - // return false; - - if (x.getWhere() != null) { - x.getWhere().setParent(x); + List sortBy = x.getSortBy(); + if (sortBy != null) { + for (SQLSelectOrderByItem orderByItem : sortBy) { + visit(orderBy); + } } - return true; + for (SQLExpr expr : x.getForUpdateOf()) { + statExpr(expr); + } + + return false; } public static boolean isParam(SQLIdentifierExpr x) { @@ -886,21 +986,40 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLJoinTableSource x) { - x.getLeft().accept(this); - x.getRight().accept(this); + SQLTableSource left = x.getLeft(), right = x.getRight(); + + left.accept(this); + right.accept(this); + SQLExpr condition = x.getCondition(); if (condition != null) { condition.accept(this); } + + if (x.getUsing().size() > 0 + && left instanceof SQLExprTableSource && right instanceof SQLExprTableSource) { + SQLExpr leftExpr = ((SQLExprTableSource) left).getExpr(); + SQLExpr rightExpr = ((SQLExprTableSource) right).getExpr(); + + for (SQLExpr expr : x.getUsing()) { + if (expr instanceof SQLIdentifierExpr) { + String name = ((SQLIdentifierExpr) expr).getName(); + SQLPropertyExpr leftPropExpr = new SQLPropertyExpr(leftExpr, name); + SQLPropertyExpr rightPropExpr = new SQLPropertyExpr(rightExpr, name); + + leftPropExpr.setResolvedTableSource(left); + rightPropExpr.setResolvedTableSource(right); + + SQLBinaryOpExpr usingCondition = new SQLBinaryOpExpr(leftPropExpr, SQLBinaryOperator.Equality, rightPropExpr); + usingCondition.accept(this); + } + } + } + return false; } public boolean visit(SQLPropertyExpr x) { - return visit1(x); -// return visit2(x); - } - - public boolean visit1(SQLPropertyExpr x) { Column column = null; String ident = x.getName(); @@ -935,7 +1054,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { 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(); @@ -944,7 +1062,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { 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()) @@ -1000,9 +1117,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (!skip) { column = handleUnkownColumn(ident); } - if (column != null) { - x.putAttribute(ATTR_COLUMN, column); - } } if (column != null) { @@ -1023,152 +1137,14 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } protected String aliasWrap(String name) { - Map aliasMap = getAliasMap(); - - if (aliasMap != null) { - if (aliasMap.containsKey(name)) { - return aliasMap.get(name); - } - - String name_lcase = name.toLowerCase(); - if (name_lcase != name && aliasMap.containsKey(name_lcase)) { - return aliasMap.get(name_lcase); - } - -// for (Map.Entry entry : aliasMap.entrySet()) { -// if (entry.getKey() == null) { -// continue; -// } -// if (entry.getKey().equalsIgnoreCase(name)) { -// return entry.getValue(); -// } -// } - } - return name; } - protected Column handleSubQueryColumn(String owner, String alias) { - SQLObject query = getSubQuery(owner); - - if (query == null) { - return null; - } - - return handleSubQueryColumn(alias, query); - } - - protected Column handleSubQueryColumn(String alias, SQLObject query) { - if (query instanceof SQLSelect) { - query = ((SQLSelect) query).getQuery(); - } - - SQLSelectQueryBlock queryBlock = null; - List selectList = null; - if (query instanceof SQLSelectQueryBlock) { - queryBlock = (SQLSelectQueryBlock) query; - - if (queryBlock.getGroupBy() != null) { - return null; - } - - selectList = queryBlock.getSelectList(); - } - - if (selectList != null) { - boolean allColumn = false; - String allColumnOwner = null; - for (SQLSelectItem item : selectList) { - if (!item.getClass().equals(SQLSelectItem.class)) { - continue; - } - - String itemAlias = item.getAlias(); - SQLExpr itemExpr = item.getExpr(); - - String ident = itemAlias; - if (itemAlias == null) { - if (itemExpr instanceof SQLIdentifierExpr) { - ident = itemAlias = itemExpr.toString(); - } else if (itemExpr instanceof SQLPropertyExpr) { - itemAlias = ((SQLPropertyExpr) itemExpr).getName(); - ident = itemExpr.toString(); - } - } - - if (alias.equalsIgnoreCase(itemAlias)) { - Column column = (Column) itemExpr.getAttribute(ATTR_COLUMN); - if (column != null) { - return column; - } else { - SQLTableSource from = queryBlock.getFrom(); - if (from instanceof SQLSubqueryTableSource) { - SQLSelect select = ((SQLSubqueryTableSource) from).getSelect(); - Column subQueryColumn = handleSubQueryColumn(ident, select); - return subQueryColumn; - } - } - } - - if (itemExpr instanceof SQLAllColumnExpr) { - allColumn = true; - } else if (itemExpr instanceof SQLPropertyExpr) { - SQLPropertyExpr propertyExpr = (SQLPropertyExpr) itemExpr; - if (propertyExpr.getName().equals("*")) { - SQLExpr owner = propertyExpr.getOwner(); - if (owner instanceof SQLIdentifierExpr) { - allColumnOwner = ((SQLIdentifierExpr) owner).getName(); - allColumn = true; - } - } - } - } - - if (allColumn) { - - SQLTableSource from = queryBlock.getFrom(); - String tableName = getTable(from, allColumnOwner); - if (tableName != null) { - return new Column(tableName, alias); - } - } - } - - return null; - } - - private String getTable(SQLTableSource from, String tableAlias) { - if (from instanceof SQLExprTableSource) { - boolean aliasEq = StringUtils.equals(from.getAlias(), tableAlias); - SQLExpr tableSourceExpr = ((SQLExprTableSource) from).getExpr(); - if (tableSourceExpr instanceof SQLName) { - String tableName = ((SQLName) tableSourceExpr).toString(); - if (tableAlias == null || aliasEq) { - return tableName; - } - } - } else if (from instanceof SQLJoinTableSource) { - SQLJoinTableSource joinTableSource = (SQLJoinTableSource) from; - String leftMatchTableName = getTable(joinTableSource.getLeft(), tableAlias); - if (leftMatchTableName != null) { - return leftMatchTableName; - } - - return getTable(joinTableSource.getRight(), tableAlias); - } - - return null; - } - - public boolean visit(SQLIdentifierExpr x) { - return visit1(x); - } - public boolean isPseudoColumn(long hash) { return false; } - public boolean visit1(SQLIdentifierExpr x) { + public boolean visit(SQLIdentifierExpr x) { if (isParam(x)) { return false; } @@ -1193,7 +1169,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - if ((hash == FnvConstants.LEVEL || hash == FnvConstants.CONNECT_BY_ISCYCLE) + if ((hash == FnvConstants.LEVEL + || hash == FnvConstants.CONNECT_BY_ISCYCLE + || hash == FnvConstants.ROWNUM) && x.getResolvedColumn() == null && tableSource == null) { return false; @@ -1211,7 +1189,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (column != null && isParentGroupBy(x)) { this.groupByColumns.add(column); } - x.putAttribute(ATTR_COLUMN, column); } else if (expr instanceof SQLPropertyExpr || expr instanceof OracleDbLinkExpr) { String tableName = expr.toString(); column = addColumn(tableName, ident, 0, hash); @@ -1219,7 +1196,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { 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()) @@ -1268,9 +1244,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (!skip) { column = handleUnkownColumn(ident); } - if (column != null) { - x.putAttribute(ATTR_COLUMN, column); - } } if (column != null) { @@ -1423,7 +1396,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { SQLExpr owner = SQLUtils.toSQLExpr(tableName, dbType); hashCode = new SQLPropertyExpr(owner, columnName).hashCode64(); } else { - hashCode = FnvHash.fnv_64_lower(tableName, columnName); + hashCode = FnvHash.hashCode64(tableName, columnName); } return columns.containsKey(hashCode); } @@ -1433,10 +1406,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public Column getColumn(String tableName, String columnName) { - if (aliasMap != null && aliasMap.containsKey(columnName) && aliasMap.get(columnName) == null) { - return null; - } - Column column = new Column(tableName, columnName); return this.columns.get(column.hashCode64()); @@ -1448,7 +1417,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { repository.resolve(x); } - setAliasMap(); return true; } @@ -1458,16 +1426,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLWithSubqueryClause.Entry x) { String alias = x.getAlias(); - Map aliasMap = getAliasMap(); SQLWithSubqueryClause with = (SQLWithSubqueryClause) x.getParent(); if (Boolean.TRUE == with.getRecursive()) { - - if (aliasMap != null && alias != null) { - putAliasMap(aliasMap, alias, null); - addSubQuery(alias, x); - } - SQLSelect select = x.getSubQuery(); if (select != null) { select.accept(this); @@ -1481,11 +1442,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } else { x.getReturningStatement().accept(this); } - - if (aliasMap != null && alias != null) { - putAliasMap(aliasMap, alias, null); - addSubQuery(alias, x); - } } return false; @@ -1493,61 +1449,64 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLSubqueryTableSource x) { x.getSelect().accept(this); - - SQLSelectQuery query = x.getSelect().getQuery(); - - Map aliasMap = getAliasMap(); - if (aliasMap != null && x.getAlias() != null) { - putAliasMap(aliasMap, x.getAlias(), null); - addSubQuery(x.getAlias(), query); - } return false; } - - protected void addSubQuery(String alias, SQLObject query) { - String alias_lcase = alias.toLowerCase(); - subQueryMap.put(alias_lcase, query); - } - - protected SQLObject getSubQuery(String alias) { - String alias_lcase = alias.toLowerCase(); - return subQueryMap.get(alias_lcase); - } - - protected boolean containsSubQuery(String alias) { - if (alias == null) { - return false; - } - - String alias_lcase = alias.toLowerCase(); - return subQueryMap.containsKey(alias_lcase); - } protected boolean isSimpleExprTableSource(SQLExprTableSource x) { return x.getExpr() instanceof SQLName; } + public TableStat getTableStat(SQLExprTableSource tableSource) { + return getTableStat( + tableSource.getExpr()); + } + + public TableStat getTableStat(SQLExpr expr) { + String ident = null; + + expr = unwrapExpr(expr); + + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; + + if (identifierExpr.nameHashCode64() == FnvConstants.DUAL) { + return null; + } + + if (isSubQueryOrParamOrVariant(identifierExpr)) { + return null; + } + } + + SQLTableSource tableSource = null; + if (expr instanceof SQLIdentifierExpr) { + tableSource = ((SQLIdentifierExpr) expr).getResolvedTableSource(); + } else if (expr instanceof SQLPropertyExpr) { + tableSource = ((SQLPropertyExpr) expr).getResolvedTableSource(); + } + + if (tableSource instanceof SQLExprTableSource) { + SQLExpr tableSourceExpr = ((SQLExprTableSource) tableSource).getExpr(); + if (tableSourceExpr instanceof SQLName) { + ident = tableSourceExpr.toString(); + } + } + + if (ident == null) { + ident = expr.toString(); + } + + return getTableStat(ident); + } + public boolean visit(SQLExprTableSource x) { if (isSimpleExprTableSource(x)) { SQLExpr expr = x.getExpr(); - if (expr instanceof SQLIdentifierExpr && isParam((SQLIdentifierExpr) expr)) { + TableStat stat = getTableStat(expr); + if (stat == null) { return false; } - String ident = expr.toString(); - - if (variants.containsKey(ident)) { - return false; - } - - if (containsSubQuery(ident)) { - return false; - } - - Map aliasMap = getAliasMap(); - - TableStat stat = getTableStat(ident); - Mode mode = getMode(); if (mode != null) { switch (mode) { @@ -1573,19 +1532,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { break; } } - - if (aliasMap != null) { - String alias = x.getAlias(); - if (alias != null) { - String table = aliasMap.get(alias); - if (!(ident.equals(table) || alias.equals(table))) { - putAliasMap(aliasMap, alias, ident); - } - } - if (!aliasMap.containsKey(ident)) { - putAliasMap(aliasMap, ident, ident); - } - } } else { accept(x.getExpr()); } @@ -1593,20 +1539,62 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - public boolean visit(SQLSelectItem x) { - x.getExpr().accept(this); - - String alias = x.getAlias(); - - Map aliasMap = this.getAliasMap(); - if (alias != null && (!alias.isEmpty()) && aliasMap != null) { - if (x.getExpr() instanceof SQLName) { - putAliasMap(aliasMap, alias, x.getExpr().toString()); - } else { - putAliasMap(aliasMap, alias, null); + protected boolean isSubQueryOrParamOrVariant(SQLIdentifierExpr identifierExpr) { + SQLObject resolvedColumnObject = identifierExpr.getResolvedColumnObject(); + if (resolvedColumnObject instanceof SQLWithSubqueryClause.Entry + || resolvedColumnObject instanceof SQLParameter + || resolvedColumnObject instanceof SQLDeclareItem) { + return true; + } + + SQLObject resolvedOwnerObject = identifierExpr.getResolvedOwnerObject(); + if (resolvedOwnerObject instanceof SQLSubqueryTableSource + || resolvedOwnerObject instanceof SQLWithSubqueryClause.Entry) { + return true; + } + + return false; + } + + protected boolean isSubQueryOrParamOrVariant(SQLPropertyExpr x) { + SQLObject resolvedOwnerObject = x.getResolvedOwnerObject(); + if (resolvedOwnerObject instanceof SQLSubqueryTableSource + || resolvedOwnerObject instanceof SQLWithSubqueryClause.Entry) { + return true; + } + + SQLExpr owner = x.getOwner(); + if (owner instanceof SQLIdentifierExpr) { + if (isSubQueryOrParamOrVariant((SQLIdentifierExpr) owner)) { + return true; } } - + + SQLTableSource tableSource = x.getResolvedTableSource(); + if (tableSource instanceof SQLExprTableSource) { + SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; + if (exprTableSource.getSchemaObject() != null) { + return false; + } + + SQLExpr expr = exprTableSource.getExpr(); + + if (expr instanceof SQLIdentifierExpr) { + return isSubQueryOrParamOrVariant((SQLIdentifierExpr) expr); + } + + if (expr instanceof SQLPropertyExpr) { + return isSubQueryOrParamOrVariant((SQLPropertyExpr) expr); + } + } + + return false; + } + + public boolean visit(SQLSelectItem x) { + statExpr( + x.getExpr()); + return false; } @@ -1648,7 +1636,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { && x.getParent() == null) { repository.resolve(x); } - setAliasMap(); setMode(x, Mode.Update); @@ -1659,9 +1646,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { TableStat stat = getTableStat(ident); stat.incrementUpdateCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, ident, ident); } else { tableSource.accept(this); } @@ -1680,16 +1664,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { repository.resolve(x); } - setAliasMap(); - setMode(x, Mode.Delete); String tableName = x.getTableName().toString(); - if (x.getAlias() != null) { - putAliasMap(this.aliasMap, x.getAlias(), tableName); - } - if (x.getTableSource() instanceof SQLSubqueryTableSource) { SQLSelectQuery selectQuery = ((SQLSubqueryTableSource) x.getTableSource()).getSelect().getQuery(); if (selectQuery instanceof SQLSelectQueryBlock) { @@ -1898,9 +1876,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { TableStat stat = getTableStat(ident); stat.incrementDropIndexCount(); - - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, ident, ident); } return false; } @@ -1916,9 +1891,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { TableStat stat = getTableStat(table); stat.incrementCreateIndexCount(); - Map aliasMap = getAliasMap(); - putAliasMap(aliasMap, table, table); - for (SQLSelectOrderByItem item : x.getItems()) { SQLExpr expr = item.getExpr(); if (expr instanceof SQLIdentifierExpr) { @@ -2060,8 +2032,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { repository.resolve(x); } - String name = x.getName().toString(); - this.variants.put(name, x); accept(x.getBlock()); return false; } @@ -2073,8 +2043,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { repository.resolve(x); } - String name = x.getName().toString(); - this.variants.put(name, x); accept(x.getBlock()); return false; } @@ -2088,10 +2056,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { for (SQLParameter param : x.getParameters()) { param.setParent(x); - - SQLExpr name = param.getName(); - this.variants.put(name.toString(), name); - param.accept(this); } @@ -2228,8 +2192,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { repository.resolve(x); } - setAliasMap(); - setMode(x.getUsing(), Mode.Select); x.getUsing().accept(this); @@ -2240,14 +2202,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { TableStat stat = getTableStat(ident); stat.incrementMergeCount(); - Map aliasMap = getAliasMap(); - if (aliasMap != null) { - if (x.getAlias() != null) { - putAliasMap(aliasMap, x.getAlias(), ident); - } - putAliasMap(aliasMap, ident, ident); - } - x.getOn().accept(this); if (x.getUpdateClause() != null) { @@ -2345,17 +2299,6 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - @Override - public boolean visit(SQLDeclareStatement x) { - for (SQLDeclareItem item : x.getItems()) { - item.setParent(x); - - SQLExpr name = item.getName(); - this.variants.put(name.toString(), name); - } - return true; - } - public boolean visit(SQLCreateMaterializedViewStatement x) { if (repository != null && x.getParent() == null) { @@ -2363,4 +2306,35 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } return true; } + + protected final void statExpr(SQLExpr x) { + Class clazz = x.getClass(); + if (clazz == SQLIdentifierExpr.class) { + visit((SQLIdentifierExpr) x); + } else if (clazz == SQLPropertyExpr.class) { + visit((SQLPropertyExpr) x); +// } else if (clazz == SQLAggregateExpr.class) { +// visit((SQLAggregateExpr) x); +// } else if (clazz == SQLBinaryOpExpr.class) { +// visit((SQLBinaryOpExpr) x); +// } else if (clazz == SQLCharExpr.class) { +// visit((SQLCharExpr) x); +// } else if (clazz == SQLNullExpr.class) { +// visit((SQLNullExpr) x); +// } else if (clazz == SQLIntegerExpr.class) { +// visit((SQLIntegerExpr) x); +// } else if (clazz == SQLNumberExpr.class) { +// visit((SQLNumberExpr) x); +// } else if (clazz == SQLMethodInvokeExpr.class) { +// visit((SQLMethodInvokeExpr) x); +// } else if (clazz == SQLVariantRefExpr.class) { +// visit((SQLVariantRefExpr) x); +// } else if (clazz == SQLBinaryOpExprGroup.class) { +// visit((SQLBinaryOpExprGroup) x); + } else if (x instanceof SQLLiteralExpr) { + // skip + } else { + x.accept(this); + } + } } diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index 65e766d312..82406deb74 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -436,7 +436,7 @@ public class TableStat { SQLExpr owner = SQLUtils.toSQLExpr(table, dbType); hashCode64 = new SQLPropertyExpr(owner, name).hashCode64(); } else { - hashCode64 = FnvHash.fnv_64_lower(table, name); + hashCode64 = FnvHash.hashCode64(table, name); } } diff --git a/src/main/java/com/alibaba/druid/util/FnvConstants.java b/src/main/java/com/alibaba/druid/util/FnvConstants.java index c9f3aedbd3..5be5851b1f 100644 --- a/src/main/java/com/alibaba/druid/util/FnvConstants.java +++ b/src/main/java/com/alibaba/druid/util/FnvConstants.java @@ -15,148 +15,146 @@ */ package com.alibaba.druid.util; -import static com.alibaba.druid.util.FnvHash.fnv_64_lower; - public interface FnvConstants { - long HIGH_PRIORITY = fnv_64_lower("HIGH_PRIORITY"); - long DISTINCTROW = fnv_64_lower("DISTINCTROW"); - long STRAIGHT_JOIN = fnv_64_lower("STRAIGHT_JOIN"); - long SQL_SMALL_RESULT = fnv_64_lower("SQL_SMALL_RESULT"); - long SQL_BIG_RESULT = fnv_64_lower("SQL_BIG_RESULT"); - long SQL_BUFFER_RESULT = fnv_64_lower("SQL_BUFFER_RESULT"); - long SQL_CACHE = fnv_64_lower("SQL_CACHE"); - long SQL_NO_CACHE = fnv_64_lower("SQL_NO_CACHE"); - long SQL_CALC_FOUND_ROWS = fnv_64_lower("SQL_CALC_FOUND_ROWS"); - long OUTFILE = fnv_64_lower("OUTFILE"); - long SETS = fnv_64_lower("SETS"); - long REGEXP = fnv_64_lower("REGEXP"); - long RLIKE = fnv_64_lower("RLIKE"); - long USING = fnv_64_lower("USING"); - long IGNORE = fnv_64_lower("IGNORE"); - long FORCE = fnv_64_lower("FORCE"); - long CROSS = fnv_64_lower("CROSS"); - long NATURAL = fnv_64_lower("NATURAL"); - long APPLY = fnv_64_lower("APPLY"); - long CONNECT = fnv_64_lower("CONNECT"); - long START = fnv_64_lower("START"); - long BTREE = fnv_64_lower("BTREE"); - long HASH = fnv_64_lower("HASH"); - long NO_WAIT = fnv_64_lower("NO_WAIT"); - long WAIT = fnv_64_lower("WAIT"); - long NOWAIT = fnv_64_lower("NOWAIT"); - long ERRORS = fnv_64_lower("ERRORS"); - long VALUE = fnv_64_lower("VALUE"); - long NEXT = fnv_64_lower("NEXT"); - long NEXTVAL = fnv_64_lower("NEXTVAL"); - long CURRVAL = fnv_64_lower("CURRVAL"); - long PREVVAL = fnv_64_lower("PREVVAL"); - long PREVIOUS = fnv_64_lower("PREVIOUS"); - long LOW_PRIORITY = fnv_64_lower("LOW_PRIORITY"); - long COMMIT_ON_SUCCESS = fnv_64_lower("COMMIT_ON_SUCCESS"); - long ROLLBACK_ON_FAIL = fnv_64_lower("ROLLBACK_ON_FAIL"); - long QUEUE_ON_PK = fnv_64_lower("QUEUE_ON_PK"); - long TARGET_AFFECT_ROW = fnv_64_lower("TARGET_AFFECT_ROW"); - long COLLATE = fnv_64_lower("COLLATE"); - long BOOLEAN = fnv_64_lower("BOOLEAN"); - long CHARSET = fnv_64_lower("CHARSET"); - long SEMI = fnv_64_lower("SEMI"); - long ANTI = fnv_64_lower("ANTI"); - long PRIOR = fnv_64_lower("PRIOR"); - long NOCYCLE = fnv_64_lower("NOCYCLE"); - long CONNECT_BY_ROOT = fnv_64_lower("CONNECT_BY_ROOT"); - long DATE = fnv_64_lower("DATE"); - long TIMESTAMP = fnv_64_lower("TIMESTAMP"); - long CURRENT = fnv_64_lower("CURRENT"); - long COUNT = fnv_64_lower("COUNT"); - long ROW_NUMBER = fnv_64_lower("ROW_NUMBER"); - long WM_CONAT = fnv_64_lower("WM_CONAT"); - long AVG = fnv_64_lower("AVG"); - long MAX = fnv_64_lower("MAX"); - long MIN = fnv_64_lower("MIN"); - long STDDEV = fnv_64_lower("STDDEV"); - long SUM = fnv_64_lower("SUM"); - long GROUP_CONCAT = fnv_64_lower("GROUP_CONCAT"); - long DEDUPLICATION = fnv_64_lower("DEDUPLICATION"); - long CONVERT = fnv_64_lower("CONVERT"); - long CHAR = fnv_64_lower("CHAR"); - long VARCHAR = fnv_64_lower("VARCHAR"); - long VARCHAR2 = fnv_64_lower("VARCHAR2"); - long NCHAR = fnv_64_lower("NCHAR"); - long NVARCHAR = fnv_64_lower("NVARCHAR"); - long NVARCHAR2 = fnv_64_lower("NVARCHAR2"); - long TINYTEXT = fnv_64_lower("TINYTEXT"); - long TEXT = fnv_64_lower("TEXT"); - long MEDIUMTEXT = fnv_64_lower("MEDIUMTEXT"); - long LONGTEXT = fnv_64_lower("LONGTEXT"); - long TRIM = fnv_64_lower("TRIM"); - long LEADING = fnv_64_lower("LEADING"); - long BOTH = fnv_64_lower("BOTH"); - long TRAILING = fnv_64_lower("TRAILING"); - long MOD = fnv_64_lower("MOD"); - long MATCH = fnv_64_lower("MATCH"); - long EXTRACT = fnv_64_lower("EXTRACT"); - long POSITION = fnv_64_lower("POSITION"); - long DUAL = fnv_64_lower("DUAL"); - long LEVEL = fnv_64_lower("LEVEL"); - long CONNECT_BY_ISCYCLE = fnv_64_lower("CONNECT_BY_ISCYCLE"); - long CURRENT_TIMESTAMP = fnv_64_lower("CURRENT_TIMESTAMP"); - long FALSE = fnv_64_lower("FALSE"); - long TRUE = fnv_64_lower("TRUE"); - long SET = fnv_64_lower("SET"); - long LESS = fnv_64_lower("LESS"); - long MAXVALUE = fnv_64_lower("MAXVALUE"); - long OFFSET = fnv_64_lower("OFFSET"); - long RAW = fnv_64_lower("RAW"); - long LONG = fnv_64_lower("LONG"); - long ROWNUM = fnv_64_lower("ROWNUM"); - long PRECISION = fnv_64_lower("PRECISION"); - long DOUBLE = fnv_64_lower("DOUBLE"); - long WITHOUT = fnv_64_lower("WITHOUT"); + long HIGH_PRIORITY = FnvHash.fnv1a_64_lower("HIGH_PRIORITY"); + long DISTINCTROW = FnvHash.fnv1a_64_lower("DISTINCTROW"); + long STRAIGHT_JOIN = FnvHash.fnv1a_64_lower("STRAIGHT_JOIN"); + long SQL_SMALL_RESULT = FnvHash.fnv1a_64_lower("SQL_SMALL_RESULT"); + long SQL_BIG_RESULT = FnvHash.fnv1a_64_lower("SQL_BIG_RESULT"); + long SQL_BUFFER_RESULT = FnvHash.fnv1a_64_lower("SQL_BUFFER_RESULT"); + long SQL_CACHE = FnvHash.fnv1a_64_lower("SQL_CACHE"); + long SQL_NO_CACHE = FnvHash.fnv1a_64_lower("SQL_NO_CACHE"); + long SQL_CALC_FOUND_ROWS = FnvHash.fnv1a_64_lower("SQL_CALC_FOUND_ROWS"); + long OUTFILE = FnvHash.fnv1a_64_lower("OUTFILE"); + long SETS = FnvHash.fnv1a_64_lower("SETS"); + long REGEXP = FnvHash.fnv1a_64_lower("REGEXP"); + long RLIKE = FnvHash.fnv1a_64_lower("RLIKE"); + long USING = FnvHash.fnv1a_64_lower("USING"); + long IGNORE = FnvHash.fnv1a_64_lower("IGNORE"); + long FORCE = FnvHash.fnv1a_64_lower("FORCE"); + long CROSS = FnvHash.fnv1a_64_lower("CROSS"); + long NATURAL = FnvHash.fnv1a_64_lower("NATURAL"); + long APPLY = FnvHash.fnv1a_64_lower("APPLY"); + long CONNECT = FnvHash.fnv1a_64_lower("CONNECT"); + long START = FnvHash.fnv1a_64_lower("START"); + long BTREE = FnvHash.fnv1a_64_lower("BTREE"); + long HASH = FnvHash.fnv1a_64_lower("HASH"); + long NO_WAIT = FnvHash.fnv1a_64_lower("NO_WAIT"); + long WAIT = FnvHash.fnv1a_64_lower("WAIT"); + long NOWAIT = FnvHash.fnv1a_64_lower("NOWAIT"); + long ERRORS = FnvHash.fnv1a_64_lower("ERRORS"); + long VALUE = FnvHash.fnv1a_64_lower("VALUE"); + long NEXT = FnvHash.fnv1a_64_lower("NEXT"); + long NEXTVAL = FnvHash.fnv1a_64_lower("NEXTVAL"); + long CURRVAL = FnvHash.fnv1a_64_lower("CURRVAL"); + long PREVVAL = FnvHash.fnv1a_64_lower("PREVVAL"); + long PREVIOUS = FnvHash.fnv1a_64_lower("PREVIOUS"); + long LOW_PRIORITY = FnvHash.fnv1a_64_lower("LOW_PRIORITY"); + long COMMIT_ON_SUCCESS = FnvHash.fnv1a_64_lower("COMMIT_ON_SUCCESS"); + long ROLLBACK_ON_FAIL = FnvHash.fnv1a_64_lower("ROLLBACK_ON_FAIL"); + long QUEUE_ON_PK = FnvHash.fnv1a_64_lower("QUEUE_ON_PK"); + long TARGET_AFFECT_ROW = FnvHash.fnv1a_64_lower("TARGET_AFFECT_ROW"); + long COLLATE = FnvHash.fnv1a_64_lower("COLLATE"); + long BOOLEAN = FnvHash.fnv1a_64_lower("BOOLEAN"); + long CHARSET = FnvHash.fnv1a_64_lower("CHARSET"); + long SEMI = FnvHash.fnv1a_64_lower("SEMI"); + long ANTI = FnvHash.fnv1a_64_lower("ANTI"); + long PRIOR = FnvHash.fnv1a_64_lower("PRIOR"); + long NOCYCLE = FnvHash.fnv1a_64_lower("NOCYCLE"); + long CONNECT_BY_ROOT = FnvHash.fnv1a_64_lower("CONNECT_BY_ROOT"); + long DATE = FnvHash.fnv1a_64_lower("DATE"); + long TIMESTAMP = FnvHash.fnv1a_64_lower("TIMESTAMP"); + long CURRENT = FnvHash.fnv1a_64_lower("CURRENT"); + long COUNT = FnvHash.fnv1a_64_lower("COUNT"); + long ROW_NUMBER = FnvHash.fnv1a_64_lower("ROW_NUMBER"); + long WM_CONAT = FnvHash.fnv1a_64_lower("WM_CONAT"); + long AVG = FnvHash.fnv1a_64_lower("AVG"); + long MAX = FnvHash.fnv1a_64_lower("MAX"); + long MIN = FnvHash.fnv1a_64_lower("MIN"); + long STDDEV = FnvHash.fnv1a_64_lower("STDDEV"); + long SUM = FnvHash.fnv1a_64_lower("SUM"); + long GROUP_CONCAT = FnvHash.fnv1a_64_lower("GROUP_CONCAT"); + long DEDUPLICATION = FnvHash.fnv1a_64_lower("DEDUPLICATION"); + long CONVERT = FnvHash.fnv1a_64_lower("CONVERT"); + long CHAR = FnvHash.fnv1a_64_lower("CHAR"); + long VARCHAR = FnvHash.fnv1a_64_lower("VARCHAR"); + long VARCHAR2 = FnvHash.fnv1a_64_lower("VARCHAR2"); + long NCHAR = FnvHash.fnv1a_64_lower("NCHAR"); + long NVARCHAR = FnvHash.fnv1a_64_lower("NVARCHAR"); + long NVARCHAR2 = FnvHash.fnv1a_64_lower("NVARCHAR2"); + long TINYTEXT = FnvHash.fnv1a_64_lower("TINYTEXT"); + long TEXT = FnvHash.fnv1a_64_lower("TEXT"); + long MEDIUMTEXT = FnvHash.fnv1a_64_lower("MEDIUMTEXT"); + long LONGTEXT = FnvHash.fnv1a_64_lower("LONGTEXT"); + long TRIM = FnvHash.fnv1a_64_lower("TRIM"); + long LEADING = FnvHash.fnv1a_64_lower("LEADING"); + long BOTH = FnvHash.fnv1a_64_lower("BOTH"); + long TRAILING = FnvHash.fnv1a_64_lower("TRAILING"); + long MOD = FnvHash.fnv1a_64_lower("MOD"); + long MATCH = FnvHash.fnv1a_64_lower("MATCH"); + long EXTRACT = FnvHash.fnv1a_64_lower("EXTRACT"); + long POSITION = FnvHash.fnv1a_64_lower("POSITION"); + long DUAL = FnvHash.fnv1a_64_lower("DUAL"); + long LEVEL = FnvHash.fnv1a_64_lower("LEVEL"); + long CONNECT_BY_ISCYCLE = FnvHash.fnv1a_64_lower("CONNECT_BY_ISCYCLE"); + long CURRENT_TIMESTAMP = FnvHash.fnv1a_64_lower("CURRENT_TIMESTAMP"); + long FALSE = FnvHash.fnv1a_64_lower("FALSE"); + long TRUE = FnvHash.fnv1a_64_lower("TRUE"); + long SET = FnvHash.fnv1a_64_lower("SET"); + long LESS = FnvHash.fnv1a_64_lower("LESS"); + long MAXVALUE = FnvHash.fnv1a_64_lower("MAXVALUE"); + long OFFSET = FnvHash.fnv1a_64_lower("OFFSET"); + long RAW = FnvHash.fnv1a_64_lower("RAW"); + long LONG = FnvHash.fnv1a_64_lower("LONG"); + long ROWNUM = FnvHash.fnv1a_64_lower("ROWNUM"); + long PRECISION = FnvHash.fnv1a_64_lower("PRECISION"); + long DOUBLE = FnvHash.fnv1a_64_lower("DOUBLE"); + long WITHOUT = FnvHash.fnv1a_64_lower("WITHOUT"); - long DEFINER = fnv_64_lower("DEFINER"); - long DETERMINISTIC = fnv_64_lower("DETERMINISTIC"); - long CONTAINS = fnv_64_lower("CONTAINS"); - long SQL = fnv_64_lower("SQL"); - long CALL = fnv_64_lower("CALL"); - long CHARACTER = fnv_64_lower("CHARACTER"); + long DEFINER = FnvHash.fnv1a_64_lower("DEFINER"); + long DETERMINISTIC = FnvHash.fnv1a_64_lower("DETERMINISTIC"); + long CONTAINS = FnvHash.fnv1a_64_lower("CONTAINS"); + long SQL = FnvHash.fnv1a_64_lower("SQL"); + long CALL = FnvHash.fnv1a_64_lower("CALL"); + long CHARACTER = FnvHash.fnv1a_64_lower("CHARACTER"); - long VALIDATE = fnv_64_lower("VALIDATE"); - long NOVALIDATE = fnv_64_lower("NOVALIDATE"); - long SIMILAR = fnv_64_lower("SIMILAR"); - long CASCADE = fnv_64_lower("CASCADE"); - long RELY = fnv_64_lower("RELY"); - long NORELY = fnv_64_lower("NORELY"); - long ROW = fnv_64_lower("ROW"); - long ROWS = fnv_64_lower("ROWS"); - long RANGE = fnv_64_lower("RANGE"); - long PRECEDING = fnv_64_lower("PRECEDING"); - long FOLLOWING = fnv_64_lower("FOLLOWING"); - long UNBOUNDED = fnv_64_lower("UNBOUNDED"); - long SIBLINGS = fnv_64_lower("SIBLINGS"); - long NULLS = fnv_64_lower("NULLS"); - long FIRST = fnv_64_lower("FIRST"); - long LAST = fnv_64_lower("LAST"); - long AUTO_INCREMENT = fnv_64_lower("AUTO_INCREMENT"); - long STORAGE = fnv_64_lower("STORAGE"); - long STORED = fnv_64_lower("STORED"); - long VIRTUAL = fnv_64_lower("VIRTUAL"); - long UNSIGNED = fnv_64_lower("UNSIGNED"); - long ZEROFILL = fnv_64_lower("ZEROFILL"); - long GLOBAL = fnv_64_lower("GLOBAL"); - long SESSION = fnv_64_lower("SESSION"); - long NAMES = fnv_64_lower("NAMES"); - long PARTIAL = fnv_64_lower("PARTIAL"); - long SIMPLE = fnv_64_lower("SIMPLE"); - long RESTRICT = fnv_64_lower("RESTRICT"); - long ON = fnv_64_lower("ON"); - long ACTION = fnv_64_lower("ACTION"); - long SEPARATOR = fnv_64_lower("SEPARATOR"); - long DATA = fnv_64_lower("DATA"); - long MAX_ROWS = fnv_64_lower("MAX_ROWS"); - long MIN_ROWS = fnv_64_lower("MIN_ROWS"); - long ENGINE = fnv_64_lower("ENGINE"); - long SKIP = fnv_64_lower("SKIP"); - long RECURSIVE = fnv_64_lower("RECURSIVE"); - long ROLLUP = fnv_64_lower("ROLLUP"); - long CUBE = fnv_64_lower("CUBE"); + long VALIDATE = FnvHash.fnv1a_64_lower("VALIDATE"); + long NOVALIDATE = FnvHash.fnv1a_64_lower("NOVALIDATE"); + long SIMILAR = FnvHash.fnv1a_64_lower("SIMILAR"); + long CASCADE = FnvHash.fnv1a_64_lower("CASCADE"); + long RELY = FnvHash.fnv1a_64_lower("RELY"); + long NORELY = FnvHash.fnv1a_64_lower("NORELY"); + long ROW = FnvHash.fnv1a_64_lower("ROW"); + long ROWS = FnvHash.fnv1a_64_lower("ROWS"); + long RANGE = FnvHash.fnv1a_64_lower("RANGE"); + long PRECEDING = FnvHash.fnv1a_64_lower("PRECEDING"); + long FOLLOWING = FnvHash.fnv1a_64_lower("FOLLOWING"); + long UNBOUNDED = FnvHash.fnv1a_64_lower("UNBOUNDED"); + long SIBLINGS = FnvHash.fnv1a_64_lower("SIBLINGS"); + long NULLS = FnvHash.fnv1a_64_lower("NULLS"); + long FIRST = FnvHash.fnv1a_64_lower("FIRST"); + long LAST = FnvHash.fnv1a_64_lower("LAST"); + long AUTO_INCREMENT = FnvHash.fnv1a_64_lower("AUTO_INCREMENT"); + long STORAGE = FnvHash.fnv1a_64_lower("STORAGE"); + long STORED = FnvHash.fnv1a_64_lower("STORED"); + long VIRTUAL = FnvHash.fnv1a_64_lower("VIRTUAL"); + long UNSIGNED = FnvHash.fnv1a_64_lower("UNSIGNED"); + long ZEROFILL = FnvHash.fnv1a_64_lower("ZEROFILL"); + long GLOBAL = FnvHash.fnv1a_64_lower("GLOBAL"); + long SESSION = FnvHash.fnv1a_64_lower("SESSION"); + long NAMES = FnvHash.fnv1a_64_lower("NAMES"); + long PARTIAL = FnvHash.fnv1a_64_lower("PARTIAL"); + long SIMPLE = FnvHash.fnv1a_64_lower("SIMPLE"); + long RESTRICT = FnvHash.fnv1a_64_lower("RESTRICT"); + long ON = FnvHash.fnv1a_64_lower("ON"); + long ACTION = FnvHash.fnv1a_64_lower("ACTION"); + long SEPARATOR = FnvHash.fnv1a_64_lower("SEPARATOR"); + long DATA = FnvHash.fnv1a_64_lower("DATA"); + long MAX_ROWS = FnvHash.fnv1a_64_lower("MAX_ROWS"); + long MIN_ROWS = FnvHash.fnv1a_64_lower("MIN_ROWS"); + long ENGINE = FnvHash.fnv1a_64_lower("ENGINE"); + long SKIP = FnvHash.fnv1a_64_lower("SKIP"); + long RECURSIVE = FnvHash.fnv1a_64_lower("RECURSIVE"); + long ROLLUP = FnvHash.fnv1a_64_lower("ROLLUP"); + long CUBE = FnvHash.fnv1a_64_lower("CUBE"); } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 4e4739ce04..06c422d94e 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -21,7 +21,7 @@ public final class FnvHash { public final static long BASIC = 0xcbf29ce484222325L; public final static long PRIME = 0x100000001b3L; - public static long fnv_64(String input) { + public static long fnv1a_64(String input) { if (input == null) { return 0; } @@ -68,7 +68,7 @@ public final class FnvHash { } } - public static long fnv_64_lower(String key) { + public static long fnv1a_64_lower(String key) { long hashCode = BASIC; for (int i = 0; i < key.length(); ++i) { char ch = key.charAt(i); @@ -156,10 +156,10 @@ public final class FnvHash { return hashCode; } - public static long[] fnv_64_lower(String[] strings, boolean sort) { + public static long[] fnv1a_64_lower(String[] strings, boolean sort) { long[] hashCodes = new long[strings.length]; for (int i = 0; i < strings.length; i++) { - hashCodes[i] = fnv_64_lower(strings[i]); + hashCodes[i] = fnv1a_64_lower(strings[i]); } if (sort) { Arrays.sort(hashCodes); @@ -167,7 +167,13 @@ public final class FnvHash { return hashCodes; } - public static long fnv_64_lower(String owner, String name) { + /** + * normalized & lower & fnv1a_64_hash + * @param owner + * @param name + * @return + */ + public static long hashCode64(String owner, String name) { long hashCode = BASIC; if (owner != null) { diff --git a/src/main/java/com/alibaba/druid/util/Utils.java b/src/main/java/com/alibaba/druid/util/Utils.java index 219c594420..fbc55f500d 100644 --- a/src/main/java/com/alibaba/druid/util/Utils.java +++ b/src/main/java/com/alibaba/druid/util/Utils.java @@ -407,11 +407,11 @@ public class Utils { } public static long fnv_64(String input) { - return FnvHash.fnv_64(input); + return FnvHash.fnv1a_64(input); } public static long fnv_64_lower(String key) { - return FnvHash.fnv_64_lower(key); + return FnvHash.fnv1a_64_lower(key); } public static long fnv_32_lower(String key) { diff --git a/src/test/java/com/alibaba/druid/benckmark/sql/MySqlParameterizedBenchmark.java b/src/test/java/com/alibaba/druid/benckmark/sql/MySqlParameterizedBenchmark.java index 042c10138a..687291e305 100644 --- a/src/test/java/com/alibaba/druid/benckmark/sql/MySqlParameterizedBenchmark.java +++ b/src/test/java/com/alibaba/druid/benckmark/sql/MySqlParameterizedBenchmark.java @@ -33,14 +33,14 @@ public class MySqlParameterizedBenchmark extends TestCase { // perf(sql3); // 15093 10392 10416 10154 10007 9126 8907 // perf(sql4); // 4429 4190 4023 3747 -// perf_parse(sql); // 4643 4377 4345 3801 3627 3228 2961 +// perf_parse(sql); // 4643 4377 4345 3801 3627 3228 2961 2959 // perf_parse(sql2); // 1918 1779 1666 1646 // perf_parse(sql3); // 9174 5875 5805 5536 5717 // perf_parse(sql4); // 2953 2502 - perf_stat(sql); // 11793 13628 13561 13259 9819 + perf_stat(sql); // 11793 13628 13561 13259 9946 7637 -// perf_resolve(sql); // 4970 4586 +// perf_resolve(sql); // 4970 4586 3600 } } public void perf(String sql) { 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 ad22b5282b..c81de8b919 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 @@ -32,7 +32,7 @@ public class HashTest_1_propertyExpr extends TestCase { public void test_issue_5() throws Exception { assertEquals( - FnvHash.fnv_64_lower("a.b"), + FnvHash.fnv1a_64_lower("a.b"), new SQLPropertyExpr("\"a\"","\"b\"") .hashCode64() ); @@ -40,7 +40,7 @@ public class HashTest_1_propertyExpr extends TestCase { public void test_issue_6() throws Exception { assertEquals( - FnvHash.fnv_64_lower("ESCROW.HT_TASK_TRADE_HISTORY_NEW"), + FnvHash.fnv1a_64_lower("ESCROW.HT_TASK_TRADE_HISTORY_NEW"), new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").hashCode64()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java index ed50efdb20..e45813c24a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java @@ -42,14 +42,15 @@ public class DB2SelectTest_10 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("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/db2/DB2SelectTest_12.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_12.java index 29c32079d3..c88bb2b4c7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_12.java @@ -36,25 +36,28 @@ public class DB2SelectTest_12 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()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("TASK_POLICE_QUERY_BATCH"))); Assert.assertTrue(visitor.getColumns().contains(new Column("TASK_POLICE_QUERY_BATCH", "STATUS"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("TASK_POLICE_QUERY_BATCH", "*"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("TASK_POLICE_QUERY_BATCH", "PRIORITY"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_22.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_22.java index c3592fb653..5c6a134226 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_22.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_22.java @@ -40,25 +40,30 @@ public class DB2SelectTest_22 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()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(4, visitor.getColumns().size()); + Assert.assertEquals(5, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("BUSINESS_ENTERPRISE_BUSIINFO"))); -// Assert.assertTrue(visitor.getColumns().contains(new Column("DSN8B10.EMP", "WORKDEPT"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("BUSINESS_ENTERPRISE_BUSIINFO", "ID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("BUSINESS_ENTERPRISE_BUSIINFO", "IDENTITY"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("BUSINESS_ENTERPRISE_BUSIINFO", "BUSICODE"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("BUSINESS_ENTERPRISE_BUSIINFO", "SYSCODE"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("BUSINESS_ENTERPRISE_BUSIINFO", "INTIME"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java index e49d3dc57f..b33a25fce8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_23.java @@ -46,11 +46,11 @@ public class DB2SelectTest_23 extends DB2Test { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dual"))); + Assert.assertFalse(visitor.getTables().containsKey(new TableStat.Name("dual"))); // 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_hierarchical_1.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java index 27525a737c..d91c9df5e1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_hierarchical_1.java @@ -65,7 +65,7 @@ public class DB2SelectTest_hierarchical_1 extends MysqlTest { assertEquals(1, visitor.getTables().size()); assertEquals(3, visitor.getColumns().size()); - assertEquals(0, visitor.getConditions().size()); + assertEquals(2, visitor.getConditions().size()); // assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); 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 cf351341ce..1b92390491 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 @@ -172,7 +172,7 @@ public class MySqlReplaceTest_1 extends MysqlTest { assertEquals(3, visitor.getTables().size()); assertEquals(12, visitor.getColumns().size()); - assertEquals(4, visitor.getConditions().size()); + assertEquals(6, visitor.getConditions().size()); assertTrue(visitor.containsTable("tb_001")); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_27.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_27.java index 2fc18e1501..89f1b63dbd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_27.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_27.java @@ -46,7 +46,7 @@ public class MySqlSelectTest_27 extends MysqlTest { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertEquals(0, visitor.getOrderByColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java index a7bfcb1550..f02b936fa2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_42_with_cte.java @@ -42,16 +42,25 @@ public class MySqlSelectTest_42_with_cte 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("coditions : " + visitor.getConditions()); -// System.out.println("orderBy : " + visitor.getOrderByColumns()); - -// Assert.assertEquals(1, visitor.getTables().size()); -// Assert.assertEquals(1, visitor.getColumns().size()); -// Assert.assertEquals(0, visitor.getConditions().size()); -// Assert.assertEquals(0, visitor.getOrderByColumns().size()); + 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(2, visitor.getTables().size()); + Assert.assertEquals(4, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getConditions().size()); + Assert.assertEquals(0, visitor.getOrderByColumns().size()); + + assertTrue(visitor.containsTable("table1")); + assertTrue(visitor.containsTable("table2")); + assertTrue(visitor.containsColumn("table1", "a")); + assertTrue(visitor.containsColumn("table1", "b")); + assertTrue(visitor.containsColumn("table2", "c")); + assertTrue(visitor.containsColumn("table2", "d")); + { String output = SQLUtils.toMySqlString(stmt); Assert.assertEquals("WITH cte1 AS (\n" + @@ -62,7 +71,7 @@ public class MySqlSelectTest_42_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT b, d\n" + + "SELECT cte1.b, cte2.d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // @@ -78,7 +87,7 @@ public class MySqlSelectTest_42_with_cte extends MysqlTest { "\t\tselect c, d\n" + "\t\tfrom table2\n" + "\t)\n" + - "select b, d\n" + + "select cte1.b, cte2.d\n" + "from cte1\n" + "\tjoin cte2\n" + "where cte1.a = cte2.c;", // @@ -95,7 +104,7 @@ public class MySqlSelectTest_42_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT b, d\n" + + "SELECT cte1.b, cte2.d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java index a8d9b0e2e7..61e6b36a60 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_43_with_cte.java @@ -62,7 +62,7 @@ public class MySqlSelectTest_43_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT b, d\n" + + "SELECT cte1.b, cte2.d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // @@ -78,7 +78,7 @@ public class MySqlSelectTest_43_with_cte extends MysqlTest { "\t\tselect c, d\n" + "\t\tfrom table2\n" + "\t)\n" + - "select b, d\n" + + "select cte1.b, cte2.d\n" + "from cte1\n" + "\tjoin cte2\n" + "where cte1.a = cte2.c;", // @@ -95,7 +95,7 @@ public class MySqlSelectTest_43_with_cte extends MysqlTest { "\t\tSELECT c, d\n" + "\t\tFROM table2\n" + "\t)\n" + - "SELECT b, d\n" + + "SELECT cte1.b, cte2.d\n" + "FROM cte1\n" + "\tJOIN cte2\n" + "WHERE cte1.a = cte2.c;", // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_crossjoin.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_crossjoin.java index 03fb94db7c..3ae1ad182f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_crossjoin.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_crossjoin.java @@ -35,6 +35,8 @@ public class MySqlSelectTest_crossjoin extends MysqlTest { MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); + + System.out.println(stmt); SQLSelectStatement selectStmt = (SQLSelectStatement) stmt; @@ -50,9 +52,9 @@ public class MySqlSelectTest_crossjoin extends MysqlTest { 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("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()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_group_concat.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_group_concat.java index 8b92cf3267..2b1bb35faa 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_group_concat.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_group_concat.java @@ -49,13 +49,20 @@ public class MySqlSelectTest_group_concat extends MysqlTest { MySqlSelectQueryBlock queryBlock = (MySqlSelectQueryBlock) select.getQuery(); Assert.assertNotNull(queryBlock.getOrderBy()); -// 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("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(4, visitor.getColumns().size()); Assert.assertEquals(2, visitor.getConditions().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java index b2cb8ede69..08830b92b9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java @@ -35,12 +35,14 @@ public class MySqlSchemaStatVisitorTest5 extends TestCase { // sql = "select columnName from table1 where id in (select id from table3 where name = ?)"; MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); Assert.assertEquals(1, statementList.size()); + System.out.println(stmt); + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println(sql); System.out.println("Tables : " + visitor.getTables()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest_Subquery.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest_Subquery.java index 8c373cfe73..4eb478598e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest_Subquery.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest_Subquery.java @@ -42,14 +42,13 @@ public class MySqlSchemaStatVisitorTest_Subquery extends TestCase { System.out.println(sql); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); - System.out.println("alias : " + visitor.getAliasMap()); System.out.println("conditions : " + visitor.getConditions()); Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(true, visitor.containsTable("users")); Assert.assertEquals(22, visitor.getConditions().get(0).getValues().get(0)); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(4, visitor.getColumns().size()); Assert.assertEquals(true, visitor.getColumns().contains(new Column("users", "id"))); Assert.assertEquals(true, visitor.getColumns().contains(new Column("users", "name"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java index c3c9071e5d..28472fa83c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest.java @@ -59,7 +59,7 @@ public class OceanbaseSelectTest extends MysqlTest { assertEquals(1, visitor.getTables().size()); assertEquals(3, visitor.getColumns().size()); - assertEquals(0, visitor.getConditions().size()); + assertEquals(3, visitor.getConditions().size()); // assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java index dfc62a7de9..7a978ab55e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseSelectTest_hierarchical_1.java @@ -65,7 +65,7 @@ public class OceanbaseSelectTest_hierarchical_1 extends MysqlTest { assertEquals(1, visitor.getTables().size()); assertEquals(3, visitor.getColumns().size()); - assertEquals(0, visitor.getConditions().size()); + assertEquals(2, visitor.getConditions().size()); // assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest14.java index 45f8c3cdff..368ed8f402 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest14.java @@ -48,7 +48,7 @@ public class OdpsSelectTest14 extends TestCase { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); Assert.assertEquals(1, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest15.java index a7b75289b2..83054a85d3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest15.java @@ -48,7 +48,7 @@ public class OdpsSelectTest15 extends TestCase { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest16.java index d9789c2cf0..27cc99db02 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest16.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest16.java @@ -48,7 +48,7 @@ public class OdpsSelectTest16 extends TestCase { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); 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 a1b998cde7..8f7bfc4cd2 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 @@ -136,6 +136,8 @@ public class OdpsSelectTest22 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); @@ -143,8 +145,8 @@ public class OdpsSelectTest22 extends TestCase { // 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("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(2, visitor.getTables().size()); assertEquals(15, visitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest23.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest23.java index adbcaf6931..9d071ee5c9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest23.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest23.java @@ -55,7 +55,7 @@ public class OdpsSelectTest23 extends TestCase { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - assertEquals(1, visitor.getTables().size()); + assertEquals(0, visitor.getTables().size()); assertEquals(1, visitor.getColumns().size()); assertEquals(0, visitor.getConditions().size()); 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 4d6ffc8769..6aef9d0b29 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 @@ -205,12 +205,12 @@ public class OdpsSelectTest24 extends TestCase { System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); -// System.out.println("coditions : " + visitor.getConditions()); + System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(3, visitor.getTables().size()); assertEquals(18, visitor.getColumns().size()); - assertEquals(12, visitor.getConditions().size()); + assertEquals(13, visitor.getConditions().size()); // System.out.println(SQLUtils.formatOdps(sql)); 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 e902bdc883..2723e645f2 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 @@ -133,7 +133,7 @@ public class OdpsSelectTest25 extends TestCase { assertEquals(2, visitor.getTables().size()); assertEquals(6, visitor.getColumns().size()); - assertEquals(2, visitor.getConditions().size()); + assertEquals(4, visitor.getConditions().size()); // System.out.println(SQLUtils.formatOdps(sql)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest30.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest30.java index a7c02b7176..6942fe5546 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest30.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest30.java @@ -49,7 +49,7 @@ public class OdpsSelectTest30 extends TestCase { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - assertEquals(1, visitor.getTables().size()); + assertEquals(0, visitor.getTables().size()); assertEquals(1, visitor.getColumns().size()); assertEquals(0, visitor.getConditions().size()); 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 dc71877404..bd3dfb19a3 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 @@ -32,6 +32,8 @@ public class OracleListAggTest1 extends OracleTest { SQLStatement stmt = statementList.get(0); // print(statementList); + System.out.println(stmt); + Assert.assertEquals(1, statementList.size()); Assert.assertEquals("SELECT COUNT(0)\n" + @@ -58,13 +60,13 @@ public class OracleListAggTest1 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(8, visitor.getColumns().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("WEP_USER_ROLE"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("WEP_ROLE"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("WEP_USER_ROLE", "IS_DELETED"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("WEP_ROLE", "IS_DELETED"))); + Assert.assertTrue(visitor.containsColumn("WEP_USER_ROLE", "IS_DELETED")); + Assert.assertTrue(visitor.containsColumn("WEP_ROLE", "IS_DELETED")); WallUtils.isValidateOracle(sql); } 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 b32ae314f9..b37cfd1623 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 @@ -38,13 +38,14 @@ public class OracleMergeTest6 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/block/OracleBlockTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest2.java index 33fce8ae93..68c25f3b53 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest2.java @@ -66,9 +66,11 @@ public class OracleBlockTest2 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("wl_ship_order"))); - Assert.assertEquals(4, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getColumns().size()); Assert.assertEquals(3, visitor.getConditions().size()); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("wl_ship_order", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("wl_ship_order", "forwarder_service"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("wl_ship_order", "status"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java index 193905e1b1..2c582c91ed 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java @@ -69,9 +69,13 @@ public class OracleBlockTest5 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tab_ipay_out_order_ids"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ipay_contract"))); - Assert.assertEquals(6, visitor.getColumns().size()); + Assert.assertEquals(5, visitor.getColumns().size()); Assert.assertEquals(3, visitor.getConditions().size()); -// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.containsColumn("escrow_trade", "id")); + Assert.assertTrue(visitor.containsColumn("escrow_trade", "out_order_id")); + Assert.assertTrue(visitor.containsColumn("tab_ipay_out_order_ids", "out_order_id")); + Assert.assertTrue(visitor.containsColumn("ipay_contract", "is_chargeback")); + Assert.assertTrue(visitor.containsColumn("ipay_contract", "out_ref")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_0.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_0.java index 3527104911..a765906205 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_0.java @@ -44,15 +44,19 @@ public class Oracle_pl_0 extends OracleTest { statement.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()); + 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("relationships : " + visitor.getRelationships()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals(1, visitor.getTables().size()); + assertEquals(1, visitor.getColumns().size()); -// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + assertTrue(visitor.containsTable("employees")); + assertTrue(visitor.containsColumn("employees", "employee_id")); // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name"))); // Assert.assertEquals(7, visitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest15.java index a493f7e8d0..39bbac4fc2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest15.java @@ -46,9 +46,9 @@ public class OracleSelectTest15 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("DUAL"))); + Assert.assertFalse(visitor.getTables().containsKey(new TableStat.Name("DUAL"))); Assert.assertEquals(0, visitor.getColumns().size()); 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 60c513c437..18cebaf38b 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 @@ -56,7 +56,7 @@ 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(18, visitor.getColumns().size()); + Assert.assertEquals(17, visitor.getColumns().size()); Assert.assertTrue(visitor.containsColumn("search.retl_table_config_search", "tid")); Assert.assertTrue(visitor.containsColumn("dba_objects", "owner")); 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 d7cea37c57..e1a174f2d0 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 @@ -52,7 +52,8 @@ public class OracleSelectTest40 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); - print(statementList); + + System.out.println(stmt); Assert.assertEquals(1, statementList.size()); @@ -67,7 +68,7 @@ public class OracleSelectTest40 extends OracleTest { Assert.assertEquals(6, visitor.getTables().size()); - Assert.assertEquals(19, visitor.getColumns().size()); + Assert.assertEquals(18, 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/OracleSelectTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest5.java index 9b4b997851..610b632bc7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest5.java @@ -46,10 +46,10 @@ public class OracleSelectTest5 extends OracleTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("relationships : " + visitor.getRelationships()); - Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getTables().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("hr_info"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("hr_info.people"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("hr_info.people"))); Assert.assertEquals(3, visitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest26.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest26.java index 5fbb4133f3..50c963f84d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest26.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest26.java @@ -50,6 +50,6 @@ public class PGSelectTest26 extends PGTest { // System.out.println("coditions : " + visitor.getConditions()); Assert.assertEquals(0, visitor.getColumns().size()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest27.java index e7e44df5e3..4e0cbe30d2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest27.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest27.java @@ -50,6 +50,6 @@ public class PGSelectTest27 extends PGTest { // System.out.println("coditions : " + visitor.getConditions()); Assert.assertEquals(0, visitor.getColumns().size()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest28.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest28.java index ac7d444e10..b5bd9651c3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest28.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest28.java @@ -50,6 +50,6 @@ public class PGSelectTest28 extends PGTest { // System.out.println("coditions : " + visitor.getConditions()); Assert.assertEquals(0, visitor.getColumns().size()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest29.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest29.java index 06b9d59268..ad8075b902 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest29.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest29.java @@ -50,6 +50,6 @@ public class PGSelectTest29 extends PGTest { // System.out.println("coditions : " + visitor.getConditions()); Assert.assertEquals(0, visitor.getColumns().size()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest31.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest31.java index 1fa9d7b894..f5a634fe59 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest31.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest31.java @@ -51,6 +51,6 @@ public class PGSelectTest31 extends PGTest { // System.out.println("coditions : " + visitor.getConditions()); Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest49.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest49.java index 525db2b9f3..95e94142ed 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest49.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest49.java @@ -37,6 +37,8 @@ public class PGSelectTest49 extends TestCase { List stmtList = SQLUtils.parseStatements(sql, dbType); SQLStatement stmt = stmtList.get(0); + System.out.println(stmt); + assertEquals("WITH sel AS (\n" + "\t\tSELECT unnest(ARRAY[4275]) AS gdid, unnest(ARRAY[1]) AS gdnumber\n" + "\t)\n" + @@ -58,8 +60,8 @@ public class PGSelectTest49 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()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest51.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest51.java index f5c2425a18..a98803239b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest51.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest51.java @@ -107,9 +107,9 @@ public class PGSelectTest51 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("coditions : " + visitor.getConditions()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); assertEquals(15, visitor.getColumns().size()); assertEquals(2, visitor.getTables().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest11.java index 08fe643fe5..0379c1358f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest11.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest11.java @@ -21,6 +21,8 @@ public class SchemaStatTest11 extends TestCase { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); SQLStatement stmt = parser.parseStatementList().get(0); + System.out.println(stmt); + SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType); stmt.accept(statVisitor); @@ -29,8 +31,8 @@ public class SchemaStatTest11 extends TestCase { System.out.println(relationship); // table1.id = table2.id } -// System.out.println(statVisitor.getColumns()); -// System.out.println(statVisitor.getGroupByColumns()); // group by + System.out.println(statVisitor.getColumns()); + System.out.println(statVisitor.getGroupByColumns()); // group by System.out.println("relationships : " + statVisitor.getRelationships()); // group by System.out.println(statVisitor.getConditions()); assertEquals(1, relationships.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 1c5e66cfdd..704ba30afd 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 @@ -36,6 +36,8 @@ public class SchemaStatTest12 extends TestCase { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); SQLStatement stmt = parser.parseStatementList().get(0); + System.out.println(stmt); + SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType); stmt.accept(statVisitor); @@ -44,14 +46,15 @@ public class SchemaStatTest12 extends TestCase { System.out.println(relationship); // table1.id = table2.id } -// System.out.println(statVisitor.getColumns()); -// System.out.println(statVisitor.getGroupByColumns()); // group by - System.out.println("relationships : " + statVisitor.getRelationships()); // group by - System.out.println(statVisitor.getConditions()); + System.out.println("columns : " + statVisitor.getColumns()); + System.out.println("group by : " + statVisitor.getGroupByColumns()); + System.out.println("relationships : " + statVisitor.getRelationships()); + System.out.println("conditions : " + statVisitor.getConditions()); + System.out.println("functionns : " + statVisitor.getFunctions()); assertEquals(3, relationships.size()); - Assert.assertEquals(22, statVisitor.getColumns().size()); - Assert.assertEquals(20, statVisitor.getConditions().size()); + Assert.assertEquals(21, statVisitor.getColumns().size()); + Assert.assertEquals(19, statVisitor.getConditions().size()); assertEquals(1, statVisitor.getFunctions().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest13.java index e7eda98128..8b7e1a2cc7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest13.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest13.java @@ -21,18 +21,17 @@ public class SchemaStatTest13 extends TestCase { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); SQLStatement stmt = parser.parseStatementList().get(0); + System.out.println(stmt); + SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType); stmt.accept(statVisitor); Set relationships = statVisitor.getRelationships(); - for (TableStat.Relationship relationship : relationships) { - System.out.println(relationship); // table1.id = table2.id - } -// System.out.println(statVisitor.getColumns()); -// System.out.println(statVisitor.getGroupByColumns()); // group by + System.out.println("columns : " + statVisitor.getColumns()); + System.out.println("groups : " + statVisitor.getGroupByColumns()); // group by System.out.println("relationships : " + statVisitor.getRelationships()); // group by - System.out.println(statVisitor.getConditions()); + System.out.println("conditions : " + statVisitor.getConditions()); assertEquals(2, relationships.size()); Assert.assertEquals(5, statVisitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest14.java index 70e5ce2d95..f4400d27c3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest14.java @@ -21,6 +21,8 @@ public class SchemaStatTest14 extends TestCase { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); SQLStatement stmt = parser.parseStatementList().get(0); + System.out.println(stmt); + SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType); stmt.accept(statVisitor);