From fd20785f6b5bf83b942c3f31aab05742aa4f71d9 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 29 Aug 2017 21:15:09 +0800 Subject: [PATCH] improved sql parser. --- .../alibaba/druid/sql/ast/SQLDataType.java | 2 + .../druid/sql/ast/SQLDataTypeImpl.java | 18 +- .../com/alibaba/druid/sql/ast/SQLName.java | 9 +- .../druid/sql/ast/expr/SQLAggregateExpr.java | 22 +- .../druid/sql/ast/expr/SQLIdentifierExpr.java | 16 +- .../druid/sql/ast/expr/SQLPropertyExpr.java | 83 +++-- .../sql/ast/statement/SQLBlockStatement.java | 2 +- .../ast/statement/SQLCharacterDataType.java | 2 +- .../SQLCreateProcedureStatement.java | 2 +- .../statement/SQLCreateTableStatement.java | 9 +- .../sql/ast/statement/SQLExprTableSource.java | 17 +- .../sql/ast/statement/SQLJoinTableSource.java | 11 +- .../sql/ast/statement/SQLSelectItem.java | 16 +- .../ast/statement/SQLSelectQueryBlock.java | 7 +- .../sql/ast/statement/SQLTableSource.java | 1 + .../sql/ast/statement/SQLTableSourceImpl.java | 26 +- .../ast/statement/SQLWithSubqueryClause.java | 5 +- .../sql/dialect/db2/parser/DB2ExprParser.java | 24 +- .../dialect/mysql/ast/expr/MySqlUserName.java | 54 ++- .../dialect/mysql/parser/MySqlExprParser.java | 88 ++--- .../mysql/parser/MySqlSelectParser.java | 42 +-- .../mysql/parser/MySqlStatementParser.java | 22 +- .../mysql/visitor/MySqlSchemaStatVisitor.java | 7 +- .../odps/ast/OdpsLateralViewTableSource.java | 7 +- .../dialect/odps/parser/OdpsExprParser.java | 6 +- .../oracle/ast/expr/OracleDbLinkExpr.java | 53 +-- .../oracle/parser/OracleExprParser.java | 30 +- .../visitor/OracleToMySqlOutputVisitor.java | 5 +- .../postgresql/parser/PGExprParser.java | 6 +- .../expr/SQLServerObjectReferenceExpr.java | 51 ++- .../sqlserver/parser/SQLServerExprParser.java | 6 +- .../com/alibaba/druid/sql/parser/Lexer.java | 6 +- .../druid/sql/parser/SQLExprParser.java | 167 ++++----- .../druid/sql/parser/SQLSelectParser.java | 69 ++-- .../sql/repository/SchemaObjectImpl.java | 4 +- .../sql/repository/SchemaResolveVisitor.java | 5 +- .../SchemaResolveVisitorFactory.java | 26 +- .../druid/sql/visitor/SchemaStatVisitor.java | 24 +- .../com/alibaba/druid/stat/TableStat.java | 19 +- .../java/com/alibaba/druid/util/FNVUtils.java | 327 ------------------ .../com/alibaba/druid/util/FnvConstants.java | 147 ++++++++ .../java/com/alibaba/druid/util/FnvHash.java | 241 +++++++++++++ .../java/com/alibaba/druid/util/PGUtils.java | 2 +- .../java/com/alibaba/druid/util/Utils.java | 8 +- .../druid/wall/spi/WallVisitorUtils.java | 4 +- .../sql/MySqlParameterizedBenchmark.java | 2 +- .../com/alibaba/druid/bvt/sql/HashTest_0.java | 12 +- .../bvt/sql/HashTest_1_propertyExpr.java | 29 +- 48 files changed, 894 insertions(+), 847 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/util/FNVUtils.java create mode 100644 src/main/java/com/alibaba/druid/util/FnvConstants.java create mode 100644 src/main/java/com/alibaba/druid/util/FnvHash.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java index a62752e191..464f941e7e 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java @@ -21,6 +21,8 @@ public interface SQLDataType extends SQLObject { String getName(); + long nameHashCode64(); + void setName(String name); List getArguments(); diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java index 3a1562e768..368c31561a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java @@ -17,24 +17,24 @@ package com.alibaba.druid.sql.ast; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import com.alibaba.druid.util.FnvHash; import java.util.ArrayList; import java.util.List; public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType { - protected String name; + private String name; + private long nameHashCode64; protected final List arguments = new ArrayList(); - private Boolean withTimeZone; - - private boolean withLocalTimeZone = false; + private Boolean withTimeZone; + private boolean withLocalTimeZone = false; public SQLDataTypeImpl(){ } public SQLDataTypeImpl(String name){ - this.name = name; } @@ -62,8 +62,16 @@ public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType { return this.name; } + public long nameHashCode64() { + if (nameHashCode64 == 0) { + nameHashCode64 = FnvHash.hashCode64(name); + } + return nameHashCode64; + } + public void setName(String name) { this.name = name; + nameHashCode64 = 0L; } public List getArguments() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLName.java b/src/main/java/com/alibaba/druid/sql/ast/SQLName.java index cce3952f68..87a701995a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLName.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLName.java @@ -16,11 +16,8 @@ package com.alibaba.druid.sql.ast; public interface SQLName extends SQLExpr { - String getSimpleName(); - + String getSimpleName(); SQLName clone(); - - long name_hash_lower(); - - long hashCode64(); + long nameHashCode64(); + long hashCode64(); } 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 f35d115a15..9776cd858a 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 @@ -22,11 +22,16 @@ import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import com.alibaba.druid.util.FnvConstants; +import com.alibaba.druid.util.FnvHash; public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLReplaceable { private static final long serialVersionUID = 1L; + protected String methodName; + protected long methodNameHashCod64; + protected SQLAggregateOption option; protected final List arguments = new ArrayList(); protected SQLKeep keep; @@ -51,6 +56,13 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe this.methodName = methodName; } + public long methodNameHashCod64() { + if (methodNameHashCod64 == 0) { + methodNameHashCod64 = FnvHash.hashCode64(methodName); + } + return methodNameHashCod64; + } + public SQLOrderBy getWithinGroup() { return withinGroup; } @@ -204,8 +216,10 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe } public SQLDataType computeDataType() { - if ("count".equals(methodName) - || "row_number".equals(methodName)) { + long hash = methodNameHashCod64(); + + if (hash == FnvConstants.COUNT + || hash == FnvConstants.ROW_NUMBER) { return SQLIntegerExpr.DEFAULT_DATA_TYPE; } @@ -216,8 +230,8 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe } } - if ("wm_conat".equals(methodName) - || "group_concat".equals(methodName)) { + if (hash == FnvConstants.WM_CONAT + || hash == FnvConstants.GROUP_CONCAT) { return SQLCharExpr.DEFAULT_DATA_TYPE; } 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 5822f15ac1..4d84009076 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 @@ -19,14 +19,12 @@ import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { - - protected String name; - - private transient String lowerName; - protected transient long hashCode64; + protected String name; + private transient String lowerName; + private transient long hashCode64; private transient SQLObject resolvedColumn; private transient SQLObject resolvedOwnerObject; @@ -65,7 +63,7 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { return lowerName; } - public long name_hash_lower() { + public long nameHashCode64() { return hashCode64(); } @@ -73,7 +71,7 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { public long hashCode64() { if (hashCode64 == 0 && name != null) { - hashCode64 = FNVUtils.fnv_64_lower_normalized(name); + hashCode64 = FnvHash.hashCode64(name); } return hashCode64; } @@ -186,7 +184,7 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { if (queryBlock == null) { return null; } - SQLSelectItem selectItem = queryBlock.findSelectItem(name_hash_lower()); + SQLSelectItem selectItem = queryBlock.findSelectItem(nameHashCode64()); if (selectItem != null) { return selectItem.computeDataType(); } 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 edf9b50192..a863b77549 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 @@ -18,23 +18,19 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.statement.*; -import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLPropertyExpr extends SQLExprImpl implements SQLName { + private SQLExpr owner; + private String name; - private SQLExpr owner; - private String name; - - protected long name_hash_lower; + private transient long nameHashCod64; + private transient long hashCode64; private transient SQLColumnDefinition resolvedColumn; - private transient SQLObject resolvedTableSource; - private transient long hash_ower; - public SQLPropertyExpr(String owner, String name){ this(new SQLIdentifierExpr(owner), name); } @@ -44,10 +40,10 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { this.name = name; } - public SQLPropertyExpr(SQLExpr owner, String name, long name_hash_lower){ + public SQLPropertyExpr(SQLExpr owner, String name, long nameHashCod64){ setOwner(owner); this.name = name; - this.name_hash_lower = name_hash_lower; + this.nameHashCod64 = nameHashCod64; } public SQLPropertyExpr(){ @@ -75,7 +71,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { owner.setParent(this); } this.owner = owner; - this.hash_ower = 0; + this.hashCode64 = 0; } public void setOwner(String owner) { @@ -88,8 +84,8 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { public void setName(String name) { this.name = name; - this.hash_ower = 0; - this.name_hash_lower = 0; + this.hashCode64 = 0; + this.nameHashCod64 = 0; } public void output(StringBuffer buf) { @@ -113,10 +109,26 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { } public long hashCode64() { - if (hash_ower == 0) { - hash_ower = FNVUtils.fnv_64_lower(this); + if (hashCode64 == 0) { + long hash; + if (owner instanceof SQLName) { + hash = ((SQLName) owner).hashCode64(); + + hash ^= '.'; + hash *= FnvHash.PRIME; + } else if (owner == null){ + hash = FnvHash.BASIC; + } else { + hash = FnvHash.fnv_64_lower(owner.toString()); + + hash ^= '.'; + hash *= FnvHash.PRIME; + } + hash = FnvHash.hashCode64(hash, name); + hashCode64 = hash; } - return hash_ower; + + return hashCode64; } @Override @@ -149,12 +161,14 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { } public SQLPropertyExpr clone() { - SQLPropertyExpr x = new SQLPropertyExpr(); - x.name = this.name; + SQLExpr owner_x = null; if (owner != null) { - x.setOwner(owner.clone()); + owner_x = owner.clone(); } + SQLPropertyExpr x = new SQLPropertyExpr(owner_x, name, nameHashCod64); + + x.hashCode64 = hashCode64; x.resolvedColumn = resolvedColumn; x.resolvedTableSource = resolvedTableSource; @@ -169,31 +183,12 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { return false; } - public long name_hash_lower() { - if (name_hash_lower == 0 + public long nameHashCode64() { + if (nameHashCod64 == 0 && name != null) { - final int len = name.length(); - - boolean quote = false; - - String name = this.name; - if (len > 2) { - char c0 = name.charAt(0); - char c1 = name.charAt(len - 1); - if ((c0 == '`' && c1 == '`') - || (c0 == '"' && c1 == '"') - || (c0 == '\'' && c1 == '\'') - || (c0 == '[' && c1 == ']')) { - quote = true; - } - } - if (quote) { - name_hash_lower = FNVUtils.fnv_64_lower(name, 1, len -1); - } else { - name_hash_lower = FNVUtils.fnv_64_lower(name); - } + nameHashCod64 = FnvHash.hashCode64(name); } - return name_hash_lower; + return nameHashCod64; } public String normalizedName() { @@ -258,7 +253,7 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { if (queryBlock == null) { return null; } - SQLSelectItem selectItem = queryBlock.findSelectItem(name_hash_lower()); + SQLSelectItem selectItem = queryBlock.findSelectItem(nameHashCode64()); if (selectItem != null) { return selectItem.computeDataType(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java index a5414c60d9..abfbbab37c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLBlockStatement.java @@ -117,7 +117,7 @@ public class SQLBlockStatement extends SQLStatementImpl { public SQLParameter findParameter(long hash) { for (SQLParameter param : this.parameters) { - if (param.getName().name_hash_lower() == hash) { + if (param.getName().nameHashCode64() == hash) { return param; } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCharacterDataType.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCharacterDataType.java index 2ecdd5808d..d1359e3bf3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCharacterDataType.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCharacterDataType.java @@ -107,7 +107,7 @@ public class SQLCharacterDataType extends SQLDataTypeImpl { public SQLCharacterDataType clone() { - SQLCharacterDataType x = new SQLCharacterDataType(name); + SQLCharacterDataType x = new SQLCharacterDataType(getName()); super.cloneTo(x); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java index 416419dfa7..9eaf5dd360 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java @@ -169,7 +169,7 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl implements SQL public SQLParameter findParameter(long hash) { for (SQLParameter param : this.parameters) { - if (param.getName().name_hash_lower() == hash) { + if (param.getName().nameHashCode64() == hash) { return param; } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index 10c75315de..45d4199cb8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -15,7 +15,6 @@ */ package com.alibaba.druid.sql.ast.statement; -import java.io.IOException; import java.util.*; import com.alibaba.druid.sql.SQLUtils; @@ -24,14 +23,12 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.ListDG; import com.alibaba.druid.util.lang.Consumer; -import oracle.sql.SQLUtil; public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLStatement, SQLCreateStatement { @@ -239,7 +236,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return null; } - long hash = FNVUtils.fnv_64_lower_normalized(columName); + long hash = FnvHash.hashCode64(columName); return findColumn(hash); } @@ -248,7 +245,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS if (element instanceof SQLColumnDefinition) { SQLColumnDefinition column = (SQLColumnDefinition) element; SQLName columnName = column.getName(); - if (columnName != null && columnName.name_hash_lower() == columName_hash) { + if (columnName != null && columnName.nameHashCode64() == columName_hash) { return column; } } 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 bd65a5395b..3e59fc7c8b 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 @@ -23,11 +23,10 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.repository.SchemaObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLExprTableSource extends SQLTableSourceImpl { @@ -218,13 +217,13 @@ public class SQLExprTableSource extends SQLTableSourceImpl { } public boolean containsAlias(long aliasHash) { - if (this.alias_hash() == aliasHash) { + if (this.aliasHashCode64() == aliasHash) { return true; } if (expr instanceof SQLName) { - long exprNameHash = ((SQLName) expr).name_hash_lower(); - return exprNameHash == alias_hash; + long exprNameHash = ((SQLName) expr).nameHashCode64(); + return exprNameHash == aliasHashCod64; } return false; @@ -235,7 +234,7 @@ public class SQLExprTableSource extends SQLTableSourceImpl { return null; } - long hash = FNVUtils.fnv_64_lower_normalized(columnName); + long hash = FnvHash.hashCode64(columnName); return findColumn(hash); } @@ -257,7 +256,7 @@ public class SQLExprTableSource extends SQLTableSourceImpl { return null; } - long hash = FNVUtils.fnv_64_lower_normalized(columnName); + long hash = FnvHash.hashCode64(columnName); return findTableSourceWithColumn(hash); } @@ -287,12 +286,12 @@ public class SQLExprTableSource extends SQLTableSourceImpl { return null; } - if (alias_hash() == alias_hash) { + if (aliasHashCode64() == alias_hash) { return this; } if (expr instanceof SQLName) { - long exprNameHash = ((SQLName) expr).name_hash_lower(); + long exprNameHash = ((SQLName) expr).nameHashCode64(); if (exprNameHash == alias_hash) { return this; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java index f5c147ed42..d50f5b0d45 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java @@ -20,15 +20,12 @@ import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLReplaceable; -import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplaceable { @@ -417,7 +414,7 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace } public SQLColumnDefinition findColumn(String columnName) { - long hash = FNVUtils.fnv_64_lower_normalized(columnName); + long hash = FnvHash.hashCode64(columnName); return findColumn(hash); } @@ -438,7 +435,7 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace @Override public SQLTableSource findTableSourceWithColumn(String columnName) { - long hash = FNVUtils.fnv_64_lower_normalized(columnName); + long hash = FnvHash.hashCode64(columnName); return findTableSourceWithColumn(hash); } @@ -533,7 +530,7 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace return null; } - if (alias_hash() == alias_hash) { + if (aliasHashCode64() == alias_hash) { return this; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index d1f76642b0..8aa526d89c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -21,7 +21,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { @@ -30,7 +30,7 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { protected boolean connectByRoot = false; - protected transient long alias_hash; + protected transient long aliasHashCode64; public SQLSelectItem(){ @@ -174,15 +174,15 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { return false; } - long hash = FNVUtils.fnv_64_lower_normalized(alias); + long hash = FnvHash.hashCode64(alias); return match(hash); } public long alias_hash() { - if (this.alias_hash == 0) { - this.alias_hash = FNVUtils.fnv_64_lower_normalized(alias); + if (this.aliasHashCode64 == 0) { + this.aliasHashCode64 = FnvHash.hashCode64(alias); } - return alias_hash; + return aliasHashCode64; } public boolean match(long alias_hash) { @@ -202,7 +202,7 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { } if (expr instanceof SQLIdentifierExpr) { - return ((SQLIdentifierExpr) expr).name_hash_lower() == alias_hash; + return ((SQLIdentifierExpr) expr).nameHashCode64() == alias_hash; } if (expr instanceof SQLPropertyExpr) { @@ -216,7 +216,7 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { return false; } - return ((SQLPropertyExpr) expr).name_hash_lower() == alias_hash; + return ((SQLPropertyExpr) expr).nameHashCode64() == alias_hash; } return false; 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 eaa35ade82..41ab8bbb68 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 @@ -21,9 +21,8 @@ import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.*; -import com.alibaba.druid.sql.repository.SchemaObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery, SQLReplaceable { private boolean bracket = false; @@ -487,7 +486,7 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return null; } - long hash = FNVUtils.fnv_64_lower_normalized(ident); + long hash = FnvHash.hashCode64(ident); return findSelectItem(hash); } @@ -528,7 +527,7 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return null; } - long hash = FNVUtils.fnv_64_lower_normalized(columnName); + long hash = FnvHash.hashCode64(columnName); return from.findColumn(hash); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java index 672904c022..f9966524c9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.SQLObject; public interface SQLTableSource extends SQLObject { String getAlias(); + long aliasHashCode64(); void setAlias(String alias); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java index 65c6ee3d46..ebcf1fab0d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java @@ -22,17 +22,13 @@ import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLObjectImpl; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTableSource { - protected String alias; - protected List hints; - protected SQLExpr flashback; - - protected long alias_hash; + protected long aliasHashCod64; public SQLTableSourceImpl(){ @@ -48,7 +44,7 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab public void setAlias(String alias) { this.alias = alias; - this.alias_hash = 0L; + this.aliasHashCod64 = 0L; } public int getHintsSize() { @@ -97,12 +93,12 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab return false; } - public long alias_hash() { - if (alias_hash == 0 + public long aliasHashCode64() { + if (aliasHashCod64 == 0 && alias != null) { - alias_hash = FNVUtils.fnv_64_lower_normalized(alias); + aliasHashCod64 = FnvHash.hashCode64(alias); } - return alias_hash; + return aliasHashCod64; } public SQLColumnDefinition findColumn(String columnName) { @@ -110,7 +106,7 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab return null; } - long hash = FNVUtils.fnv_64_lower_normalized(alias); + long hash = FnvHash.hashCode64(alias); return findColumn(hash); } @@ -123,7 +119,7 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab return null; } - long hash = FNVUtils.fnv_64_lower_normalized(alias); + long hash = FnvHash.hashCode64(alias); return findTableSourceWithColumn(hash); } @@ -132,12 +128,12 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab } public SQLTableSource findTableSource(String alias) { - long hash = FNVUtils.fnv_64_lower_normalized(alias); + long hash = FnvHash.hashCode64(alias); return findTableSource(hash); } public SQLTableSource findTableSource(long alias_hash) { - long hash = this.alias_hash(); + long hash = this.aliasHashCode64(); if (hash != 0 && hash == alias_hash) { return this; } 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 3f8f9dc3e8..432d549649 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 @@ -21,7 +21,6 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLWithSubqueryClause extends SQLObjectImpl { @@ -129,7 +128,7 @@ public class SQLWithSubqueryClause extends SQLObjectImpl { public SQLTableSource findTableSourceWithColumn(long columnNameHash) { for (SQLName column : columns) { - if (column.name_hash_lower() == columnNameHash) { + if (column.nameHashCode64() == columnNameHash) { return this; } } @@ -143,7 +142,7 @@ public class SQLWithSubqueryClause extends SQLObjectImpl { } for (Entry entry : entries) { - if (entry.alias_hash() == alias_hash) { + if (entry.aliasHashCode64() == alias_hash) { return entry; } } 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 33abb59583..4790a8fc60 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 @@ -23,7 +23,8 @@ import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLParserFeature; import com.alibaba.druid.sql.parser.Token; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.FnvConstants; import java.util.Arrays; @@ -35,10 +36,10 @@ public class DB2ExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM", "ROW_NUMBER", "ROWNUMBER" }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } @@ -61,17 +62,16 @@ public class DB2ExprParser extends SQLExprParser { } public SQLExpr primaryRest(SQLExpr expr) { - if (lexer.identifierEquals(FNVUtils.VALUE)) { + if (lexer.identifierEquals(FnvConstants.VALUE)) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - String ident = identExpr.getName(); - if (ident.equalsIgnoreCase("NEXT")) { + if (identExpr.hashCode64() == FnvConstants.NEXT) { lexer.nextToken(); accept(Token.FOR); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.NextVal); return seqExpr; - } else if (ident.equalsIgnoreCase("PREVIOUS")) { + } else if (identExpr.hashCode64() == FnvConstants.PREVIOUS) { lexer.nextToken(); accept(Token.FOR); SQLName seqName = this.name(); @@ -79,21 +79,19 @@ public class DB2ExprParser extends SQLExprParser { return seqExpr; } } - } else if (lexer.identifierEquals("DATE")) { + } else if (lexer.identifierEquals(FnvConstants.DATE)) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - String ident = identExpr.getName(); - if (ident.equalsIgnoreCase("CURRENT")) { + if (identExpr.hashCode64() == FnvConstants.CURRENT) { lexer.nextToken(); expr = new SQLIdentifierExpr("CURRENT DATE"); } } - } else if (lexer.identifierEquals("TIMESTAMP")) { + } else if (lexer.identifierEquals(FnvConstants.TIMESTAMP)) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - String ident = identExpr.getName(); - if (ident.equalsIgnoreCase("CURRENT")) { + if (identExpr.hashCode64() == FnvConstants.CURRENT) { lexer.nextToken(); expr = new SQLIdentifierExpr("CURRENT DATE"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java index 99018050a5..e595e67753 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java @@ -17,16 +17,15 @@ package com.alibaba.druid.sql.dialect.mysql.ast.expr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable { private String userName; private String host; - protected transient long userName_hash; - - protected long hashCode64; + private long userNameHashCod64; + private long hashCode64; public String getUserName() { return userName; @@ -35,8 +34,8 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable { public void setUserName(String userName) { this.userName = userName; - hashCode64 = 0; - userName_hash = 0; + this.hashCode64 = 0; + this.userNameHashCod64 = 0; } public String getHost() { @@ -46,8 +45,8 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable { public void setHost(String host) { this.host = host; - hashCode64 = 0; - userName_hash = 0; + this.hashCode64 = 0; + this.userNameHashCod64 = 0; } @Override @@ -66,45 +65,36 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable { public MySqlUserName clone() { MySqlUserName x = new MySqlUserName(); + x.userName = userName; - x.host = host; + x.host = host; + return x; } - public long name_hash_lower() { - if (userName_hash == 0 + public long nameHashCode64() { + if (userNameHashCod64 == 0 && userName != null) { - final int len = userName.length(); - - boolean quote = false; - - String name = this.userName; - if (len > 2) { - char c0 = name.charAt(0); - char c1 = name.charAt(len - 1); - if (c0 == c1 - && (c0 == '`' || c1 == '"')) { - quote = true; - } - } - if (quote) { - userName_hash = FNVUtils.fnv_64_lower(name, 1, len -1); - } else { - userName_hash = FNVUtils.fnv_64_lower(name); - } + userNameHashCod64 = FnvHash.hashCode64(userName); } - return userName_hash; + return userNameHashCod64; } @Override public long hashCode64() { if (hashCode64 == 0) { if (host != null) { - hashCode64 = FNVUtils.fnv_64_lower(host, userName); + long hash = FnvHash.hashCode64(host); + hash ^= '@'; + hash *= 0x100000001b3L; + hash = FnvHash.hashCode64(hash, userName); + + hashCode64 = hash; } else { - hashCode64 = name_hash_lower(); + hashCode64 = nameHashCode64(); } } + return hashCode64; } } 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 b216decf2f..f8fa1a3c8d 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 @@ -24,13 +24,11 @@ import com.alibaba.druid.sql.ast.SQLPartition; import com.alibaba.druid.sql.ast.SQLPartitionValue; import com.alibaba.druid.sql.ast.SQLSubPartition; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLHexExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; @@ -51,9 +49,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr.Search import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; -import com.alibaba.druid.sql.ast.SQLLimit; import com.alibaba.druid.sql.parser.*; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; import java.util.Arrays; @@ -65,10 +63,10 @@ public class MySqlExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "GROUP_CONCAT", "MAX", "MIN", "STDDEV", "SUM" }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } @@ -104,7 +102,7 @@ public class MySqlExprParser extends SQLExprParser { public SQLExpr primary() { final Token tok = lexer.token(); - if (lexer.identifierEquals(FNVUtils.OUTFILE)) { + if (lexer.identifierEquals(FnvConstants.OUTFILE)) { lexer.nextToken(); SQLExpr file = primary(); SQLExpr expr = new MySqlOutFileExpr(file); @@ -177,7 +175,7 @@ public class MySqlExprParser extends SQLExprParser { MySqlCharExpr mysqlCharExpr = new MySqlCharExpr(charValue); mysqlCharExpr.setCharset(identExpr.getName()); - if (lexer.identifierEquals(FNVUtils.COLLATE)) { + if (lexer.identifierEquals(FnvConstants.COLLATE)) { lexer.nextToken(); String collate = lexer.stringVal(); @@ -212,7 +210,7 @@ public class MySqlExprParser extends SQLExprParser { return primaryRest(expr); } - } else if ("COLLATE".equalsIgnoreCase(lexer.stringVal())) { + } else if (lexer.identifierEquals(FnvConstants.COLLATE)) { lexer.nextToken(); if (lexer.token() == Token.EQ) { @@ -234,7 +232,7 @@ public class MySqlExprParser extends SQLExprParser { return primaryRest(expr); } else if (expr instanceof SQLVariantRefExpr) { - if ("COLLATE".equalsIgnoreCase(lexer.stringVal())) { + if (lexer.identifierEquals(FnvConstants.COLLATE)) { lexer.nextToken(); if (lexer.token() != Token.IDENTIFIER @@ -343,7 +341,7 @@ public class MySqlExprParser extends SQLExprParser { if (lexer.token() == Token.IN) { lexer.nextToken(); - if (lexer.identifierEquals(FNVUtils.NATURAL)) { + if (lexer.identifierEquals(FnvConstants.NATURAL)) { lexer.nextToken(); acceptIdentifier("LANGUAGE"); acceptIdentifier("MODE"); @@ -355,7 +353,7 @@ public class MySqlExprParser extends SQLExprParser { } else { matchAgainstExpr.setSearchModifier(SearchModifier.IN_NATURAL_LANGUAGE_MODE); } - } else if (lexer.identifierEquals(FNVUtils.BOOLEAN)) { + } else if (lexer.identifierEquals(FnvConstants.BOOLEAN)) { lexer.nextToken(); acceptIdentifier("MODE"); matchAgainstExpr.setSearchModifier(SearchModifier.IN_BOOLEAN_MODE); @@ -437,12 +435,12 @@ public class MySqlExprParser extends SQLExprParser { SQLExpr expr = this.expr(); column.setOnUpdate(expr); } - if (lexer.identifierEquals(FNVUtils.CHARSET)) { + if (lexer.identifierEquals(FnvConstants.CHARSET)) { lexer.nextToken(); MySqlCharExpr charSetCollateExpr=new MySqlCharExpr(); charSetCollateExpr.setCharset(lexer.stringVal()); lexer.nextToken(); - if (lexer.identifierEquals(FNVUtils.COLLATE)) { + if (lexer.identifierEquals(FnvConstants.COLLATE)) { lexer.nextToken(); charSetCollateExpr.setCollate(lexer.stringVal()); lexer.nextToken(); @@ -450,13 +448,14 @@ public class MySqlExprParser extends SQLExprParser { column.setCharsetExpr(charSetCollateExpr); return parseColumnRest(column); } - if (lexer.identifierEquals("AUTO_INCREMENT")) { + if (lexer.identifierEquals(FnvConstants.AUTO_INCREMENT)) { lexer.nextToken(); column.setAutoIncrement(true); return parseColumnRest(column); } - if (lexer.identifierEquals("precision") && column.getDataType().getName().equalsIgnoreCase("double")) { + if (lexer.identifierEquals(FnvConstants.PRECISION) + && column.getDataType().nameHashCode64() ==FnvConstants.DOUBLE) { lexer.nextToken(); } @@ -464,7 +463,7 @@ public class MySqlExprParser extends SQLExprParser { throw new ParserException("syntax error " + lexer.info()); } - if (lexer.identifierEquals("STORAGE")) { + if (lexer.identifierEquals(FnvConstants.STORAGE)) { lexer.nextToken(); SQLExpr expr = expr(); column.setStorage(expr); @@ -478,12 +477,12 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.RPAREN); } - if (lexer.identifierEquals("STORED")) { + if (lexer.identifierEquals(FnvConstants.STORED)) { lexer.nextToken(); column.setSorted(true); } - if (lexer.identifierEquals("VIRTUAL")) { + if (lexer.identifierEquals(FnvConstants.VIRTUAL)) { lexer.nextToken(); column.setVirtual(true); } @@ -496,12 +495,12 @@ public class MySqlExprParser extends SQLExprParser { protected SQLDataType parseDataTypeRest(SQLDataType dataType) { super.parseDataTypeRest(dataType); - if (lexer.identifierEquals("UNSIGNED")) { + if (lexer.identifierEquals(FnvConstants.UNSIGNED)) { lexer.nextToken(); dataType.getAttributes().put("UNSIGNED", true); } - if (lexer.identifierEquals("ZEROFILL")) { + if (lexer.identifierEquals(FnvConstants.ZEROFILL)) { lexer.nextToken(); dataType.getAttributes().put("ZEROFILL", true); } @@ -515,14 +514,17 @@ public class MySqlExprParser extends SQLExprParser { SQLExpr var = primary(); String ident = null; + long identHash = 0; if (var instanceof SQLIdentifierExpr) { - ident = ((SQLIdentifierExpr) var).getName(); + SQLIdentifierExpr identExpr = (SQLIdentifierExpr) var; + ident = identExpr.getName(); + identHash = identExpr.hashCode64(); - if ("GLOBAL".equalsIgnoreCase(ident)) { + if (identHash == FnvConstants.GLOBAL) { ident = lexer.stringVal(); lexer.nextToken(); var = new SQLVariantRefExpr(ident, true); - } else if ("SESSION".equalsIgnoreCase(ident)) { + } else if (identHash == FnvConstants.SESSION) { ident = lexer.stringVal(); lexer.nextToken(); var = new SQLVariantRefExpr(ident, false); @@ -531,7 +533,7 @@ public class MySqlExprParser extends SQLExprParser { } } - if ("NAMES".equalsIgnoreCase(ident)) { + if (identHash == FnvConstants.NAMES) { String charset = lexer.stringVal(); SQLExpr varExpr = null; @@ -550,7 +552,7 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.LITERAL_CHARS); } - if (lexer.identifierEquals("COLLATE")) { + if (lexer.identifierEquals(FnvConstants.COLLATE)) { MySqlCharExpr charsetExpr = new MySqlCharExpr(charset); lexer.nextToken(); @@ -572,7 +574,7 @@ public class MySqlExprParser extends SQLExprParser { item.setTarget(var); return item; - } else if ("CHARACTER".equalsIgnoreCase(ident)) { + } else if (identHash == FnvConstants.CHARACTER) { var = new SQLIdentifierExpr("CHARACTER SET"); accept(Token.SET); if (lexer.token() == Token.EQ) { @@ -621,7 +623,7 @@ public class MySqlExprParser extends SQLExprParser { MySqlPrimaryKey primaryKey = new MySqlPrimaryKey(); - if (lexer.identifierEquals(FNVUtils.USING)) { + if (lexer.identifierEquals(FnvConstants.USING)) { lexer.nextToken(); primaryKey.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -665,7 +667,7 @@ public class MySqlExprParser extends SQLExprParser { } //5.5语法 USING BTREE 放在index 名字后 - if (lexer.identifierEquals(FNVUtils.USING)) { + if (lexer.identifierEquals(FnvConstants.USING)) { lexer.nextToken(); unique.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -690,7 +692,7 @@ public class MySqlExprParser extends SQLExprParser { } accept(Token.RPAREN); - if (lexer.identifierEquals("USING")) { + if (lexer.identifierEquals(FnvConstants.USING)) { lexer.nextToken(); unique.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -722,12 +724,12 @@ public class MySqlExprParser extends SQLExprParser { this.names(fk.getReferencedColumns()); accept(Token.RPAREN); - if (lexer.identifierEquals("MATCH")) { + if (lexer.identifierEquals(FnvConstants.MATCH)) { if (lexer.identifierEquals("FULL")) { fk.setReferenceMatch(Match.FULL); - } else if (lexer.identifierEquals("PARTIAL")) { + } else if (lexer.identifierEquals(FnvConstants.PARTIAL)) { fk.setReferenceMatch(Match.PARTIAL); - } else if (lexer.identifierEquals("SIMPLE")) { + } else if (lexer.identifierEquals(FnvConstants.SIMPLE)) { fk.setReferenceMatch(Match.SIMPLE); } } @@ -755,19 +757,19 @@ public class MySqlExprParser extends SQLExprParser { protected Option parseReferenceOption() { Option option; - if (lexer.token() == Token.RESTRICT || lexer.identifierEquals("RESTRICT")) { + if (lexer.token() == Token.RESTRICT || lexer.identifierEquals(FnvConstants.RESTRICT)) { option = Option.RESTRICT; lexer.nextToken(); - } else if (lexer.identifierEquals("CASCADE")) { + } else if (lexer.identifierEquals(FnvConstants.CASCADE)) { option = Option.CASCADE; lexer.nextToken(); } else if (lexer.token() == Token.SET) { lexer.nextToken(); accept(Token.NULL); option = Option.SET_NULL; - } else if (lexer.identifierEquals("ON")) { + } else if (lexer.token() == Token.ON || lexer.identifierEquals(FnvConstants.ON)) { lexer.nextToken(); - if (lexer.identifierEquals("ACTION")) { + if (lexer.identifierEquals(FnvConstants.ACTION)) { option = Option.NO_ACTION; lexer.nextToken(); } else { @@ -787,7 +789,7 @@ public class MySqlExprParser extends SQLExprParser { SQLOrderBy orderBy = this.parseOrderBy(); aggregateExpr.putAttribute("ORDER BY", orderBy); } - if (lexer.identifierEquals("SEPARATOR")) { + if (lexer.identifierEquals(FnvConstants.SEPARATOR)) { lexer.nextToken(); SQLExpr seperator = this.primary(); @@ -828,7 +830,7 @@ public class MySqlExprParser extends SQLExprParser { for (;;) { boolean storage = false; - if (lexer.identifierEquals("DATA")) { + if (lexer.identifierEquals(FnvConstants.DATA)) { lexer.nextToken(); acceptIdentifier("DIRECTORY"); if (lexer.token() == Token.EQ) { @@ -849,22 +851,22 @@ public class MySqlExprParser extends SQLExprParser { lexer.nextToken(); } partitionDef.setIndexDirectory(this.expr()); - } else if (lexer.identifierEquals("MAX_ROWS")) { + } else if (lexer.identifierEquals(FnvConstants.MAX_ROWS)) { lexer.nextToken(); if (lexer.token() == Token.EQ) { lexer.nextToken(); } SQLExpr maxRows = this.primary(); partitionDef.setMaxRows(maxRows); - } else if (lexer.identifierEquals("MIN_ROWS")) { + } else if (lexer.identifierEquals(FnvConstants.MIN_ROWS)) { lexer.nextToken(); if (lexer.token() == Token.EQ) { lexer.nextToken(); } SQLExpr minRows = this.primary(); partitionDef.setMaxRows(minRows); - } else if (lexer.identifierEquals("ENGINE") || // - (storage = (lexer.token() == Token.STORAGE || lexer.identifierEquals("STORAGE")))) { + } else if (lexer.identifierEquals(FnvConstants.ENGINE) || // + (storage = (lexer.token() == Token.STORAGE || lexer.identifierEquals(FnvConstants.STORAGE)))) { if (storage) { lexer.nextToken(); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index 803582703a..bf212bdf6e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -35,7 +35,7 @@ import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvConstants; import java.util.List; @@ -104,7 +104,7 @@ public class MySqlSelectParser extends SQLSelectParser { if (token == (Token.DISTINCT)) { queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT); lexer.nextToken(); - } else if (lexer.identifierEquals(FNVUtils.DISTINCTROW)) { + } else if (lexer.identifierEquals(FnvConstants.DISTINCTROW)) { queryBlock.setDistionOption(SQLSetQuantifier.DISTINCTROW); lexer.nextToken(); } else if (token == (Token.ALL)) { @@ -112,42 +112,42 @@ public class MySqlSelectParser extends SQLSelectParser { lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.HIGH_PRIORITY)) { + if (lexer.identifierEquals(FnvConstants.HIGH_PRIORITY)) { queryBlock.setHignPriority(true); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.STRAIGHT_JOIN)) { + if (lexer.identifierEquals(FnvConstants.STRAIGHT_JOIN)) { queryBlock.setStraightJoin(true); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.SQL_SMALL_RESULT)) { + if (lexer.identifierEquals(FnvConstants.SQL_SMALL_RESULT)) { queryBlock.setSmallResult(true); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.SQL_BIG_RESULT)) { + if (lexer.identifierEquals(FnvConstants.SQL_BIG_RESULT)) { queryBlock.setBigResult(true); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.SQL_BUFFER_RESULT)) { + if (lexer.identifierEquals(FnvConstants.SQL_BUFFER_RESULT)) { queryBlock.setBufferResult(true); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.SQL_CACHE)) { + if (lexer.identifierEquals(FnvConstants.SQL_CACHE)) { queryBlock.setCache(true); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.SQL_NO_CACHE)) { + if (lexer.identifierEquals(FnvConstants.SQL_NO_CACHE)) { queryBlock.setCache(false); lexer.nextToken(); } - if (lexer.identifierEquals(FNVUtils.SQL_CALC_FOUND_ROWS)) { + if (lexer.identifierEquals(FnvConstants.SQL_CALC_FOUND_ROWS)) { queryBlock.setCalcFoundRows(true); lexer.nextToken(); } @@ -184,10 +184,10 @@ public class MySqlSelectParser extends SQLSelectParser { queryBlock.setForUpdate(true); - if (lexer.identifierEquals(FNVUtils.NO_WAIT) || lexer.identifierEquals(FNVUtils.NOWAIT)) { + if (lexer.identifierEquals(FnvConstants.NO_WAIT) || lexer.identifierEquals(FnvConstants.NOWAIT)) { lexer.nextToken(); queryBlock.setNoWait(true); - } else if (lexer.identifierEquals(FNVUtils.WAIT)) { + } else if (lexer.identifierEquals(FnvConstants.WAIT)) { lexer.nextToken(); SQLExpr waitTime = this.exprParser.primary(); queryBlock.setWaitTime(waitTime); @@ -259,32 +259,32 @@ public class MySqlSelectParser extends SQLSelectParser { lexer.nextToken(); - if (lexer.identifierEquals(FNVUtils.LOW_PRIORITY)) { + if (lexer.identifierEquals(FnvConstants.LOW_PRIORITY)) { lexer.nextToken(); update.setLowPriority(true); } - if (lexer.identifierEquals(FNVUtils.IGNORE)) { + if (lexer.identifierEquals(FnvConstants.IGNORE)) { lexer.nextToken(); update.setIgnore(true); } - if (lexer.identifierEquals(FNVUtils.COMMIT_ON_SUCCESS)) { + if (lexer.identifierEquals(FnvConstants.COMMIT_ON_SUCCESS)) { lexer.nextToken(); update.setCommitOnSuccess(true); } - if (lexer.identifierEquals(FNVUtils.ROLLBACK_ON_FAIL)) { + if (lexer.identifierEquals(FnvConstants.ROLLBACK_ON_FAIL)) { lexer.nextToken(); update.setRollBackOnFail(true); } - if (lexer.identifierEquals(FNVUtils.QUEUE_ON_PK)) { + if (lexer.identifierEquals(FnvConstants.QUEUE_ON_PK)) { lexer.nextToken(); update.setQueryOnPk(true); } - if (lexer.identifierEquals(FNVUtils.TARGET_AFFECT_ROW)) { + if (lexer.identifierEquals(FnvConstants.TARGET_AFFECT_ROW)) { lexer.nextToken(); SQLExpr targetAffectRow = this.exprParser.expr(); update.setTargetAffectRow(targetAffectRow); @@ -422,7 +422,7 @@ public class MySqlSelectParser extends SQLSelectParser { } protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) { - if (lexer.identifierEquals(FNVUtils.USING)) { + if (lexer.identifierEquals(FnvConstants.USING)) { return tableSource; } @@ -433,14 +433,14 @@ public class MySqlSelectParser extends SQLSelectParser { tableSource.getHints().add(hint); } - if (lexer.identifierEquals(FNVUtils.IGNORE)) { + if (lexer.identifierEquals(FnvConstants.IGNORE)) { lexer.nextToken(); MySqlIgnoreIndexHint hint = new MySqlIgnoreIndexHint(); parseIndexHint(hint); tableSource.getHints().add(hint); } - if (lexer.identifierEquals(FNVUtils.FORCE)) { + if (lexer.identifierEquals(FnvConstants.FORCE)) { lexer.nextToken(); MySqlForceIndexHint hint = new MySqlForceIndexHint(); parseIndexHint(hint); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 303a6272e9..0f13b6e19b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -45,7 +45,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement.LockType; import com.alibaba.druid.sql.parser.*; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; import java.util.ArrayList; @@ -181,7 +181,7 @@ public class MySqlStatementParser extends SQLStatementParser { throw new ParserException("syntax error. " + lexer.info()); } - if (lexer.identifierEquals(FNVUtils.USING)) { + if (lexer.identifierEquals(FnvConstants.USING)) { lexer.nextToken(); SQLTableSource tableSource = createSQLSelectParser().parseTableSource(); @@ -340,13 +340,13 @@ public class MySqlStatementParser extends SQLStatementParser { } private void parseCreateIndexUsing(SQLCreateIndexStatement stmt) { - if (lexer.identifierEquals(FNVUtils.USING)) { + if (lexer.identifierEquals(FnvConstants.USING)) { lexer.nextToken(); - if (lexer.identifierEquals(FNVUtils.BTREE)) { + if (lexer.identifierEquals(FnvConstants.BTREE)) { stmt.setUsing("BTREE"); lexer.nextToken(); - } else if (lexer.identifierEquals(FNVUtils.HASH)) { + } else if (lexer.identifierEquals(FnvConstants.HASH)) { stmt.setUsing("HASH"); lexer.nextToken(); } else { @@ -962,7 +962,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.STAR); accept(Token.RPAREN); - if (lexer.identifierEquals(FNVUtils.ERRORS)) { + if (lexer.identifierEquals(FnvConstants.ERRORS)) { lexer.nextToken(); MySqlShowErrorsStatement stmt = new MySqlShowErrorsStatement(); @@ -979,7 +979,7 @@ public class MySqlStatementParser extends SQLStatementParser { } } - if (lexer.identifierEquals(FNVUtils.ERRORS)) { + if (lexer.identifierEquals(FnvConstants.ERRORS)) { lexer.nextToken(); MySqlShowErrorsStatement stmt = new MySqlShowErrorsStatement(); @@ -3321,7 +3321,7 @@ public class MySqlStatementParser extends SQLStatementParser { stmt.setDbType(dbType); if (lexer.token() != Token.PROCEDURE) { - if (lexer.identifierEquals("DEFINER")) { + if (lexer.identifierEquals(FnvConstants.DEFINER)) { lexer.nextToken(); accept(Token.EQ); SQLName definer = this.exprParser.name(); @@ -3347,19 +3347,19 @@ public class MySqlStatementParser extends SQLStatementParser { } for (;;) { - if (lexer.identifierEquals("DETERMINISTIC")) { + if (lexer.identifierEquals(FnvConstants.DETERMINISTIC)) { lexer.nextToken(); stmt.setDeterministic(true); continue; } - if (lexer.identifierEquals("CONTAINS")) { + if (lexer.identifierEquals(FnvConstants.CONTAINS)) { lexer.nextToken(); acceptIdentifier("SQL"); stmt.setContainsSql(true); continue; } - if (lexer.identifierEquals("SQL")) { + if (lexer.identifierEquals(FnvConstants.SQL)) { lexer.nextToken(); acceptIdentifier("SECURITY"); SQLName authid = this.exprParser.name(); 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 8cf9f85500..2d0a504241 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 @@ -49,7 +49,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification; -import com.alibaba.druid.sql.repository.SchemaRepository; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Mode; @@ -485,7 +484,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS SQLName columnName = x.getColumnName(); if (columnName != null) { - addColumn(table, columnName.getSimpleName(), tableName.name_hash_lower(), columnName.name_hash_lower()); + addColumn(table, columnName.getSimpleName(), tableName.nameHashCode64(), columnName.nameHashCode64()); } } @@ -995,7 +994,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS SQLName column = x.getColumnName(); String columnName = column.toString(); - addColumn(tableName, columnName, table.name_hash_lower(), column.name_hash_lower()); + addColumn(tableName, columnName, table.nameHashCode64(), column.nameHashCode64()); return false; } @@ -1013,7 +1012,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS SQLName column = x.getNewColumnDefinition().getName(); String columnName = column.toString(); - addColumn(tableName, columnName, table.name_hash_lower(), column.name_hash_lower()); + addColumn(tableName, columnName, table.nameHashCode64(), column.nameHashCode64()); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java index c73eb69a86..c84f6b28c6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsLateralViewTableSource.java @@ -24,7 +24,6 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableSourceImpl; import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; public class OdpsLateralViewTableSource extends SQLTableSourceImpl { @@ -79,13 +78,13 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl { } public SQLTableSource findTableSource(long alias_hash) { - long hash = this.alias_hash(); + long hash = this.aliasHashCode64(); if (hash != 0 && hash == alias_hash) { return this; } for (SQLName column : columns) { - if (column.name_hash_lower() == alias_hash) { + if (column.nameHashCode64() == alias_hash) { return this; } } @@ -99,7 +98,7 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl { public SQLTableSource findTableSourceWithColumn(long columnNameHash) { for (SQLName column : columns) { - if (column.name_hash_lower() == columnNameHash) { + if (column.nameHashCode64() == columnNameHash) { return this; } } 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 80c0a10137..3e68e15634 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 @@ -24,7 +24,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.parser.*; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; import java.util.Arrays; @@ -46,10 +46,10 @@ public class OdpsExprParser extends SQLExprParser { "ROW_NUMBER", "WM_CONCAT"// }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_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/ast/expr/OracleDbLinkExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java index e47e874b6e..3a7e3fee2b 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 @@ -20,14 +20,16 @@ import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr { private SQLExpr expr; private String dbLink; - protected transient long dbLink_hash; + private long dbLinkHashCode64; + private long hashCode64; + public OracleDbLinkExpr(){ @@ -121,34 +123,35 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr return x; } - public long name_hash_lower() { - if (dbLink_hash == 0 + public long nameHashCode64() { + if (dbLinkHashCode64 == 0 && dbLink != null) { - final int len = dbLink.length(); - - boolean quote = false; - - String name = this.dbLink; - if (len > 2) { - char c0 = name.charAt(0); - char c1 = name.charAt(len - 1); - if (c0 == c1 - && (c0 == '`' || c1 == '"')) { - quote = true; - } - } - if (quote) { - dbLink_hash = FNVUtils.fnv_64_lower(name, 1, len -1); - } else { - dbLink_hash = FNVUtils.fnv_64_lower(name); - } + dbLinkHashCode64 = FnvHash.hashCode64(dbLink); } - return dbLink_hash; + return dbLinkHashCode64; } @Override public long hashCode64() { - // TODO hashCode64 - return 0; + if (hashCode64 == 0) { + long hash; + if (expr instanceof SQLName) { + hash = ((SQLName) expr).hashCode64(); + + hash ^= '.'; + hash *= FnvHash.PRIME; + } else if (expr == null){ + hash = FnvHash.BASIC; + } else { + hash = FnvHash.fnv_64_lower(expr.toString()); + + hash ^= '.'; + hash *= FnvHash.PRIME; + } + hash = FnvHash.hashCode64(hash, dbLink); + hashCode64 = hash; + } + + return hashCode64; } } 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 0c6b8f1f01..42c93af979 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 @@ -16,7 +16,6 @@ package com.alibaba.druid.sql.dialect.oracle.parser; import java.math.BigInteger; -import java.sql.Savepoint; import java.util.Arrays; import com.alibaba.druid.sql.ast.*; @@ -29,7 +28,6 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; @@ -53,7 +51,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.parser.*; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; public class OracleExprParser extends SQLExprParser { @@ -112,10 +111,10 @@ public class OracleExprParser extends SQLExprParser { "VARIANCE", // "WM_CONCAT" }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } @@ -140,15 +139,14 @@ public class OracleExprParser extends SQLExprParser { this.dbType = JdbcConstants.ORACLE; } - protected boolean isCharType(String dataTypeName) { - return "varchar2".equalsIgnoreCase(dataTypeName) // - || "nvarchar2".equalsIgnoreCase(dataTypeName) // - || "char".equalsIgnoreCase(dataTypeName) // - || "varchar".equalsIgnoreCase(dataTypeName) // - || "nchar".equalsIgnoreCase(dataTypeName) // - || "nvarchar".equalsIgnoreCase(dataTypeName) // - // - ; + protected boolean isCharType(long hash) { + return hash == FnvConstants.CHAR + || hash == FnvConstants.NCHAR + || hash == FnvConstants.VARCHAR + || hash == FnvConstants.VARCHAR2 + || hash == FnvConstants.NVARCHAR + || hash == FnvConstants.NVARCHAR2 + ; } public SQLDataType parseDataType(boolean restrict) { @@ -203,10 +201,10 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == Token.EXCEPTION) { typeName = "EXCEPTION"; lexer.nextToken(); - } else if (lexer.identifierEquals("LONG")) { + } else if (lexer.identifierEquals(FnvConstants.LONG)) { lexer.nextToken(); - if (lexer.identifierEquals("RAW")) { + if (lexer.identifierEquals(FnvConstants.RAW)) { lexer.nextToken(); typeName = "LONG RAW"; } else { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleToMySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleToMySqlOutputVisitor.java index 6ea7c2d7c3..1b1ff541c8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleToMySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleToMySqlOutputVisitor.java @@ -27,6 +27,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.util.FnvConstants; public class OracleToMySqlOutputVisitor extends OracleOutputVisitor { @@ -151,8 +152,8 @@ public class OracleToMySqlOutputVisitor extends OracleOutputVisitor { static boolean isRowNumber(SQLExpr expr) { if (expr instanceof SQLIdentifierExpr) { - String lownerName = ((SQLIdentifierExpr) expr).getLowerName(); - return "rownum".equals(lownerName); + return ((SQLIdentifierExpr) expr) + .hashCode64() == FnvConstants.ROWNUM; } return false; 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 e5fe8069f4..24408391e8 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 @@ -41,7 +41,7 @@ import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLParserFeature; import com.alibaba.druid.sql.parser.Token; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; import java.util.Arrays; @@ -54,10 +54,10 @@ public class PGExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM", "ROW_NUMBER" }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_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/ast/expr/SQLServerObjectReferenceExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java index c89736a5e7..e077e0c6cd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java @@ -21,7 +21,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements SQLServerExpr, SQLName { @@ -29,7 +29,8 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements private String database; private String schema; - protected long schema_hash; + protected long schemaHashCode64; + protected long hashCode64; public SQLServerObjectReferenceExpr(){ @@ -116,41 +117,33 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements public SQLServerObjectReferenceExpr clone() { SQLServerObjectReferenceExpr x = new SQLServerObjectReferenceExpr(); - x.server = server; - x.database = database; - x.schema = schema; + + x.server = server; + x.database = database; + x.schema = schema; + + x.schemaHashCode64 = schemaHashCode64; + x.hashCode64 = hashCode64; + return x; } - public long name_hash_lower() { - if (schema_hash == 0 + public long nameHashCode64() { + if (schemaHashCode64 == 0 && schema != null) { - final int len = schema.length(); - - boolean quote = false; - - String name = this.schema; - if (len > 2) { - char c0 = name.charAt(0); - char c1 = name.charAt(len - 1); - if ((c0 == '`' && c1 == '`') - || (c0 == '"' && c1 == '"') - || (c0 == '[' && c1 == ']')) { - quote = true; - } - } - if (quote) { - schema_hash = FNVUtils.fnv_64_lower(name, 1, len -1); - } else { - schema_hash = FNVUtils.fnv_64_lower(name); - } + schemaHashCode64 = FnvHash.hashCode64(schema); } - return schema_hash; + return schemaHashCode64; } @Override public long hashCode64() { - // TODO hashCode64 - return 0; + if (hashCode64 == 0) { + hashCode64 = new SQLPropertyExpr( + new SQLPropertyExpr(server, database) + , schema) + .hashCode64(); + } + return hashCode64; } } 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 a9a24998b7..20c8f3f350 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 @@ -34,7 +34,7 @@ import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLParserFeature; import com.alibaba.druid.sql.parser.Token; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; public class SQLServerExprParser extends SQLExprParser { @@ -44,10 +44,10 @@ public class SQLServerExprParser extends SQLExprParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "ROW_NUMBER", "STDDEV", "SUM" }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_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/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 2fb3dbbb88..76b7ed1278 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -40,7 +40,7 @@ import java.util.Arrays; import java.util.List; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.StringUtils; @@ -1529,7 +1529,7 @@ public class Lexer { if (stringVal == null) { stringVal = subString(mark, bufPos); } - this.hash_lower = FNVUtils.fnv_64_lower(stringVal); + this.hash_lower = FnvHash.fnv_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 = FNVUtils.fnv_64_lower(stringVal); + this.hash_lower = FnvHash.fnv_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 7ce3004866..d3239cee81 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -44,7 +44,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLUnique; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; public class SQLExprParser extends SQLParser { @@ -55,10 +56,10 @@ public class SQLExprParser extends SQLParser { static { String[] strings = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM" }; - AGGREGATE_FUNCTIONS_CODES = FNVUtils.fnv_64_lower(strings, true); + AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { - long hash = FNVUtils.fnv_64_lower(str); + long hash = FnvHash.fnv_64_lower(str); int index = Arrays.binarySearch(AGGREGATE_FUNCTIONS_CODES, hash); AGGREGATE_FUNCTIONS[index] = str; } @@ -236,7 +237,7 @@ public class SQLExprParser extends SQLParser { SQLExpr rightExp = bitXor(); expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.DIV, rightExp, getDbType()); expr = multiplicativeRest(expr); - } else if (lexer.identifierEquals(FNVUtils.MOD)) { + } else if (lexer.identifierEquals(FnvConstants.MOD)) { lexer.nextToken(); SQLExpr rightExp = primary(); @@ -786,8 +787,8 @@ public class SQLExprParser extends SQLParser { Token token = lexer.token; if (token == Token.OF) { if (expr instanceof SQLIdentifierExpr) { - String name = ((SQLIdentifierExpr) expr).getName(); - if ("CURRENT".equalsIgnoreCase(name)) { + long hashCode64 = ((SQLIdentifierExpr) expr).hashCode64(); + if (hashCode64 == FnvConstants.CURRENT) { lexer.nextToken(); SQLName cursorName = this.name(); return new SQLCurrentOfCursorExpr(cursorName); @@ -796,18 +797,17 @@ public class SQLExprParser extends SQLParser { } else if (token == Token.FOR) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr idenExpr = (SQLIdentifierExpr) expr; - String name = idenExpr.getName(); - if ("NEXTVAL".equalsIgnoreCase(name)) { + if (idenExpr.hashCode64() == FnvConstants.NEXTVAL) { lexer.nextToken(); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.NextVal); return seqExpr; - } else if ("CURRVAL".equalsIgnoreCase(name)) { + } else if (idenExpr.hashCode64() == FnvConstants.CURRVAL) { lexer.nextToken(); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.CurrVal); return seqExpr; - } else if ("PREVVAL".equalsIgnoreCase(name)) { + } else if (idenExpr.hashCode64() == FnvConstants.PREVVAL) { lexer.nextToken(); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.PrevVal); @@ -826,7 +826,7 @@ public class SQLExprParser extends SQLParser { expr = dotRest(expr); return primaryRest(expr); - } else if (lexer.identifierEquals(FNVUtils.SETS) // + } else if (lexer.identifierEquals(FnvConstants.SETS) // && expr.getClass() == SQLIdentifierExpr.class // && "GROUPING".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) { SQLGroupingSetExpr groupingSets = new SQLGroupingSetExpr(); @@ -906,26 +906,26 @@ public class SQLExprParser extends SQLParser { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; methodName = identifierExpr.getName(); - hash_lower = identifierExpr.name_hash_lower(); + hash_lower = identifierExpr.nameHashCode64(); - if (hash_lower == FNVUtils.TRIM) { - if (lexer.identifierEquals(FNVUtils.LEADING)) { + if (hash_lower == FnvConstants.TRIM) { + if (lexer.identifierEquals(FnvConstants.LEADING)) { trimOption = lexer.stringVal(); lexer.nextToken(); - } else if (lexer.identifierEquals(FNVUtils.BOTH)) { + } else if (lexer.identifierEquals(FnvConstants.BOTH)) { trimOption = lexer.stringVal(); lexer.nextToken(); - } else if (lexer.identifierEquals(FNVUtils.TRAILING)) { + } else if (lexer.identifierEquals(FnvConstants.TRAILING)) { trimOption = lexer.stringVal(); lexer.nextToken(); } - } else if (hash_lower == FNVUtils.MATCH + } else if (hash_lower == FnvConstants.MATCH && JdbcConstants.MYSQL.equals(dbType)) { return parseMatch(); - } else if (hash_lower == FNVUtils.EXTRACT + } else if (hash_lower == FnvConstants.EXTRACT && JdbcConstants.MYSQL.equals(dbType)) { return parseExtract(); - } else if (hash_lower == FNVUtils.POSITION + } else if (hash_lower == FnvConstants.POSITION && JdbcConstants.MYSQL.equals(dbType)) { return parsePosition(); } @@ -933,7 +933,7 @@ public class SQLExprParser extends SQLParser { } else if (expr instanceof SQLPropertyExpr) { methodName = expr.toString(); aggMethodName = SQLUtils.normalize(methodName); - hash_lower = FNVUtils.fnv_64_lower(aggMethodName); + hash_lower = FnvHash.fnv_64_lower(aggMethodName); aggMethodName = getAggreateFunction(hash_lower); owner = ((SQLPropertyExpr) expr).getOwner(); @@ -978,7 +978,7 @@ public class SQLExprParser extends SQLParser { } } - if (lexer.token == Token.USING || lexer.identifierEquals(FNVUtils.USING)) { + if (lexer.token == Token.USING || lexer.identifierEquals(FnvConstants.USING)) { lexer.nextToken(); SQLExpr using = this.primary(); methodInvokeExpr.setUsing(using); @@ -1229,7 +1229,7 @@ public class SQLExprParser extends SQLParser { } public boolean isAggreateFunction(String word) { - long hash_lower = FNVUtils.fnv_64_lower(word); + long hash_lower = FnvHash.fnv_64_lower(word); return isAggreateFunction(hash_lower); } @@ -1253,7 +1253,7 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token == Token.DISTINCT) { aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DISTINCT); lexer.nextToken(); - } else if (lexer.identifierEquals(FNVUtils.DEDUPLICATION)) { // just for nut + } else if (lexer.identifierEquals(FnvConstants.DEDUPLICATION)) { // just for nut aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DEDUPLICATION); lexer.nextToken(); } else { @@ -1301,9 +1301,10 @@ public class SQLExprParser extends SQLParser { } SQLOver.WindowingType windowingType = null; - if (lexer.identifierEquals("ROWS")) { + if (lexer.identifierEquals(FnvConstants.ROWS)) { windowingType = SQLOver.WindowingType.ROWS; - } else if (lexer.identifierEquals("RANGE")) { + + } else if (lexer.identifierEquals(FnvConstants.RANGE)) { windowingType = SQLOver.WindowingType.RANGE; } @@ -1316,10 +1317,10 @@ public class SQLExprParser extends SQLParser { SQLIntegerExpr rowsBegin = (SQLIntegerExpr) this.primary(); over.setWindowingBetweenBegin(rowsBegin); - if (lexer.identifierEquals("PRECEDING")) { + if (lexer.identifierEquals(FnvConstants.PRECEDING)) { over.setWindowingBetweenBeginPreceding(true); lexer.nextToken(); - } else if (lexer.identifierEquals("FOLLOWING")) { + } else if (lexer.identifierEquals(FnvConstants.FOLLOWING)) { over.setWindowingBetweenBeginFollowing(true); lexer.nextToken(); } @@ -1329,25 +1330,25 @@ public class SQLExprParser extends SQLParser { SQLIntegerExpr betweenEnd = (SQLIntegerExpr) this.primary(); over.setWindowingBetweenEnd(betweenEnd); - if (lexer.identifierEquals("PRECEDING")) { + if (lexer.identifierEquals(FnvConstants.PRECEDING)) { over.setWindowingBetweenEndPreceding(true); lexer.nextToken(); - } else if (lexer.identifierEquals("FOLLOWING")) { + } else if (lexer.identifierEquals(FnvConstants.FOLLOWING)) { over.setWindowingBetweenEndFollowing(true); lexer.nextToken(); } } else { - if (lexer.identifierEquals("CURRENT")) { + if (lexer.identifierEquals(FnvConstants.CURRENT)) { lexer.nextToken(); acceptIdentifier("ROW"); over.setWindowing(new SQLIdentifierExpr("CURRENT ROW")); - } else if (lexer.identifierEquals("UNBOUNDED")) { + } else if (lexer.identifierEquals(FnvConstants.UNBOUNDED)) { lexer.nextToken(); over.setWindowing(new SQLIdentifierExpr("UNBOUNDED")); - if (lexer.identifierEquals("PRECEDING")) { + if (lexer.identifierEquals(FnvConstants.PRECEDING)) { over.setWindowingPreceding(true); lexer.nextToken(); } else if (lexer.identifierEquals("FOLLOWING")) { @@ -1358,10 +1359,10 @@ public class SQLExprParser extends SQLParser { SQLIntegerExpr rowsExpr = (SQLIntegerExpr) this.primary(); over.setWindowing(rowsExpr); - if (lexer.identifierEquals("PRECEDING")) { + if (lexer.identifierEquals(FnvConstants.PRECEDING)) { over.setWindowingPreceding(true); lexer.nextToken(); - } else if (lexer.identifierEquals("FOLLOWING")) { + } else if (lexer.identifierEquals(FnvConstants.FOLLOWING)) { over.setWindowingFollowing(true); lexer.nextToken(); } @@ -1383,7 +1384,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); - if (lexer.identifierEquals("SIBLINGS")) { + if (lexer.identifierEquals(FnvConstants.SIBLINGS)) { lexer.nextToken(); orderBy.setSibings(true); } @@ -1423,12 +1424,12 @@ public class SQLExprParser extends SQLParser { item.setType(SQLOrderingSpecification.DESC); } - if (lexer.identifierEquals("NULLS")) { + if (lexer.identifierEquals(FnvConstants.NULLS)) { lexer.nextToken(); - if (lexer.identifierEquals("FIRST")) { + if (lexer.identifierEquals(FnvConstants.FIRST)) { lexer.nextToken(); item.setNullsOrderType(SQLSelectOrderByItem.NullsOrderType.NullsFirst); - } else if (lexer.identifierEquals("LAST")) { + } else if (lexer.identifierEquals(FnvConstants.LAST)) { lexer.nextToken(); item.setNullsOrderType(SQLSelectOrderByItem.NullsOrderType.NullsLast); } else { @@ -1842,7 +1843,7 @@ public class SQLExprParser extends SQLParser { rightExp = primary(); expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Escape, rightExp, getDbType()); } - } else if (lexer.identifierEquals(FNVUtils.RLIKE)) { + } else if (lexer.identifierEquals(FnvConstants.RLIKE)) { lexer.nextToken(); rightExp = equality(); @@ -1900,7 +1901,7 @@ public class SQLExprParser extends SQLParser { expr = new SQLBinaryOpExpr(expr, op, rightExp, dbType); } else if (token == Token.IN) { expr = inRest(expr); - } else if (lexer.identifierEquals(FNVUtils.REGEXP)) { + } else if (lexer.identifierEquals(FnvConstants.REGEXP)) { lexer.nextToken(); rightExp = equality(); @@ -1909,7 +1910,7 @@ public class SQLExprParser extends SQLParser { return new SQLBinaryOpExpr(expr, SQLBinaryOperator.RegExp, rightExp, JdbcConstants.MYSQL); } else if (JdbcConstants.POSTGRESQL.equals(lexer.dbType)) { - if (lexer.identifierEquals("SIMILAR")) { + if (lexer.identifierEquals(FnvConstants.SIMILAR)) { lexer.nextToken(); accept(Token.TO); @@ -2010,7 +2011,7 @@ public class SQLExprParser extends SQLParser { expr = new SQLBetweenExpr(expr, true, beginExpr, endExpr); return expr; - } else if (lexer.identifierEquals("RLIKE")) { + } else if (lexer.identifierEquals(FnvConstants.RLIKE)) { lexer.nextToken(); SQLExpr rightExp = primary(); @@ -2024,7 +2025,7 @@ public class SQLExprParser extends SQLParser { rightExp = relationalRest(rightExp); return new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotILike, rightExp, getDbType()); - } else if (lexer.identifierEquals(FNVUtils.REGEXP)) { + } else if (lexer.identifierEquals(FnvConstants.REGEXP)) { lexer.nextToken(); SQLExpr rightExp = primary(); @@ -2102,13 +2103,14 @@ public class SQLExprParser extends SQLParser { accept(Token.RPAREN); } - if (lexer.identifierEquals("PRECISION") && dataType.getName().equalsIgnoreCase("DOUBLE")) { + if (lexer.identifierEquals(FnvConstants.PRECISION) + && dataType.nameHashCode64() == FnvConstants.DOUBLE) { lexer.nextToken(); dataType.setName("DOUBLE PRECISION"); } - if ("timestamp".equalsIgnoreCase(dataType.getName())) { - if (lexer.identifierEquals("WITHOUT")) { + if (FnvConstants.TIMESTAMP == dataType.nameHashCode64()) { + if (lexer.identifierEquals(FnvConstants.WITHOUT)) { lexer.nextToken(); acceptIdentifier("TIME"); acceptIdentifier("ZONE"); @@ -2125,13 +2127,21 @@ public class SQLExprParser extends SQLParser { } protected boolean isCharType(String dataTypeName) { - return "char".equalsIgnoreCase(dataTypeName) // - || "varchar".equalsIgnoreCase(dataTypeName) || "nchar".equalsIgnoreCase(dataTypeName) - || "nvarchar".equalsIgnoreCase(dataTypeName) || "tinytext".equalsIgnoreCase(dataTypeName) - || "text".equalsIgnoreCase(dataTypeName) || "mediumtext".equalsIgnoreCase(dataTypeName) - || "longtext".equalsIgnoreCase(dataTypeName) - // - ; + long hash = FnvHash.hashCode64(dataTypeName); + return isCharType(hash); + } + + + protected boolean isCharType(long hash) { + return hash == FnvConstants.CHAR + || hash == FnvConstants.VARCHAR + || hash == FnvConstants.NCHAR + || hash == FnvConstants.NVARCHAR + || hash == FnvConstants.TINYTEXT + || hash == FnvConstants.TEXT + || hash == FnvConstants.MEDIUMTEXT + || hash == FnvConstants.LONGTEXT + ; } protected SQLDataType parseCharTypeRest(SQLCharacterDataType charType) { @@ -2140,7 +2150,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); } - if (lexer.identifierEquals("CHARACTER")) { + if (lexer.identifierEquals(FnvConstants.CHARACTER)) { lexer.nextToken(); accept(Token.SET); @@ -2157,17 +2167,16 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); } - if (lexer.token == Token.IDENTIFIER) { - if (lexer.stringVal().equalsIgnoreCase("COLLATE")) { - lexer.nextToken(); + if (lexer.identifierEquals(FnvConstants.COLLATE)) { + lexer.nextToken(); - if (lexer.token != Token.IDENTIFIER) { - throw new ParserException(); - } - charType.setCollate(lexer.stringVal()); - lexer.nextToken(); + if (lexer.token != Token.IDENTIFIER) { + throw new ParserException(); } + charType.setCollate(lexer.stringVal()); + lexer.nextToken(); } + return charType; } @@ -2339,16 +2348,16 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token == Token.ENABLE) { lexer.nextToken(); check.setEnable(true); - } else if (lexer.identifierEquals("VALIDATE")) { + } else if (lexer.identifierEquals(FnvConstants.VALIDATE)) { lexer.nextToken(); check.setValidate(Boolean.TRUE); - } else if (lexer.identifierEquals("NOVALIDATE")) { + } else if (lexer.identifierEquals(FnvConstants.NOVALIDATE)) { lexer.nextToken(); check.setValidate(Boolean.FALSE); - } else if (lexer.identifierEquals("RELY")) { + } else if (lexer.identifierEquals(FnvConstants.RELY)) { lexer.nextToken(); check.setRely(Boolean.TRUE); - } else if (lexer.identifierEquals("NORELY")) { + } else if (lexer.identifierEquals(FnvConstants.NORELY)) { lexer.nextToken(); check.setRely(Boolean.FALSE); } @@ -2381,16 +2390,16 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token == Token.ENABLE) { lexer.nextToken(); unique.setEnable(true); - } else if (lexer.identifierEquals("VALIDATE")) { + } else if (lexer.identifierEquals(FnvConstants.VALIDATE)) { lexer.nextToken(); unique.setValidate(Boolean.TRUE); - } else if (lexer.identifierEquals("NOVALIDATE")) { + } else if (lexer.identifierEquals(FnvConstants.NOVALIDATE)) { lexer.nextToken(); unique.setValidate(Boolean.FALSE); - } else if (lexer.identifierEquals("RELY")) { + } else if (lexer.identifierEquals(FnvConstants.RELY)) { lexer.nextToken(); unique.setRely(Boolean.TRUE); - } else if (lexer.identifierEquals("NORELY")) { + } else if (lexer.identifierEquals(FnvConstants.NORELY)) { lexer.nextToken(); unique.setRely(Boolean.FALSE); } @@ -2409,7 +2418,7 @@ public class SQLExprParser extends SQLParser { item.setTarget(var); if (lexer.token == Token.COLONEQ) { lexer.nextToken(); - } else if (lexer.token == Token.TRUE || lexer.identifierEquals("TRUE")) { + } else if (lexer.token == Token.TRUE || lexer.identifierEquals(FnvConstants.TRUE)) { lexer.nextToken(); item.setValue(new SQLBooleanExpr(true)); return item; @@ -2523,7 +2532,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.ON) { lexer.nextToken(); accept(Token.DELETE); - if (lexer.identifierEquals("CASCADE")) { + if (lexer.identifierEquals(FnvConstants.CASCADE)) { lexer.nextToken(); fk.setOnDeleteCascade(true); } else { @@ -2549,11 +2558,11 @@ public class SQLExprParser extends SQLParser { long hash_lower = lexer.hash_lower(); lexer.nextTokenComma(); - if (hash_lower == FNVUtils.CONNECT_BY_ROOT) { + if (hash_lower == FnvConstants.CONNECT_BY_ROOT) { connectByRoot = true; expr = new SQLIdentifierExpr(lexer.stringVal()); lexer.nextToken(); - } else if (FNVUtils.DATE == hash_lower + } else if (FnvConstants.DATE == hash_lower && lexer.token == Token.LITERAL_CHARS && (JdbcConstants.ORACLE.equals(getDbType()) || JdbcConstants.POSTGRESQL.equals(getDbType()))) { @@ -2586,7 +2595,7 @@ public class SQLExprParser extends SQLParser { return new SQLSelectItem(expr, as, connectByRoot); } - if (token == Token.IDENTIFIER && hash_lower != FNVUtils.CURRENT) { + if (token == Token.IDENTIFIER && hash_lower != FnvConstants.CURRENT) { String as = lexer.stringVal(); lexer.nextTokenComma(); return new SQLSelectItem(expr, as, connectByRoot); @@ -2630,7 +2639,7 @@ public class SQLExprParser extends SQLParser { SQLGroupingSetExpr expr = new SQLGroupingSetExpr(); - if (lexer.identifierEquals("SET")) { + if (lexer.token == Token.SET || lexer.identifierEquals(FnvConstants.SET)) { lexer.nextToken(); } else { return new SQLIdentifierExpr(tmp); @@ -2660,13 +2669,13 @@ public class SQLExprParser extends SQLParser { accept(Token.LPAREN); this.exprList(values.getItems(), values); accept(Token.RPAREN); - } else if (lexer.identifierEquals("LESS")) { + } else if (lexer.identifierEquals(FnvConstants.LESS)) { lexer.nextToken(); acceptIdentifier("THAN"); values = new SQLPartitionValue(SQLPartitionValue.Operator.LessThan); - if (lexer.identifierEquals("MAXVALUE")) { + if (lexer.identifierEquals(FnvConstants.MAXVALUE)) { SQLIdentifierExpr maxValue = new SQLIdentifierExpr(lexer.stringVal()); lexer.nextToken(); maxValue.setParent(values); @@ -2705,7 +2714,7 @@ public class SQLExprParser extends SQLParser { limit.setOffset(temp); lexer.nextToken(); limit.setRowCount(this.expr()); - } else if (lexer.identifierEquals("OFFSET")) { + } else if (lexer.identifierEquals(FnvConstants.OFFSET)) { limit.setRowCount(temp); lexer.nextToken(); limit.setOffset(this.expr()); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index 01ef14d1de..95077c7367 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -18,11 +18,9 @@ package com.alibaba.druid.sql.parser; import java.util.List; import com.alibaba.druid.sql.ast.*; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; public class SQLSelectParser extends SQLParser { @@ -178,13 +176,13 @@ public class SQLSelectParser extends SQLParser { } if (JdbcConstants.INFORMIX.equals(dbType)) { - if (lexer.identifierEquals("SKIP")) { + if (lexer.identifierEquals(FnvConstants.SKIP)) { lexer.nextToken(); SQLExpr offset = this.exprParser.primary(); queryBlock.setOffset(offset); } - if (lexer.identifierEquals("FIRST")) { + if (lexer.identifierEquals(FnvConstants.FIRST)) { lexer.nextToken(); SQLExpr first = this.exprParser.primary(); queryBlock.setFirst(first); @@ -221,7 +219,7 @@ public class SQLSelectParser extends SQLParser { SQLWithSubqueryClause withQueryClause = new SQLWithSubqueryClause(); - if (lexer.token == Token.RECURSIVE || lexer.identifierEquals("RECURSIVE")) { + if (lexer.token == Token.RECURSIVE || lexer.identifierEquals(FnvConstants.RECURSIVE)) { lexer.nextToken(); withQueryClause.setRecursive(true); } @@ -264,7 +262,7 @@ public class SQLSelectParser extends SQLParser { SQLWithSubqueryClause withQueryClause = new SQLWithSubqueryClause(); - if (lexer.token == Token.RECURSIVE || lexer.identifierEquals("RECURSIVE")) { + if (lexer.token == Token.RECURSIVE || lexer.identifierEquals(FnvConstants.RECURSIVE)) { lexer.nextToken(); withQueryClause.setRecursive(true); } @@ -339,12 +337,12 @@ public class SQLSelectParser extends SQLParser { accept(Token.BY); SQLSelectGroupByClause groupBy = new SQLSelectGroupByClause(); - if (lexer.identifierEquals("ROLLUP")) { + if (lexer.identifierEquals(FnvConstants.ROLLUP)) { lexer.nextToken(); accept(Token.LPAREN); groupBy.setWithRollUp(true); } - if (lexer.identifierEquals("CUBE")) { + if (lexer.identifierEquals(FnvConstants.CUBE)) { lexer.nextToken(); accept(Token.LPAREN); groupBy.setWithCube(true); @@ -376,7 +374,7 @@ public class SQLSelectParser extends SQLParser { if (lexer.token == Token.WITH) { lexer.nextToken(); - if (lexer.identifierEquals("CUBE")) { + if (lexer.identifierEquals(FnvConstants.CUBE)) { lexer.nextToken(); groupBy.setWithCube(true); } else { @@ -526,8 +524,8 @@ public class SQLSelectParser extends SQLParser { protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) { if ((tableSource.getAlias() == null) || (tableSource.getAlias().length() == 0)) { if (lexer.token != Token.LEFT && lexer.token != Token.RIGHT && lexer.token != Token.FULL - && (!lexer.identifierEquals(FNVUtils.STRAIGHT_JOIN)) - && (!lexer.identifierEquals(FNVUtils.CROSS)) + && (!lexer.identifierEquals(FnvConstants.STRAIGHT_JOIN)) + && (!lexer.identifierEquals(FnvConstants.CROSS)) && lexer.token != Token.OUTER) { String alias = tableAlias(); if (alias != null) { @@ -539,19 +537,18 @@ public class SQLSelectParser extends SQLParser { SQLJoinTableSource.JoinType joinType = null; - boolean natural = false; - if (JdbcConstants.MYSQL.equals(dbType) && lexer.identifierEquals(FNVUtils.NATURAL)) { + boolean natural = lexer.identifierEquals(FnvConstants.NATURAL) && JdbcConstants.MYSQL.equals(dbType); + if (natural) { lexer.nextToken(); - natural = true; } if (lexer.token == Token.LEFT) { lexer.nextToken(); - if (lexer.identifierEquals(FNVUtils.SEMI)) { + if (lexer.identifierEquals(FnvConstants.SEMI)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.LEFT_SEMI_JOIN; - } else if (lexer.identifierEquals(FNVUtils.ANTI)) { + } else if (lexer.identifierEquals(FnvConstants.ANTI)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.LEFT_ANTI_JOIN; } else if (lexer.token == Token.OUTER) { @@ -587,21 +584,21 @@ public class SQLSelectParser extends SQLParser { } else if (lexer.token == Token.COMMA) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.COMMA; - } else if (lexer.identifierEquals(FNVUtils.STRAIGHT_JOIN)) { + } else if (lexer.identifierEquals(FnvConstants.STRAIGHT_JOIN)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.STRAIGHT_JOIN; - } else if (lexer.identifierEquals(FNVUtils.CROSS)) { + } else if (lexer.identifierEquals(FnvConstants.CROSS)) { lexer.nextToken(); if (lexer.token == Token.JOIN) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.CROSS_JOIN; - } else if (lexer.identifierEquals(FNVUtils.APPLY)) { + } else if (lexer.identifierEquals(FnvConstants.APPLY)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.CROSS_APPLY; } } else if (lexer.token == Token.OUTER) { lexer.nextToken(); - if (lexer.identifierEquals(FNVUtils.APPLY)) { + if (lexer.identifierEquals(FnvConstants.APPLY)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.OUTER_APPLY; } @@ -625,7 +622,7 @@ public class SQLSelectParser extends SQLParser { } if (lexer.token == Token.USING - ||lexer.identifierEquals(FNVUtils.USING)) + ||lexer.identifierEquals(FnvConstants.USING)) { Lexer.SavePoint savePoint = lexer.mark(); lexer.nextToken(); @@ -667,7 +664,7 @@ public class SQLSelectParser extends SQLParser { join.setRight(rightTableSource); if (!natural) { - if (JdbcConstants.MYSQL.equals(dbType) && "NATURAL".equalsIgnoreCase(tableSource.getAlias())) { + if (tableSource.aliasHashCode64() == FnvConstants.NATURAL && JdbcConstants.MYSQL.equals(dbType)) { tableSource.setAlias(null); natural = true; } @@ -678,7 +675,7 @@ public class SQLSelectParser extends SQLParser { lexer.nextToken(); join.setCondition(expr()); } else if (lexer.token == Token.USING - || lexer.identifierEquals(FNVUtils.USING)) { + || lexer.identifierEquals(FnvConstants.USING)) { Lexer.SavePoint savePoint = lexer.mark(); lexer.nextToken(); if (lexer.token == Token.LPAREN) { @@ -720,11 +717,11 @@ public class SQLSelectParser extends SQLParser { return; } - if (lexer.identifierEquals("OFFSET") || lexer.token == Token.OFFSET) { + if (lexer.identifierEquals(FnvConstants.OFFSET) || lexer.token == Token.OFFSET) { lexer.nextToken(); SQLExpr offset = this.exprParser.primary(); queryBlock.setOffset(offset); - if (lexer.identifierEquals("ROW") || lexer.identifierEquals("ROWS")) { + if (lexer.identifierEquals(FnvConstants.ROW) || lexer.identifierEquals(FnvConstants.ROWS)) { lexer.nextToken(); } } @@ -732,14 +729,14 @@ public class SQLSelectParser extends SQLParser { if (lexer.token == Token.FETCH) { lexer.nextToken(); if (lexer.token == Token.FIRST - || lexer.identifierEquals("NEXT")) { + || lexer.identifierEquals(FnvConstants.NEXT)) { lexer.nextToken(); } else { acceptIdentifier("FIRST"); } SQLExpr first = this.exprParser.primary(); queryBlock.setFirst(first); - if (lexer.identifierEquals("ROW") || lexer.identifierEquals("ROWS")) { + if (lexer.identifierEquals(FnvConstants.ROW) || lexer.identifierEquals(FnvConstants.ROWS)) { lexer.nextToken(); } @@ -752,16 +749,16 @@ public class SQLSelectParser extends SQLParser { } protected void parseHierachical(SQLSelectQueryBlock queryBlock) { - if (lexer.token == Token.CONNECT || lexer.identifierEquals(FNVUtils.CONNECT)) { + if (lexer.token == Token.CONNECT || lexer.identifierEquals(FnvConstants.CONNECT)) { lexer.nextToken(); accept(Token.BY); - if (lexer.token == Token.PRIOR || lexer.identifierEquals(FNVUtils.PRIOR)) { + if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvConstants.PRIOR)) { lexer.nextToken(); queryBlock.setPrior(true); } - if (lexer.identifierEquals(FNVUtils.NOCYCLE)) { + if (lexer.identifierEquals(FnvConstants.NOCYCLE)) { queryBlock.setNoCycle(true); lexer.nextToken(); @@ -773,27 +770,27 @@ public class SQLSelectParser extends SQLParser { queryBlock.setConnectBy(this.exprParser.expr()); } - if (lexer.token == Token.START || lexer.identifierEquals(FNVUtils.START)) { + if (lexer.token == Token.START || lexer.identifierEquals(FnvConstants.START)) { lexer.nextToken(); accept(Token.WITH); queryBlock.setStartWith(this.exprParser.expr()); } - if (lexer.token == Token.CONNECT || lexer.identifierEquals(FNVUtils.CONNECT)) { + if (lexer.token == Token.CONNECT || lexer.identifierEquals(FnvConstants.CONNECT)) { lexer.nextToken(); accept(Token.BY); - if (lexer.token == Token.PRIOR || lexer.identifierEquals(FNVUtils.PRIOR)) { + if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvConstants.PRIOR)) { lexer.nextToken(); queryBlock.setPrior(true); } - if (lexer.identifierEquals(FNVUtils.NOCYCLE)) { + if (lexer.identifierEquals(FnvConstants.NOCYCLE)) { queryBlock.setNoCycle(true); lexer.nextToken(); - if (lexer.token == Token.PRIOR || lexer.identifierEquals(FNVUtils.PRIOR)) { + if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvConstants.PRIOR)) { lexer.nextToken(); queryBlock.setPrior(true); } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaObjectImpl.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaObjectImpl.java index 19dbbdebc1..8fb1f261fd 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaObjectImpl.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaObjectImpl.java @@ -20,7 +20,7 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; /** * Created by wenshao on 08/06/2017. @@ -51,7 +51,7 @@ public class SchemaObjectImpl implements SchemaObject { } public SQLColumnDefinition findColumn(String columName) { - long hash = FNVUtils.fnv_64_lower_normalized(columName); + long hash = FnvHash.hashCode64(columName); return findColumn(hash); } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java index 72c2b1e580..ae47307486 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java @@ -16,14 +16,11 @@ package com.alibaba.druid.sql.repository; import com.alibaba.druid.sql.ast.SQLDeclareItem; -import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -105,7 +102,7 @@ public interface SchemaResolveVisitor extends SQLASTVisitor { if (declares == null) { declares = new HashMap(); } - declares.put(x.getName().name_hash_lower(), x); + declares.put(x.getName().nameHashCode64(), x); } protected SQLDeclareItem findDeclare(long nameHash) { diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java index 81ab64e009..b342182c4b 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -22,7 +22,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerUpdateStatement; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.PGUtils; import java.util.ArrayList; @@ -815,7 +815,7 @@ class SchemaResolveVisitorFactory { } public boolean visit(SQLIdentifierExpr x) { - if (PGUtils.isPseudoColumn(x.name_hash_lower())) { + if (PGUtils.isPseudoColumn(x.nameHashCode64())) { return false; } @@ -1255,7 +1255,7 @@ class SchemaResolveVisitorFactory { SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) orderByItemExpr; identifierExpr.setResolvedTableSource(table); - SQLColumnDefinition column = x.findColumn(identifierExpr.name_hash_lower()); + SQLColumnDefinition column = x.findColumn(identifierExpr.nameHashCode64()); if (column != null) { identifierExpr.setResolvedColumn(column); } @@ -1414,10 +1414,10 @@ class SchemaResolveVisitorFactory { } String ident = x.getName(); - long hash = x.name_hash_lower(); + long hash = x.nameHashCode64(); SQLTableSource tableSource = null; - if ((hash == FNVUtils.LEVEL || hash == FNVUtils.CONNECT_BY_ISCYCLE) + if ((hash == FnvConstants.LEVEL || hash == FnvConstants.CONNECT_BY_ISCYCLE) && ctx.object instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) ctx.object; if (queryBlock.getStartWith() != null @@ -1527,7 +1527,7 @@ class SchemaResolveVisitorFactory { SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - long identHash = identExpr.name_hash_lower(); + long identHash = identExpr.nameHashCode64(); tableSource = unwrapAlias(ctx, tableSource, identHash); } @@ -1562,7 +1562,7 @@ class SchemaResolveVisitorFactory { SQLExpr ownerObj = x.getOwner(); if (ownerObj instanceof SQLIdentifierExpr) { SQLIdentifierExpr owner = (SQLIdentifierExpr) ownerObj; - owner_hash = owner.name_hash_lower(); + owner_hash = owner.nameHashCode64(); } else if (ownerObj instanceof SQLPropertyExpr) { owner_hash = ((SQLPropertyExpr) ownerObj).hashCode64(); } @@ -1625,7 +1625,7 @@ class SchemaResolveVisitorFactory { if (tableSource != null) { x.setResolvedTableSource(tableSource); - SQLColumnDefinition column = tableSource.findColumn(x.name_hash_lower()); + SQLColumnDefinition column = tableSource.findColumn(x.nameHashCode64()); if (column != null) { x.setResolvedColumn(column); } @@ -1717,7 +1717,7 @@ class SchemaResolveVisitorFactory { } SQLTableSource tableSource = x.findTableSource(propertyExpr.getOwnernName()); if (tableSource != null) { - column = tableSource.findColumn(propertyExpr.name_hash_lower()); + column = tableSource.findColumn(propertyExpr.nameHashCode64()); if (column != null) { propertyExpr.setResolvedColumn(column); } @@ -1726,7 +1726,7 @@ class SchemaResolveVisitorFactory { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; visitor.visit(identExpr); - long name_hash = identExpr.name_hash_lower(); + long name_hash = identExpr.nameHashCode64(); SQLColumnDefinition column = identExpr.getResolvedColumn(); if (column != null) { @@ -1786,7 +1786,7 @@ class SchemaResolveVisitorFactory { if (orderByItemExpr instanceof SQLIdentifierExpr) { SQLIdentifierExpr orderByItemIdentExpr = (SQLIdentifierExpr) orderByItemExpr; - long hash = orderByItemIdentExpr.name_hash_lower(); + long hash = orderByItemIdentExpr.nameHashCode64(); SQLSelectItem selectItem = x.findSelectItem(hash); if (selectItem != null) { @@ -1901,7 +1901,7 @@ class SchemaResolveVisitorFactory { if (orderByItemExpr instanceof SQLIdentifierExpr) { SQLIdentifierExpr orderByItemIdentExpr = (SQLIdentifierExpr) orderByItemExpr; - long hash = orderByItemIdentExpr.name_hash_lower(); + long hash = orderByItemIdentExpr.nameHashCode64(); SQLSelectItem selectItem = null; if (queryBlock != null) { @@ -1971,7 +1971,7 @@ class SchemaResolveVisitorFactory { if (identifierExpr != null) { checkParameter(visitor, identifierExpr); - SQLTableSource tableSource = unwrapAlias(visitor.getContext(), null, identifierExpr.name_hash_lower()); + SQLTableSource tableSource = unwrapAlias(visitor.getContext(), null, identifierExpr.nameHashCode64()); if (tableSource != null) { identifierExpr.setResolvedTableSource(tableSource); } 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 2f7c849018..6751600c5f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -36,7 +36,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExpr; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitorAdapter; import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement; -import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.repository.SchemaObject; import com.alibaba.druid.sql.repository.SchemaRepository; import com.alibaba.druid.stat.TableStat; @@ -44,7 +43,8 @@ import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Condition; import com.alibaba.druid.stat.TableStat.Mode; import com.alibaba.druid.stat.TableStat.Relationship; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.StringUtils; @@ -268,7 +268,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } } else if (tableSource instanceof SQLWithSubqueryClause.Entry || tableSource instanceof SQLSubqueryTableSource) { - SQLTableSource xx = tableSource.findTableSourceWithColumn(x.name_hash_lower()); + SQLTableSource xx = tableSource.findTableSourceWithColumn(x.nameHashCode64()); if (xx != null) { } @@ -930,7 +930,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - column = addColumn(table.getName(), ident, table.name_hash_lower(), x.name_hash_lower()); + column = addColumn(table.getName(), ident, table.nameHashCode64(), x.nameHashCode64()); if (column != null && isParentGroupBy(x)) { this.groupByColumns.add(column); @@ -939,7 +939,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } else if (expr instanceof SQLPropertyExpr) { SQLPropertyExpr table = (SQLPropertyExpr) expr; String tableName = table.toString(); - column = addColumn(tableName, ident, 0, x.name_hash_lower()); + column = addColumn(tableName, ident, 0, x.nameHashCode64()); if (column != null && isParentGroupBy(x)) { this.groupByColumns.add(column); @@ -969,7 +969,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { tableName = table.toString(); } - column = addColumn(tableName, ident, 0, x.name_hash_lower()); + column = addColumn(tableName, ident, 0, x.nameHashCode64()); } } } else if (tableSource instanceof SQLWithSubqueryClause.Entry @@ -1188,12 +1188,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - long hash = x.name_hash_lower(); + long hash = x.nameHashCode64(); if (isPseudoColumn(hash)) { return false; } - if ((hash == FNVUtils.LEVEL || hash == FNVUtils.CONNECT_BY_ISCYCLE) + if ((hash == FnvConstants.LEVEL || hash == FnvConstants.CONNECT_BY_ISCYCLE) && x.getResolvedColumn() == null && tableSource == null) { return false; @@ -1206,7 +1206,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr(); if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr table = (SQLIdentifierExpr) expr; - column = addColumn(table.getName(), ident, table.name_hash_lower(), hash); + column = addColumn(table.getName(), ident, table.nameHashCode64(), hash); if (column != null && isParentGroupBy(x)) { this.groupByColumns.add(column); @@ -1244,7 +1244,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { tableName = table.toString(); } - column = addColumn(tableName, ident, 0, x.name_hash_lower()); + column = addColumn(tableName, ident, 0, x.nameHashCode64()); } } } else if (tableSource instanceof SQLWithSubqueryClause.Entry @@ -1421,9 +1421,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { int p = tableName.indexOf('.'); if (p != -1) { SQLExpr owner = SQLUtils.toSQLExpr(tableName, dbType); - hashCode = FNVUtils.fnv_64_lower(new SQLPropertyExpr(owner, columnName)); + hashCode = new SQLPropertyExpr(owner, columnName).hashCode64(); } else { - hashCode = FNVUtils.fnv_64_lower(tableName, columnName); + hashCode = FnvHash.fnv_64_lower(tableName, columnName); } return columns.containsKey(hashCode); } diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index 3c1764b629..65e766d312 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -18,9 +18,8 @@ package com.alibaba.druid.stat; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; -import com.alibaba.druid.util.StringUtils; import java.util.ArrayList; import java.util.HashMap; @@ -187,12 +186,11 @@ public class TableStat { public static class Name { private final String name; - - private final long hash; + private final long hashCode64; public Name(String name){ - this.name = name; - hash = FNVUtils.fnv_64_lower_normalized(name); + this.name = name; + hashCode64 = FnvHash.hashCode64(name); } public String getName() { @@ -205,7 +203,7 @@ public class TableStat { } public long hashCode64() { - return hash; + return hashCode64; } public boolean equals(Object o) { @@ -214,7 +212,7 @@ public class TableStat { } Name other = (Name) o; - return this.hash == other.hash; + return this.hashCode64 == other.hashCode64; } public String toString() { @@ -223,7 +221,6 @@ public class TableStat { } public static class Relationship { - private Column left; private Column right; private String operator; @@ -437,9 +434,9 @@ public class TableStat { dbType = JdbcConstants.ORACLE; } SQLExpr owner = SQLUtils.toSQLExpr(table, dbType); - hashCode64 = FNVUtils.fnv_64_lower(new SQLPropertyExpr(owner, name)); + hashCode64 = new SQLPropertyExpr(owner, name).hashCode64(); } else { - hashCode64 = FNVUtils.fnv_64_lower(table, name); + hashCode64 = FnvHash.fnv_64_lower(table, name); } } diff --git a/src/main/java/com/alibaba/druid/util/FNVUtils.java b/src/main/java/com/alibaba/druid/util/FNVUtils.java deleted file mode 100644 index aad5b92810..0000000000 --- a/src/main/java/com/alibaba/druid/util/FNVUtils.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright 1999-2017 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.util; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class FNVUtils { - public final static long HIGH_PRIORITY = fnv_64_lower("HIGH_PRIORITY"); - public final static long DISTINCTROW = fnv_64_lower("DISTINCTROW"); - public final static long STRAIGHT_JOIN = fnv_64_lower("STRAIGHT_JOIN"); - public final static long SQL_SMALL_RESULT = fnv_64_lower("SQL_SMALL_RESULT"); - public final static long SQL_BIG_RESULT = fnv_64_lower("SQL_BIG_RESULT"); - public final static long SQL_BUFFER_RESULT = fnv_64_lower("SQL_BUFFER_RESULT"); - public final static long SQL_CACHE = fnv_64_lower("SQL_CACHE"); - public final static long SQL_NO_CACHE = fnv_64_lower("SQL_NO_CACHE"); - public final static long SQL_CALC_FOUND_ROWS = fnv_64_lower("SQL_CALC_FOUND_ROWS"); - public final static long OUTFILE = fnv_64_lower("OUTFILE"); - public final static long SETS = fnv_64_lower("SETS"); - public final static long REGEXP = fnv_64_lower("REGEXP"); - public final static long RLIKE = fnv_64_lower("RLIKE"); - public final static long USING = fnv_64_lower("USING"); - public final static long IGNORE = fnv_64_lower("IGNORE"); - public final static long FORCE = fnv_64_lower("FORCE"); - public final static long CROSS = fnv_64_lower("CROSS"); - public final static long NATURAL = fnv_64_lower("NATURAL"); - public final static long APPLY = fnv_64_lower("APPLY"); - public final static long CONNECT = fnv_64_lower("CONNECT"); - public final static long START = fnv_64_lower("START"); - public final static long BTREE = fnv_64_lower("BTREE"); - public final static long HASH = fnv_64_lower("HASH"); - public final static long NO_WAIT = fnv_64_lower("NO_WAIT"); - public final static long WAIT = fnv_64_lower("WAIT"); - public final static long NOWAIT = fnv_64_lower("NOWAIT"); - public final static long ERRORS = fnv_64_lower("ERRORS"); - public final static long VALUE = fnv_64_lower("VALUE"); - public final static long NEXT = fnv_64_lower("NEXT"); - public final static long LOW_PRIORITY = fnv_64_lower("LOW_PRIORITY"); - public final static long COMMIT_ON_SUCCESS = fnv_64_lower("COMMIT_ON_SUCCESS"); - public final static long ROLLBACK_ON_FAIL = fnv_64_lower("ROLLBACK_ON_FAIL"); - public final static long QUEUE_ON_PK = fnv_64_lower("QUEUE_ON_PK"); - public final static long TARGET_AFFECT_ROW = fnv_64_lower("TARGET_AFFECT_ROW"); - public final static long COLLATE = fnv_64_lower("COLLATE"); - public final static long BOOLEAN = fnv_64_lower("BOOLEAN"); - public final static long CHARSET = fnv_64_lower("CHARSET"); - public final static long SEMI = fnv_64_lower("SEMI"); - public final static long ANTI = fnv_64_lower("ANTI"); - public final static long PRIOR = fnv_64_lower("PRIOR"); - public final static long NOCYCLE = fnv_64_lower("NOCYCLE"); - public final static long CONNECT_BY_ROOT = fnv_64_lower("CONNECT_BY_ROOT"); - public final static long DATE = fnv_64_lower("DATE"); - public final static long CURRENT = fnv_64_lower("CURRENT"); - public final static long COUNT = fnv_64_lower("COUNT"); - public final static long AVG = fnv_64_lower("AVG"); - public final static long MAX = fnv_64_lower("MAX"); - public final static long MIN = fnv_64_lower("MIN"); - public final static long STDDEV = fnv_64_lower("STDDEV"); - public final static long SUM = fnv_64_lower("SUM"); - public final static long GROUP_CONCAT = fnv_64_lower("GROUP_CONCAT"); - public final static long DEDUPLICATION = fnv_64_lower("DEDUPLICATION"); - public final static long CONVERT = fnv_64_lower("CONVERT"); - public final static long CHAR = fnv_64_lower("CHAR"); - public final static long TRIM = fnv_64_lower("TRIM"); - public final static long LEADING = fnv_64_lower("LEADING"); - public final static long BOTH = fnv_64_lower("BOTH"); - public final static long TRAILING = fnv_64_lower("TRAILING"); - public final static long MOD = fnv_64_lower("MOD"); - public final static long MATCH = fnv_64_lower("MATCH"); - public final static long EXTRACT = fnv_64_lower("EXTRACT"); - public final static long POSITION = fnv_64_lower("POSITION"); - public final static long DUAL = fnv_64_lower("DUAL"); - public final static long LEVEL = fnv_64_lower("LEVEL"); - public final static long CONNECT_BY_ISCYCLE = fnv_64_lower("CONNECT_BY_ISCYCLE"); - public final static long CURRENT_TIMESTAMP = fnv_64_lower("CURRENT_TIMESTAMP"); - public final static long FALSE = fnv_64_lower("FALSE"); - - public static long fnv_64(String input) { - if (input == null) { - return 0; - } - - long hash = 0xcbf29ce484222325L; - for (int i = 0; i < input.length(); ++i) { - char c = input.charAt(i); - hash ^= c; - hash *= 0x100000001b3L; - } - - return hash; - } - - public static long fnv_64_lower(String key) { - long hashCode = 0xcbf29ce484222325L; - for (int i = 0; i < key.length(); ++i) { - char ch = key.charAt(i); - - if (ch >= 'A' && ch <= 'Z') { - ch = (char) (ch + 32); - } - - hashCode ^= ch; - hashCode *= 0x100000001b3L; - } - - return hashCode; - } - - public static long fnv_64_lower_normalized(String name) { - if (name == null) { - return 0; - } - - boolean quote = false; - - int len = name.length(); - if (len > 2) { - char c0 = name.charAt(0); - char c1 = name.charAt(len - 1); - if ((c0 == '`' && c1 == '`') - || (c0 == '"' && c1 == '"') - || (c0 == '\'' && c1 == '\'') - || (c0 == '[' && c1 == ']')) { - quote = true; - } - } - if (quote) { - return FNVUtils.fnv_64_lower(name, 1, len - 1); - } else { - return FNVUtils.fnv_64_lower(name); - } - } - - public static long fnv_64_lower(String key, int offset, int end) { - long hashCode = 0xcbf29ce484222325L; - for (int i = offset; i < end; ++i) { - char ch = key.charAt(i); - - if (ch >= 'A' && ch <= 'Z') { - ch = (char) (ch + 32); - } - - hashCode ^= ch; - hashCode *= 0x100000001b3L; - } - - return hashCode; - } - - public static long fnv_32_lower(String key) { - long hashCode = 0x811c9dc5; - for (int i = 0; i < key.length(); ++i) { - char ch = key.charAt(i); - if (ch == '_' || ch == '-') { - continue; - } - - if (ch >= 'A' && ch <= 'Z') { - ch = (char) (ch + 32); - } - - hashCode ^= ch; - hashCode *= 0x01000193; - } - - return hashCode; - } - - public static long[] fnv_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]); - } - if (sort) { - Arrays.sort(hashCodes); - } - return hashCodes; - } - - public static long fnv_64_lower(SQLPropertyExpr propertyExpr) { - List items = new ArrayList(); - items.add(propertyExpr.getName()); - - for (SQLExpr x = propertyExpr.getOwner();x != null;) { - if (x instanceof SQLPropertyExpr) { - SQLPropertyExpr p = (SQLPropertyExpr) x; - items.add(p.getName()); - x = p.getOwner(); - continue; - } - items.add(x.toString()); - break; - } - - Collections.reverse(items); - - long hashCode = 0xcbf29ce484222325L; - - for (int i = 0; i < items.size(); i++) { - if (i != 0) { - hashCode ^= '.'; - hashCode *= 0x100000001b3L; - } - - String item = items.get(i); - - boolean quote = false; - - int len = item.length(); - if (len > 2) { - char c0 = item.charAt(0); - char c1 = item.charAt(len - 1); - if ((c0 == '`' && c1 == '`') - || (c0 == '"' && c1 == '"') - || (c0 == '\'' && c1 == '\'') - || (c0 == '[' && c1 == ']')) { - quote = true; - } - } - - int start = quote ? 1 : 0; - int end = quote ? len - 1 : len; - for (int j = start; j < end; ++j) { - char ch = item.charAt(j); - - if (ch >= 'A' && ch <= 'Z') { - ch = (char) (ch + 32); - } - - hashCode ^= ch; - hashCode *= 0x100000001b3L; - } - } - - return hashCode; - } - - public static long fnv_64_lower(String owner, String name) { - long hashCode = 0xcbf29ce484222325L; - - if (owner != null) { - String item = owner; - - boolean quote = false; - - int len = item.length(); - if (len > 2) { - char c0 = item.charAt(0); - char c1 = item.charAt(len - 1); - if ((c0 == '`' && c1 == '`') - || (c0 == '"' && c1 == '"') - || (c0 == '\'' && c1 == '\'') - || (c0 == '[' && c1 == ']')) { - quote = true; - } - } - - int start = quote ? 1 : 0; - int end = quote ? len - 1 : len; - for (int j = start; j < end; ++j) { - char ch = item.charAt(j); - - if (ch >= 'A' && ch <= 'Z') { - ch = (char) (ch + 32); - } - - hashCode ^= ch; - hashCode *= 0x100000001b3L; - } - - hashCode ^= '.'; - hashCode *= 0x100000001b3L; - } - - - if (name != null) { - String item = name; - - boolean quote = false; - - int len = item.length(); - if (len > 2) { - char c0 = item.charAt(0); - char c1 = item.charAt(len - 1); - if ((c0 == '`' && c1 == '`') - || (c0 == '"' && c1 == '"') - || (c0 == '\'' && c1 == '\'') - || (c0 == '[' && c1 == ']')) { - quote = true; - } - } - - int start = quote ? 1 : 0; - int end = quote ? len - 1 : len; - for (int j = start; j < end; ++j) { - char ch = item.charAt(j); - - if (ch >= 'A' && ch <= 'Z') { - ch = (char) (ch + 32); - } - - hashCode ^= ch; - hashCode *= 0x100000001b3L; - } - } - - return hashCode; - } -} diff --git a/src/main/java/com/alibaba/druid/util/FnvConstants.java b/src/main/java/com/alibaba/druid/util/FnvConstants.java new file mode 100644 index 0000000000..9e13dd2af2 --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/FnvConstants.java @@ -0,0 +1,147 @@ +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 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 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"); +} diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java new file mode 100644 index 0000000000..4e4739ce04 --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -0,0 +1,241 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.util; + +import java.util.Arrays; + +public final class FnvHash { + public final static long BASIC = 0xcbf29ce484222325L; + public final static long PRIME = 0x100000001b3L; + + public static long fnv_64(String input) { + if (input == null) { + return 0; + } + + long hash = BASIC; + for (int i = 0; i < input.length(); ++i) { + char c = input.charAt(i); + hash ^= c; + hash *= PRIME; + } + + return hash; + } + + + + /** + * lower & normalized & fnv_1a_64 + * @param name + * @return + */ + public static long hashCode64(String name) { + if (name == null) { + return 0; + } + + boolean quote = false; + + int len = name.length(); + if (len > 2) { + char c0 = name.charAt(0); + char c1 = name.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + if (quote) { + return FnvHash.hashCode64(name, 1, len - 1); + } else { + return FnvHash.hashCode64(name, 0, len); + } + } + + public static long fnv_64_lower(String key) { + long hashCode = BASIC; + for (int i = 0; i < key.length(); ++i) { + char ch = key.charAt(i); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= PRIME; + } + + return hashCode; + } + + public static long hashCode64(String key, int offset, int end) { + long hashCode = BASIC; + for (int i = offset; i < end; ++i) { + char ch = key.charAt(i); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= PRIME; + } + + return hashCode; + } + + public static long hashCode64(long basic, String name) { + boolean quote = false; + + int len = name.length(); + if (len > 2) { + char c0 = name.charAt(0); + char c1 = name.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + if (quote) { + return FnvHash.hashCode64(basic, name, 1, len - 1); + } else { + return FnvHash.hashCode64(basic, name, 0, len); + } + } + + public static long hashCode64(long basic, String key, int offset, int end) { + long hashCode = basic; + for (int i = offset; i < end; ++i) { + char ch = key.charAt(i); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= PRIME; + } + + return hashCode; + } + + public static long fnv_32_lower(String key) { + long hashCode = 0x811c9dc5; + for (int i = 0; i < key.length(); ++i) { + char ch = key.charAt(i); + if (ch == '_' || ch == '-') { + continue; + } + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= 0x01000193; + } + + return hashCode; + } + + public static long[] fnv_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]); + } + if (sort) { + Arrays.sort(hashCodes); + } + return hashCodes; + } + + public static long fnv_64_lower(String owner, String name) { + long hashCode = BASIC; + + if (owner != null) { + String item = owner; + + boolean quote = false; + + int len = item.length(); + if (len > 2) { + char c0 = item.charAt(0); + char c1 = item.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + + int start = quote ? 1 : 0; + int end = quote ? len - 1 : len; + for (int j = start; j < end; ++j) { + char ch = item.charAt(j); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= PRIME; + } + + hashCode ^= '.'; + hashCode *= PRIME; + } + + + if (name != null) { + String item = name; + + boolean quote = false; + + int len = item.length(); + if (len > 2) { + char c0 = item.charAt(0); + char c1 = item.charAt(len - 1); + if ((c0 == '`' && c1 == '`') + || (c0 == '"' && c1 == '"') + || (c0 == '\'' && c1 == '\'') + || (c0 == '[' && c1 == ']')) { + quote = true; + } + } + + int start = quote ? 1 : 0; + int end = quote ? len - 1 : len; + for (int j = start; j < end; ++j) { + char ch = item.charAt(j); + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= PRIME; + } + } + + return hashCode; + } +} diff --git a/src/main/java/com/alibaba/druid/util/PGUtils.java b/src/main/java/com/alibaba/druid/util/PGUtils.java index 0e75d86262..af7dbc7bd3 100644 --- a/src/main/java/com/alibaba/druid/util/PGUtils.java +++ b/src/main/java/com/alibaba/druid/util/PGUtils.java @@ -74,7 +74,7 @@ public class PGUtils { private final static long[] pseudoColumnHashCodes; static { long[] array = { - FNVUtils.CURRENT_TIMESTAMP + FnvConstants.CURRENT_TIMESTAMP }; Arrays.sort(array); pseudoColumnHashCodes = array; diff --git a/src/main/java/com/alibaba/druid/util/Utils.java b/src/main/java/com/alibaba/druid/util/Utils.java index 75433c3235..219c594420 100644 --- a/src/main/java/com/alibaba/druid/util/Utils.java +++ b/src/main/java/com/alibaba/druid/util/Utils.java @@ -24,8 +24,6 @@ import java.util.Date; import java.util.Properties; import java.util.Set; -import javax.servlet.GenericServlet; - public class Utils { public final static int DEFAULT_BUFFER_SIZE = 1024 * 4; @@ -409,15 +407,15 @@ public class Utils { } public static long fnv_64(String input) { - return FNVUtils.fnv_64(input); + return FnvHash.fnv_64(input); } public static long fnv_64_lower(String key) { - return FNVUtils.fnv_64_lower(key); + return FnvHash.fnv_64_lower(key); } public static long fnv_32_lower(String key) { - return FNVUtils.fnv_32_lower(key); + return FnvHash.fnv_32_lower(key); } public static void loadFromFile(String path, Set set) { diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 269474afe2..110a7200fd 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -52,6 +52,7 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.sql.visitor.functions.Nil; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; +import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcUtils; import com.alibaba.druid.util.ServletPathMatcher; import com.alibaba.druid.util.StringUtils; @@ -1622,7 +1623,8 @@ public class WallVisitorUtils { if (queryBlock.getSelectList().size() == 1) { SQLExpr selectItemExpr = queryBlock.getSelectList().get(0).getExpr(); if (selectItemExpr instanceof SQLAggregateExpr) { - if (((SQLAggregateExpr) selectItemExpr).getMethodName().equalsIgnoreCase("COUNT")) { + if (((SQLAggregateExpr) selectItemExpr) + .methodNameHashCod64() == FnvConstants.COUNT) { simpleCount = true; } } 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 cca1897ee6..042c10138a 100644 --- a/src/test/java/com/alibaba/druid/benckmark/sql/MySqlParameterizedBenchmark.java +++ b/src/test/java/com/alibaba/druid/benckmark/sql/MySqlParameterizedBenchmark.java @@ -38,7 +38,7 @@ public class MySqlParameterizedBenchmark extends TestCase { // perf_parse(sql3); // 9174 5875 5805 5536 5717 // perf_parse(sql4); // 2953 2502 - perf_stat(sql); // 11793 13628 13561 13259 9909 + perf_stat(sql); // 11793 13628 13561 13259 9819 // perf_resolve(sql); // 4970 4586 } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/HashTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/HashTest_0.java index 019bdc2d2c..32393b7a1a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/HashTest_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/HashTest_0.java @@ -5,17 +5,17 @@ import junit.framework.TestCase; public class HashTest_0 extends TestCase { public void test_issue() throws Exception { - assertEquals(new SQLIdentifierExpr("a").name_hash_lower() - , new SQLIdentifierExpr("A").name_hash_lower());; + assertEquals(new SQLIdentifierExpr("a").nameHashCode64() + , new SQLIdentifierExpr("A").nameHashCode64());; } public void test_issue_1() throws Exception { - assertEquals(new SQLIdentifierExpr("a").name_hash_lower() - , new SQLIdentifierExpr("`A`").name_hash_lower());; + assertEquals(new SQLIdentifierExpr("a").nameHashCode64() + , new SQLIdentifierExpr("`A`").nameHashCode64());; } public void test_issue_2() throws Exception { - assertEquals(new SQLIdentifierExpr("\"a\"").name_hash_lower() - , new SQLIdentifierExpr("`A`").name_hash_lower());; + assertEquals(new SQLIdentifierExpr("\"a\"").nameHashCode64() + , new SQLIdentifierExpr("`A`").nameHashCode64());; } } 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 012fdb3b1c..ad22b5282b 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 @@ -1,29 +1,28 @@ package com.alibaba.druid.bvt.sql; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.util.FNVUtils; +import com.alibaba.druid.util.FnvHash; import junit.framework.TestCase; public class HashTest_1_propertyExpr extends TestCase { public void test_issue() throws Exception { - assertEquals(new SQLPropertyExpr("t","a").name_hash_lower() - , new SQLPropertyExpr("t","A").name_hash_lower());; + assertEquals(new SQLPropertyExpr("t","a").nameHashCode64() + , new SQLPropertyExpr("t","A").nameHashCode64());; } public void test_issue_1() throws Exception { - assertEquals(new SQLPropertyExpr("t","a").name_hash_lower() - , new SQLPropertyExpr("t","`A`").name_hash_lower());; + assertEquals(new SQLPropertyExpr("t","a").nameHashCode64() + , new SQLPropertyExpr("t","`A`").nameHashCode64());; } public void test_issue_2() throws Exception { - assertEquals(new SQLPropertyExpr("t","\"a\"").name_hash_lower() - , new SQLPropertyExpr("t","`A`").name_hash_lower());; + assertEquals(new SQLPropertyExpr("t","\"a\"").nameHashCode64() + , new SQLPropertyExpr("t","`A`").nameHashCode64());; } public void test_issue_3() throws Exception { - assertEquals(new SQLPropertyExpr("ESCROW","HT_TASK_TRADE_HISTORY_NEW").name_hash_lower() - , new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").name_hash_lower());; + assertEquals(new SQLPropertyExpr("ESCROW","HT_TASK_TRADE_HISTORY_NEW").nameHashCode64() + , new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").nameHashCode64());; } public void test_issue_4() throws Exception { @@ -33,14 +32,16 @@ public class HashTest_1_propertyExpr extends TestCase { public void test_issue_5() throws Exception { assertEquals( - FNVUtils.fnv_64_lower("a.b") - , FNVUtils.fnv_64_lower(new SQLPropertyExpr("\"a\"","\"b\"")));; + FnvHash.fnv_64_lower("a.b"), + new SQLPropertyExpr("\"a\"","\"b\"") + .hashCode64() + ); } public void test_issue_6() throws Exception { assertEquals( - FNVUtils.fnv_64_lower("ESCROW.HT_TASK_TRADE_HISTORY_NEW") - , FNVUtils.fnv_64_lower(new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"")));; + FnvHash.fnv_64_lower("ESCROW.HT_TASK_TRADE_HISTORY_NEW"), + new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").hashCode64()); } //ESCROW.HT_TASK_TRADE_HISTORY_NEW