From 947059f7158af7fccc3696a505c6ecec0ce1ec94 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 31 Aug 2017 11:20:04 +0800 Subject: [PATCH] improved sql parser. --- .../com/alibaba/druid/sql/ast/SQLExpr.java | 3 +- .../com/alibaba/druid/sql/ast/SQLObject.java | 43 +- .../alibaba/druid/sql/ast/SQLStatement.java | 9 +- .../druid/sql/ast/SQLStatementImpl.java | 7 +- .../druid/sql/ast/SQLSubPartition.java | 5 +- .../druid/sql/ast/SQLSubPartitionBy.java | 8 +- .../druid/sql/ast/expr/SQLAggregateExpr.java | 10 +- .../druid/sql/ast/expr/SQLIdentifierExpr.java | 8 + .../druid/sql/ast/expr/SQLNumberExpr.java | 26 +- .../ast/statement/SQLColumnDefinition.java | 14 +- .../sql/ast/statement/SQLConstraintImpl.java | 7 +- .../statement/SQLCreateTableStatement.java | 14 +- .../druid/sql/ast/statement/SQLUnique.java | 6 +- .../sql/ast/statement/SQLUpdateSetItem.java | 9 + .../sql/dialect/db2/parser/DB2ExprParser.java | 15 +- .../dialect/mysql/parser/MySqlExprParser.java | 75 ++- .../mysql/parser/MySqlSelectParser.java | 42 +- .../mysql/parser/MySqlStatementParser.java | 22 +- .../oracle/parser/OracleExprParser.java | 18 +- .../oracle/parser/OracleSelectParser.java | 5 + .../visitor/OracleSchemaStatVisitor.java | 7 +- .../visitor/OracleToMySqlOutputVisitor.java | 5 +- .../com/alibaba/druid/sql/parser/Lexer.java | 21 +- .../druid/sql/parser/SQLExprParser.java | 134 ++--- .../druid/sql/parser/SQLSelectParser.java | 66 +-- .../druid/sql/parser/SQLStatementParser.java | 456 +++++++++-------- .../SchemaResolveVisitorFactory.java | 4 +- .../druid/sql/visitor/SchemaStatVisitor.java | 9 +- .../com/alibaba/druid/util/FnvConstants.java | 142 +----- .../java/com/alibaba/druid/util/FnvHash.java | 144 ++++++ .../java/com/alibaba/druid/util/PGUtils.java | 2 +- .../druid/wall/spi/WallVisitorUtils.java | 4 +- .../bvt/sql/HashTest_1_propertyExpr.java | 19 + .../alibaba/druid/bvt/sql/SimplifyTest.java | 23 + .../sql/oracle/select/OracleSelectTest77.java | 116 +++++ .../sql/oracle/select/OracleSelectTest78.java | 463 ++++++++++++++++++ 36 files changed, 1291 insertions(+), 670 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/SimplifyTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest77.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest78.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java b/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java index 713221f5a7..f5a6fd8aa8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java @@ -16,7 +16,6 @@ package com.alibaba.druid.sql.ast; public interface SQLExpr extends SQLObject, Cloneable { - SQLExpr clone(); - + SQLExpr clone(); SQLDataType computeDataType(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java b/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java index 620ecfab14..4863473d0e 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java @@ -21,37 +21,24 @@ import java.util.Map; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface SQLObject { + void accept(SQLASTVisitor visitor); + SQLObject clone(); - void accept(SQLASTVisitor visitor); - - SQLObject getParent(); - - void setParent(SQLObject parent); + SQLObject getParent(); + void setParent(SQLObject parent); Map getAttributes(); - - Object getAttribute(String name); - - void putAttribute(String name, Object value); - + Object getAttribute(String name); + void putAttribute(String name, Object value); Map getAttributesDirect(); - - void addBeforeComment(String comment); - void addBeforeComment(List comments); - - List getBeforeCommentsDirect(); - - void addAfterComment(String comment); - - void addAfterComment(List comments); - - List getAfterCommentsDirect(); - - boolean hasBeforeComment(); - - boolean hasAfterComment(); + void output(StringBuffer buf); - void output(StringBuffer buf); - - SQLObject clone(); + void addBeforeComment(String comment); + void addBeforeComment(List comments); + List getBeforeCommentsDirect(); + void addAfterComment(String comment); + void addAfterComment(List comments); + List getAfterCommentsDirect(); + boolean hasBeforeComment(); + boolean hasAfterComment(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java b/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java index 0ea8d338cf..d407202f03 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java @@ -16,11 +16,8 @@ package com.alibaba.druid.sql.ast; public interface SQLStatement extends SQLObject { - String getDbType(); - - boolean isAfterSemi(); - - void setAfterSemi(boolean afterSemi); - + String getDbType(); + boolean isAfterSemi(); + void setAfterSemi(boolean afterSemi); SQLStatement clone(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java index bd708ce492..71277a136b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java @@ -21,11 +21,8 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.List; public abstract class SQLStatementImpl extends SQLObjectImpl implements SQLStatement { - - protected String dbType; - - private boolean afterSemi; - + protected String dbType; + protected boolean afterSemi; protected List headHints; public SQLStatementImpl(){ diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java index 7846073126..2c3d93d615 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java @@ -18,12 +18,9 @@ package com.alibaba.druid.sql.ast; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLSubPartition extends SQLObjectImpl { - protected SQLName name; - protected SQLPartitionValue values; - - private SQLName tableSpace; + protected SQLName tableSpace; public SQLName getName() { return name; diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java index 6866fc1ffd..73dfbd2283 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java @@ -22,11 +22,9 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; public abstract class SQLSubPartitionBy extends SQLObjectImpl { - protected SQLExpr subPartitionsCount; - protected boolean linear; - - protected List options = new ArrayList(); - + protected SQLExpr subPartitionsCount; + protected boolean linear; + protected List options = new ArrayList(); protected List subPartitionTemplate = new ArrayList(); public SQLExpr getSubPartitionsCount() { 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 b73e1583e9..decf1df11c 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,7 +22,7 @@ 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.Constants; import com.alibaba.druid.util.FnvHash; public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLReplaceable { @@ -220,8 +220,8 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe public SQLDataType computeDataType() { long hash = methodNameHashCod64(); - if (hash == FnvConstants.COUNT - || hash == FnvConstants.ROW_NUMBER) { + if (hash == FnvHash.Constants.COUNT + || hash == FnvHash.Constants.ROW_NUMBER) { return SQLIntegerExpr.DEFAULT_DATA_TYPE; } @@ -232,8 +232,8 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe } } - if (hash == FnvConstants.WM_CONAT - || hash == FnvConstants.GROUP_CONCAT) { + if (hash == FnvHash.Constants.WM_CONAT + || hash == FnvHash.Constants.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 af6ab6e56c..ae4c502003 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 @@ -109,6 +109,14 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { return x; } + public SQLIdentifierExpr simplify() { + String normalized = SQLUtils.normalize(name); + if (normalized != name) { + return new SQLIdentifierExpr(name, hashCode64); + } + return this; + } + public String normalizedName() { return SQLUtils.normalize(name); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumberExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumberExpr.java index 5d6b874964..b34974a2e1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumberExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumberExpr.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLDataTypeImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import com.alibaba.druid.util.Utils; import java.io.IOException; import java.math.BigDecimal; @@ -80,13 +81,12 @@ public class SQLNumberExpr extends SQLNumericLiteralExpr implements SQLValuableE @Override public int hashCode() { - if (chars != null && number == null) { - this.number = new BigDecimal(chars); + Number number = getNumber(); + if (number == null) { + return 0; } - final int prime = 31; - int result = 1; - result = prime * result + ((number == null) ? 0 : number.hashCode()); - return result; + + return number.hashCode(); } @Override @@ -104,19 +104,9 @@ public class SQLNumberExpr extends SQLNumericLiteralExpr implements SQLValuableE if (getClass() != obj.getClass()) { return false; } - SQLNumberExpr other = (SQLNumberExpr) obj; - if (other.chars != null && other.number == null) { - other.number = new BigDecimal(other.chars); - } - if (number == null) { - if (other.number != null) { - return false; - } - } else if (!number.equals(other.number)) { - return false; - } - return true; + SQLNumberExpr other = (SQLNumberExpr) obj; + return Utils.equals(getNumber(), other.getNumber()); } public SQLNumberExpr clone() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java index e2fc571bf7..f6df1871ee 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java @@ -94,6 +94,14 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen return name; } + public long nameHashCode64() { + if (name == null) { + return 0; + } + + return name.hashCode64(); + } + public String getNameAsString() { if (name == null) { return null; @@ -379,8 +387,10 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen if (this.name instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) this.name; String columnName = identExpr.getName(); - columnName = SQLUtils.normalize(columnName, dbType); - this.setName(columnName); + String normalized = SQLUtils.normalize(columnName, dbType); + if (normalized != columnName) { + this.setName(normalized); + } } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java index 4a4dd38a7a..7e5eb68c56 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLConstraintImpl.java @@ -110,8 +110,11 @@ public abstract class SQLConstraintImpl extends SQLObjectImpl implements SQLCons if (this.name instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) this.name; String columnName = identExpr.getName(); - columnName = SQLUtils.normalize(columnName, dbType); - this.setName(columnName); + + String normalized = SQLUtils.normalize(columnName, dbType); + if (columnName != normalized) { + this.setName(normalized); + } } } } 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 45d4199cb8..faf73eeab0 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 @@ -573,15 +573,21 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS if (name instanceof SQLPropertyExpr) { String tableName = ((SQLPropertyExpr) name).getName(); tableName = SQLUtils.normalize(tableName); - setName(tableName); - name = getName(); + + String normalized = SQLUtils.normalize(tableName, dbType); + if (tableName != normalized) { + this.setName(normalized); + name = getName(); + } } if (name instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) name; String tableName = identExpr.getName(); - tableName = SQLUtils.normalize(tableName, dbType); - setName(tableName); + String normalized = SQLUtils.normalize(tableName, dbType); + if (normalized != tableName) { + setName(normalized); + } } for (SQLTableElement element : this.tableElementList) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java index 50790d7e38..1a99ef83ad 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java @@ -97,8 +97,10 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, if (column instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) column; String columnName = identExpr.getName(); - columnName = SQLUtils.normalize(columnName, dbType); - item.setExpr(new SQLIdentifierExpr(columnName)); + String normalized = SQLUtils.normalize(columnName, dbType); + if (normalized != columnName) { + item.setExpr(new SQLIdentifierExpr(columnName)); + } } } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java index 6dba1e6a9b..8ccc66f285 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; @@ -70,4 +71,12 @@ public class SQLUpdateSetItem extends SQLObjectImpl { } return false; } + + public boolean columnMatch(long columnHash) { + if (this.column instanceof SQLName) { + return ((SQLName) this.column).nameHashCode64() == columnHash; + } + + return false; + } } 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 de4ce926bd..901e56d904 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 @@ -24,7 +24,6 @@ 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.FnvHash; -import com.alibaba.druid.util.FnvConstants; import java.util.Arrays; @@ -62,16 +61,16 @@ public class DB2ExprParser extends SQLExprParser { } public SQLExpr primaryRest(SQLExpr expr) { - if (lexer.identifierEquals(FnvConstants.VALUE)) { + if (lexer.identifierEquals(FnvHash.Constants.VALUE)) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - if (identExpr.hashCode64() == FnvConstants.NEXT) { + if (identExpr.hashCode64() == FnvHash.Constants.NEXT) { lexer.nextToken(); accept(Token.FOR); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.NextVal); return seqExpr; - } else if (identExpr.hashCode64() == FnvConstants.PREVIOUS) { + } else if (identExpr.hashCode64() == FnvHash.Constants.PREVIOUS) { lexer.nextToken(); accept(Token.FOR); SQLName seqName = this.name(); @@ -79,19 +78,19 @@ public class DB2ExprParser extends SQLExprParser { return seqExpr; } } - } else if (lexer.identifierEquals(FnvConstants.DATE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.DATE)) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - if (identExpr.hashCode64() == FnvConstants.CURRENT) { + if (identExpr.hashCode64() == FnvHash.Constants.CURRENT) { lexer.nextToken(); expr = new SQLIdentifierExpr("CURRENT DATE"); } } - } else if (lexer.identifierEquals(FnvConstants.TIMESTAMP)) { + } else if (lexer.identifierEquals(FnvHash.Constants.TIMESTAMP)) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; - if (identExpr.hashCode64() == FnvConstants.CURRENT) { + if (identExpr.hashCode64() == FnvHash.Constants.CURRENT) { lexer.nextToken(); expr = new SQLIdentifierExpr("CURRENT DATE"); 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 da6c781729..7a3e75f2e0 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 @@ -51,7 +51,6 @@ 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.parser.*; import com.alibaba.druid.util.FnvHash; -import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; import java.util.Arrays; @@ -102,7 +101,7 @@ public class MySqlExprParser extends SQLExprParser { public SQLExpr primary() { final Token tok = lexer.token(); - if (lexer.identifierEquals(FnvConstants.OUTFILE)) { + if (lexer.identifierEquals(FnvHash.Constants.OUTFILE)) { lexer.nextToken(); SQLExpr file = primary(); SQLExpr expr = new MySqlOutFileExpr(file); @@ -175,7 +174,7 @@ public class MySqlExprParser extends SQLExprParser { MySqlCharExpr mysqlCharExpr = new MySqlCharExpr(charValue); mysqlCharExpr.setCharset(identExpr.getName()); - if (lexer.identifierEquals(FnvConstants.COLLATE)) { + if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { lexer.nextToken(); String collate = lexer.stringVal(); @@ -210,7 +209,7 @@ public class MySqlExprParser extends SQLExprParser { return primaryRest(expr); } - } else if (lexer.identifierEquals(FnvConstants.COLLATE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { lexer.nextToken(); if (lexer.token() == Token.EQ) { @@ -232,7 +231,7 @@ public class MySqlExprParser extends SQLExprParser { return primaryRest(expr); } else if (expr instanceof SQLVariantRefExpr) { - if (lexer.identifierEquals(FnvConstants.COLLATE)) { + if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { lexer.nextToken(); if (lexer.token() != Token.IDENTIFIER @@ -341,7 +340,7 @@ public class MySqlExprParser extends SQLExprParser { if (lexer.token() == Token.IN) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.NATURAL)) { + if (lexer.identifierEquals(FnvHash.Constants.NATURAL)) { lexer.nextToken(); acceptIdentifier("LANGUAGE"); acceptIdentifier("MODE"); @@ -353,7 +352,7 @@ public class MySqlExprParser extends SQLExprParser { } else { matchAgainstExpr.setSearchModifier(SearchModifier.IN_NATURAL_LANGUAGE_MODE); } - } else if (lexer.identifierEquals(FnvConstants.BOOLEAN)) { + } else if (lexer.identifierEquals(FnvHash.Constants.BOOLEAN)) { lexer.nextToken(); acceptIdentifier("MODE"); matchAgainstExpr.setSearchModifier(SearchModifier.IN_BOOLEAN_MODE); @@ -435,12 +434,12 @@ public class MySqlExprParser extends SQLExprParser { SQLExpr expr = this.expr(); column.setOnUpdate(expr); } - if (lexer.identifierEquals(FnvConstants.CHARSET)) { + if (lexer.identifierEquals(FnvHash.Constants.CHARSET)) { lexer.nextToken(); MySqlCharExpr charSetCollateExpr=new MySqlCharExpr(); charSetCollateExpr.setCharset(lexer.stringVal()); lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.COLLATE)) { + if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { lexer.nextToken(); charSetCollateExpr.setCollate(lexer.stringVal()); lexer.nextToken(); @@ -448,14 +447,14 @@ public class MySqlExprParser extends SQLExprParser { column.setCharsetExpr(charSetCollateExpr); return parseColumnRest(column); } - if (lexer.identifierEquals(FnvConstants.AUTO_INCREMENT)) { + if (lexer.identifierEquals(FnvHash.Constants.AUTO_INCREMENT)) { lexer.nextToken(); column.setAutoIncrement(true); return parseColumnRest(column); } - if (lexer.identifierEquals(FnvConstants.PRECISION) - && column.getDataType().nameHashCode64() ==FnvConstants.DOUBLE) { + if (lexer.identifierEquals(FnvHash.Constants.PRECISION) + && column.getDataType().nameHashCode64() ==FnvHash.Constants.DOUBLE) { lexer.nextToken(); } @@ -463,7 +462,7 @@ public class MySqlExprParser extends SQLExprParser { throw new ParserException("syntax error " + lexer.info()); } - if (lexer.identifierEquals(FnvConstants.STORAGE)) { + if (lexer.identifierEquals(FnvHash.Constants.STORAGE)) { lexer.nextToken(); SQLExpr expr = expr(); column.setStorage(expr); @@ -477,12 +476,12 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.RPAREN); } - if (lexer.identifierEquals(FnvConstants.STORED)) { + if (lexer.identifierEquals(FnvHash.Constants.STORED)) { lexer.nextToken(); column.setSorted(true); } - if (lexer.identifierEquals(FnvConstants.VIRTUAL)) { + if (lexer.identifierEquals(FnvHash.Constants.VIRTUAL)) { lexer.nextToken(); column.setVirtual(true); } @@ -495,12 +494,12 @@ public class MySqlExprParser extends SQLExprParser { protected SQLDataType parseDataTypeRest(SQLDataType dataType) { super.parseDataTypeRest(dataType); - if (lexer.identifierEquals(FnvConstants.UNSIGNED)) { + if (lexer.identifierEquals(FnvHash.Constants.UNSIGNED)) { lexer.nextToken(); dataType.getAttributes().put("UNSIGNED", true); } - if (lexer.identifierEquals(FnvConstants.ZEROFILL)) { + if (lexer.identifierEquals(FnvHash.Constants.ZEROFILL)) { lexer.nextToken(); dataType.getAttributes().put("ZEROFILL", true); } @@ -520,11 +519,11 @@ public class MySqlExprParser extends SQLExprParser { ident = identExpr.getName(); identHash = identExpr.hashCode64(); - if (identHash == FnvConstants.GLOBAL) { + if (identHash == FnvHash.Constants.GLOBAL) { ident = lexer.stringVal(); lexer.nextToken(); var = new SQLVariantRefExpr(ident, true); - } else if (identHash == FnvConstants.SESSION) { + } else if (identHash == FnvHash.Constants.SESSION) { ident = lexer.stringVal(); lexer.nextToken(); var = new SQLVariantRefExpr(ident, false); @@ -533,7 +532,7 @@ public class MySqlExprParser extends SQLExprParser { } } - if (identHash == FnvConstants.NAMES) { + if (identHash == FnvHash.Constants.NAMES) { String charset = lexer.stringVal(); SQLExpr varExpr = null; @@ -552,7 +551,7 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.LITERAL_CHARS); } - if (lexer.identifierEquals(FnvConstants.COLLATE)) { + if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { MySqlCharExpr charsetExpr = new MySqlCharExpr(charset); lexer.nextToken(); @@ -574,7 +573,7 @@ public class MySqlExprParser extends SQLExprParser { item.setTarget(var); return item; - } else if (identHash == FnvConstants.CHARACTER) { + } else if (identHash == FnvHash.Constants.CHARACTER) { var = new SQLIdentifierExpr("CHARACTER SET"); accept(Token.SET); if (lexer.token() == Token.EQ) { @@ -623,7 +622,7 @@ public class MySqlExprParser extends SQLExprParser { MySqlPrimaryKey primaryKey = new MySqlPrimaryKey(); - if (lexer.identifierEquals(FnvConstants.USING)) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); primaryKey.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -667,7 +666,7 @@ public class MySqlExprParser extends SQLExprParser { } //5.5语法 USING BTREE 放在index 名字后 - if (lexer.identifierEquals(FnvConstants.USING)) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); unique.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -692,7 +691,7 @@ public class MySqlExprParser extends SQLExprParser { } accept(Token.RPAREN); - if (lexer.identifierEquals(FnvConstants.USING)) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); unique.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -724,12 +723,12 @@ public class MySqlExprParser extends SQLExprParser { this.names(fk.getReferencedColumns()); accept(Token.RPAREN); - if (lexer.identifierEquals(FnvConstants.MATCH)) { + if (lexer.identifierEquals(FnvHash.Constants.MATCH)) { if (lexer.identifierEquals("FULL")) { fk.setReferenceMatch(Match.FULL); - } else if (lexer.identifierEquals(FnvConstants.PARTIAL)) { + } else if (lexer.identifierEquals(FnvHash.Constants.PARTIAL)) { fk.setReferenceMatch(Match.PARTIAL); - } else if (lexer.identifierEquals(FnvConstants.SIMPLE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.SIMPLE)) { fk.setReferenceMatch(Match.SIMPLE); } } @@ -757,19 +756,19 @@ public class MySqlExprParser extends SQLExprParser { protected Option parseReferenceOption() { Option option; - if (lexer.token() == Token.RESTRICT || lexer.identifierEquals(FnvConstants.RESTRICT)) { + if (lexer.token() == Token.RESTRICT || lexer.identifierEquals(FnvHash.Constants.RESTRICT)) { option = Option.RESTRICT; lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.CASCADE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.CASCADE)) { option = Option.CASCADE; lexer.nextToken(); } else if (lexer.token() == Token.SET) { lexer.nextToken(); accept(Token.NULL); option = Option.SET_NULL; - } else if (lexer.token() == Token.ON || lexer.identifierEquals(FnvConstants.ON)) { + } else if (lexer.token() == Token.ON || lexer.identifierEquals(FnvHash.Constants.ON)) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.ACTION)) { + if (lexer.identifierEquals(FnvHash.Constants.ACTION)) { option = Option.NO_ACTION; lexer.nextToken(); } else { @@ -789,7 +788,7 @@ public class MySqlExprParser extends SQLExprParser { SQLOrderBy orderBy = this.parseOrderBy(); aggregateExpr.putAttribute("ORDER BY", orderBy); } - if (lexer.identifierEquals(FnvConstants.SEPARATOR)) { + if (lexer.identifierEquals(FnvHash.Constants.SEPARATOR)) { lexer.nextToken(); SQLExpr seperator = this.primary(); @@ -830,7 +829,7 @@ public class MySqlExprParser extends SQLExprParser { for (;;) { boolean storage = false; - if (lexer.identifierEquals(FnvConstants.DATA)) { + if (lexer.identifierEquals(FnvHash.Constants.DATA)) { lexer.nextToken(); acceptIdentifier("DIRECTORY"); if (lexer.token() == Token.EQ) { @@ -851,22 +850,22 @@ public class MySqlExprParser extends SQLExprParser { lexer.nextToken(); } partitionDef.setIndexDirectory(this.expr()); - } else if (lexer.identifierEquals(FnvConstants.MAX_ROWS)) { + } else if (lexer.identifierEquals(FnvHash.Constants.MAX_ROWS)) { lexer.nextToken(); if (lexer.token() == Token.EQ) { lexer.nextToken(); } SQLExpr maxRows = this.primary(); partitionDef.setMaxRows(maxRows); - } else if (lexer.identifierEquals(FnvConstants.MIN_ROWS)) { + } else if (lexer.identifierEquals(FnvHash.Constants.MIN_ROWS)) { lexer.nextToken(); if (lexer.token() == Token.EQ) { lexer.nextToken(); } SQLExpr minRows = this.primary(); partitionDef.setMaxRows(minRows); - } else if (lexer.identifierEquals(FnvConstants.ENGINE) || // - (storage = (lexer.token() == Token.STORAGE || lexer.identifierEquals(FnvConstants.STORAGE)))) { + } else if (lexer.identifierEquals(FnvHash.Constants.ENGINE) || // + (storage = (lexer.token() == Token.STORAGE || lexer.identifierEquals(FnvHash.Constants.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 bf212bdf6e..03c28c6080 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.FnvConstants; +import com.alibaba.druid.util.FnvHash; 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(FnvConstants.DISTINCTROW)) { + } else if (lexer.identifierEquals(FnvHash.Constants.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(FnvConstants.HIGH_PRIORITY)) { + if (lexer.identifierEquals(FnvHash.Constants.HIGH_PRIORITY)) { queryBlock.setHignPriority(true); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.STRAIGHT_JOIN)) { + if (lexer.identifierEquals(FnvHash.Constants.STRAIGHT_JOIN)) { queryBlock.setStraightJoin(true); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.SQL_SMALL_RESULT)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL_SMALL_RESULT)) { queryBlock.setSmallResult(true); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.SQL_BIG_RESULT)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL_BIG_RESULT)) { queryBlock.setBigResult(true); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.SQL_BUFFER_RESULT)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL_BUFFER_RESULT)) { queryBlock.setBufferResult(true); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.SQL_CACHE)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL_CACHE)) { queryBlock.setCache(true); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.SQL_NO_CACHE)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL_NO_CACHE)) { queryBlock.setCache(false); lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.SQL_CALC_FOUND_ROWS)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL_CALC_FOUND_ROWS)) { queryBlock.setCalcFoundRows(true); lexer.nextToken(); } @@ -184,10 +184,10 @@ public class MySqlSelectParser extends SQLSelectParser { queryBlock.setForUpdate(true); - if (lexer.identifierEquals(FnvConstants.NO_WAIT) || lexer.identifierEquals(FnvConstants.NOWAIT)) { + if (lexer.identifierEquals(FnvHash.Constants.NO_WAIT) || lexer.identifierEquals(FnvHash.Constants.NOWAIT)) { lexer.nextToken(); queryBlock.setNoWait(true); - } else if (lexer.identifierEquals(FnvConstants.WAIT)) { + } else if (lexer.identifierEquals(FnvHash.Constants.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(FnvConstants.LOW_PRIORITY)) { + if (lexer.identifierEquals(FnvHash.Constants.LOW_PRIORITY)) { lexer.nextToken(); update.setLowPriority(true); } - if (lexer.identifierEquals(FnvConstants.IGNORE)) { + if (lexer.identifierEquals(FnvHash.Constants.IGNORE)) { lexer.nextToken(); update.setIgnore(true); } - if (lexer.identifierEquals(FnvConstants.COMMIT_ON_SUCCESS)) { + if (lexer.identifierEquals(FnvHash.Constants.COMMIT_ON_SUCCESS)) { lexer.nextToken(); update.setCommitOnSuccess(true); } - if (lexer.identifierEquals(FnvConstants.ROLLBACK_ON_FAIL)) { + if (lexer.identifierEquals(FnvHash.Constants.ROLLBACK_ON_FAIL)) { lexer.nextToken(); update.setRollBackOnFail(true); } - if (lexer.identifierEquals(FnvConstants.QUEUE_ON_PK)) { + if (lexer.identifierEquals(FnvHash.Constants.QUEUE_ON_PK)) { lexer.nextToken(); update.setQueryOnPk(true); } - if (lexer.identifierEquals(FnvConstants.TARGET_AFFECT_ROW)) { + if (lexer.identifierEquals(FnvHash.Constants.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(FnvConstants.USING)) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { return tableSource; } @@ -433,14 +433,14 @@ public class MySqlSelectParser extends SQLSelectParser { tableSource.getHints().add(hint); } - if (lexer.identifierEquals(FnvConstants.IGNORE)) { + if (lexer.identifierEquals(FnvHash.Constants.IGNORE)) { lexer.nextToken(); MySqlIgnoreIndexHint hint = new MySqlIgnoreIndexHint(); parseIndexHint(hint); tableSource.getHints().add(hint); } - if (lexer.identifierEquals(FnvConstants.FORCE)) { + if (lexer.identifierEquals(FnvHash.Constants.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 0f13b6e19b..dbfc0f9420 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.FnvConstants; +import com.alibaba.druid.util.FnvHash; 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(FnvConstants.USING)) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); SQLTableSource tableSource = createSQLSelectParser().parseTableSource(); @@ -340,13 +340,13 @@ public class MySqlStatementParser extends SQLStatementParser { } private void parseCreateIndexUsing(SQLCreateIndexStatement stmt) { - if (lexer.identifierEquals(FnvConstants.USING)) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.BTREE)) { + if (lexer.identifierEquals(FnvHash.Constants.BTREE)) { stmt.setUsing("BTREE"); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.HASH)) { + } else if (lexer.identifierEquals(FnvHash.Constants.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(FnvConstants.ERRORS)) { + if (lexer.identifierEquals(FnvHash.Constants.ERRORS)) { lexer.nextToken(); MySqlShowErrorsStatement stmt = new MySqlShowErrorsStatement(); @@ -979,7 +979,7 @@ public class MySqlStatementParser extends SQLStatementParser { } } - if (lexer.identifierEquals(FnvConstants.ERRORS)) { + if (lexer.identifierEquals(FnvHash.Constants.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(FnvConstants.DEFINER)) { + if (lexer.identifierEquals(FnvHash.Constants.DEFINER)) { lexer.nextToken(); accept(Token.EQ); SQLName definer = this.exprParser.name(); @@ -3347,19 +3347,19 @@ public class MySqlStatementParser extends SQLStatementParser { } for (;;) { - if (lexer.identifierEquals(FnvConstants.DETERMINISTIC)) { + if (lexer.identifierEquals(FnvHash.Constants.DETERMINISTIC)) { lexer.nextToken(); stmt.setDeterministic(true); continue; } - if (lexer.identifierEquals(FnvConstants.CONTAINS)) { + if (lexer.identifierEquals(FnvHash.Constants.CONTAINS)) { lexer.nextToken(); acceptIdentifier("SQL"); stmt.setContainsSql(true); continue; } - if (lexer.identifierEquals(FnvConstants.SQL)) { + if (lexer.identifierEquals(FnvHash.Constants.SQL)) { lexer.nextToken(); acceptIdentifier("SECURITY"); SQLName authid = this.exprParser.name(); 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 cd90bec0a0..a006e46b0f 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 @@ -52,7 +52,7 @@ 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.FnvHash; -import com.alibaba.druid.util.FnvConstants; +import com.alibaba.druid.util.FnvHash.Constants; import com.alibaba.druid.util.JdbcConstants; public class OracleExprParser extends SQLExprParser { @@ -140,12 +140,12 @@ public class OracleExprParser extends SQLExprParser { } protected boolean isCharType(long hash) { - return hash == FnvConstants.CHAR - || hash == FnvConstants.NCHAR - || hash == FnvConstants.VARCHAR - || hash == FnvConstants.VARCHAR2 - || hash == FnvConstants.NVARCHAR - || hash == FnvConstants.NVARCHAR2 + return hash == FnvHash.Constants.CHAR + || hash == FnvHash.Constants.NCHAR + || hash == FnvHash.Constants.VARCHAR + || hash == FnvHash.Constants.VARCHAR2 + || hash == FnvHash.Constants.NVARCHAR + || hash == FnvHash.Constants.NVARCHAR2 ; } @@ -201,10 +201,10 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == Token.EXCEPTION) { typeName = "EXCEPTION"; lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.LONG)) { + } else if (lexer.identifierEquals(FnvHash.Constants.LONG)) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.RAW)) { + if (lexer.identifierEquals(FnvHash.Constants.RAW)) { lexer.nextToken(); typeName = "LONG RAW"; } else { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 1e499b0bc1..927811cb5b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -600,11 +600,16 @@ public class OracleSelectParser extends SQLSelectParser { public SQLTableSource parseTableSourcePrimary() { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); + OracleSelectSubqueryTableSource tableSource; if (lexer.token() == Token.SELECT || lexer.token() == Token.WITH) { tableSource = new OracleSelectSubqueryTableSource(select()); } else if (lexer.token() == (Token.LPAREN)) { tableSource = new OracleSelectSubqueryTableSource(select()); + } else if (lexer.token() == Token.IDENTIFIER) { + SQLTableSource identTable = parseTableSource(); + accept(Token.RPAREN); + return identTable; } else { throw new ParserException("TODO :" + lexer.info()); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 719ae7bd51..5b3c4a657d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -26,7 +26,6 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; @@ -62,10 +61,8 @@ import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Mode; -import com.alibaba.druid.stat.TableStat.Relationship; -import com.alibaba.druid.util.FnvConstants; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; -import com.alibaba.druid.util.JdbcUtils; public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor { @@ -90,7 +87,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle TableStat stat = getTableStat(x); if (expr instanceof SQLName) { - if (((SQLName) expr).nameHashCode64() == FnvConstants.DUAL) { + if (((SQLName) expr).nameHashCode64() == FnvHash.Constants.DUAL) { return false; } 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 1b1ff541c8..2ffd4fd141 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,7 +27,8 @@ 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; +import com.alibaba.druid.util.FnvHash; +import com.alibaba.druid.util.FnvHash.Constants; public class OracleToMySqlOutputVisitor extends OracleOutputVisitor { @@ -153,7 +154,7 @@ public class OracleToMySqlOutputVisitor extends OracleOutputVisitor { static boolean isRowNumber(SQLExpr expr) { if (expr instanceof SQLIdentifierExpr) { return ((SQLIdentifierExpr) expr) - .hashCode64() == FnvConstants.ROWNUM; + .hashCode64() == FnvHash.Constants.ROWNUM; } return false; 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 9fa5fcfbeb..45332c5198 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -49,7 +49,7 @@ import com.alibaba.druid.util.StringUtils; */ public class Lexer { - protected int features = 0; //SQLParserFeature.of(SQLParserFeature.EnableSQLBinaryOpExprGroup); + protected int features = 0; //SQLParserFeature.of(SQLParserFeature.EnableSQLBinaryOpExprGroup); protected final String text; protected int pos; protected int mark; @@ -61,41 +61,36 @@ public class Lexer { protected Token token; - protected Keywords keywods = Keywords.DEFAULT_KEYWORDS; + protected Keywords keywods = Keywords.DEFAULT_KEYWORDS; protected String stringVal; protected long hash_lower; // fnv1a_64 - protected long hash; + protected long hash; - protected int commentCount = 0; + protected int commentCount = 0; - protected List comments = new ArrayList(2); + protected List comments = new ArrayList(2); - protected boolean skipComment = true; + protected boolean skipComment = true; - private SavePoint savePoint = null; + private SavePoint savePoint = null; /* * anti sql injection */ private boolean allowComment = true; - + private int varIndex = -1; protected CommentHandler commentHandler; - protected boolean endOfComment = false; - protected boolean keepComments = false; protected int line = 0; - protected int lines = 0; protected String dbType; - protected boolean hasSpecial = false; - private int startPos; private int posLine; private int posColumn; 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 18d1fe64d8..ed08057ddc 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -45,7 +45,7 @@ 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.FnvHash; -import com.alibaba.druid.util.FnvConstants; +import com.alibaba.druid.util.FnvHash.Constants; import com.alibaba.druid.util.JdbcConstants; public class SQLExprParser extends SQLParser { @@ -237,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(FnvConstants.MOD)) { + } else if (lexer.identifierEquals(FnvHash.Constants.MOD)) { lexer.nextToken(); SQLExpr rightExp = primary(); @@ -788,7 +788,7 @@ public class SQLExprParser extends SQLParser { if (token == Token.OF) { if (expr instanceof SQLIdentifierExpr) { long hashCode64 = ((SQLIdentifierExpr) expr).hashCode64(); - if (hashCode64 == FnvConstants.CURRENT) { + if (hashCode64 == FnvHash.Constants.CURRENT) { lexer.nextToken(); SQLName cursorName = this.name(); return new SQLCurrentOfCursorExpr(cursorName); @@ -797,17 +797,17 @@ public class SQLExprParser extends SQLParser { } else if (token == Token.FOR) { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr idenExpr = (SQLIdentifierExpr) expr; - if (idenExpr.hashCode64() == FnvConstants.NEXTVAL) { + if (idenExpr.hashCode64() == FnvHash.Constants.NEXTVAL) { lexer.nextToken(); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.NextVal); return seqExpr; - } else if (idenExpr.hashCode64() == FnvConstants.CURRVAL) { + } else if (idenExpr.hashCode64() == FnvHash.Constants.CURRVAL) { lexer.nextToken(); SQLName seqName = this.name(); SQLSequenceExpr seqExpr = new SQLSequenceExpr(seqName, SQLSequenceExpr.Function.CurrVal); return seqExpr; - } else if (idenExpr.hashCode64() == FnvConstants.PREVVAL) { + } else if (idenExpr.hashCode64() == FnvHash.Constants.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(FnvConstants.SETS) // + } else if (lexer.identifierEquals(FnvHash.Constants.SETS) // && expr.getClass() == SQLIdentifierExpr.class // && "GROUPING".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) { SQLGroupingSetExpr groupingSets = new SQLGroupingSetExpr(); @@ -907,24 +907,24 @@ public class SQLExprParser extends SQLParser { methodName = identifierExpr.getName(); hash_lower = identifierExpr.nameHashCode64(); - if (hash_lower == FnvConstants.TRIM) { - if (lexer.identifierEquals(FnvConstants.LEADING)) { + if (hash_lower == FnvHash.Constants.TRIM) { + if (lexer.identifierEquals(FnvHash.Constants.LEADING)) { trimOption = lexer.stringVal(); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.BOTH)) { + } else if (lexer.identifierEquals(FnvHash.Constants.BOTH)) { trimOption = lexer.stringVal(); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.TRAILING)) { + } else if (lexer.identifierEquals(FnvHash.Constants.TRAILING)) { trimOption = lexer.stringVal(); lexer.nextToken(); } - } else if (hash_lower == FnvConstants.MATCH + } else if (hash_lower == FnvHash.Constants.MATCH && JdbcConstants.MYSQL.equals(dbType)) { return parseMatch(); - } else if (hash_lower == FnvConstants.EXTRACT + } else if (hash_lower == FnvHash.Constants.EXTRACT && JdbcConstants.MYSQL.equals(dbType)) { return parseExtract(); - } else if (hash_lower == FnvConstants.POSITION + } else if (hash_lower == FnvHash.Constants.POSITION && JdbcConstants.MYSQL.equals(dbType)) { return parsePosition(); } @@ -977,7 +977,7 @@ public class SQLExprParser extends SQLParser { } } - if (lexer.token == Token.USING || lexer.identifierEquals(FnvConstants.USING)) { + if (lexer.token == Token.USING || lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); SQLExpr using = this.primary(); methodInvokeExpr.setUsing(using); @@ -1252,7 +1252,7 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token == Token.DISTINCT) { aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DISTINCT); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.DEDUPLICATION)) { // just for nut + } else if (lexer.identifierEquals(FnvHash.Constants.DEDUPLICATION)) { // just for nut aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DEDUPLICATION); lexer.nextToken(); } else { @@ -1300,10 +1300,10 @@ public class SQLExprParser extends SQLParser { } SQLOver.WindowingType windowingType = null; - if (lexer.identifierEquals(FnvConstants.ROWS)) { + if (lexer.identifierEquals(FnvHash.Constants.ROWS)) { windowingType = SQLOver.WindowingType.ROWS; - } else if (lexer.identifierEquals(FnvConstants.RANGE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.RANGE)) { windowingType = SQLOver.WindowingType.RANGE; } @@ -1316,10 +1316,10 @@ public class SQLExprParser extends SQLParser { SQLIntegerExpr rowsBegin = (SQLIntegerExpr) this.primary(); over.setWindowingBetweenBegin(rowsBegin); - if (lexer.identifierEquals(FnvConstants.PRECEDING)) { + if (lexer.identifierEquals(FnvHash.Constants.PRECEDING)) { over.setWindowingBetweenBeginPreceding(true); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.FOLLOWING)) { + } else if (lexer.identifierEquals(FnvHash.Constants.FOLLOWING)) { over.setWindowingBetweenBeginFollowing(true); lexer.nextToken(); } @@ -1329,25 +1329,25 @@ public class SQLExprParser extends SQLParser { SQLIntegerExpr betweenEnd = (SQLIntegerExpr) this.primary(); over.setWindowingBetweenEnd(betweenEnd); - if (lexer.identifierEquals(FnvConstants.PRECEDING)) { + if (lexer.identifierEquals(FnvHash.Constants.PRECEDING)) { over.setWindowingBetweenEndPreceding(true); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.FOLLOWING)) { + } else if (lexer.identifierEquals(FnvHash.Constants.FOLLOWING)) { over.setWindowingBetweenEndFollowing(true); lexer.nextToken(); } } else { - if (lexer.identifierEquals(FnvConstants.CURRENT)) { + if (lexer.identifierEquals(FnvHash.Constants.CURRENT)) { lexer.nextToken(); acceptIdentifier("ROW"); over.setWindowing(new SQLIdentifierExpr("CURRENT ROW")); - } else if (lexer.identifierEquals(FnvConstants.UNBOUNDED)) { + } else if (lexer.identifierEquals(FnvHash.Constants.UNBOUNDED)) { lexer.nextToken(); over.setWindowing(new SQLIdentifierExpr("UNBOUNDED")); - if (lexer.identifierEquals(FnvConstants.PRECEDING)) { + if (lexer.identifierEquals(FnvHash.Constants.PRECEDING)) { over.setWindowingPreceding(true); lexer.nextToken(); } else if (lexer.identifierEquals("FOLLOWING")) { @@ -1358,10 +1358,10 @@ public class SQLExprParser extends SQLParser { SQLIntegerExpr rowsExpr = (SQLIntegerExpr) this.primary(); over.setWindowing(rowsExpr); - if (lexer.identifierEquals(FnvConstants.PRECEDING)) { + if (lexer.identifierEquals(FnvHash.Constants.PRECEDING)) { over.setWindowingPreceding(true); lexer.nextToken(); - } else if (lexer.identifierEquals(FnvConstants.FOLLOWING)) { + } else if (lexer.identifierEquals(FnvHash.Constants.FOLLOWING)) { over.setWindowingFollowing(true); lexer.nextToken(); } @@ -1383,7 +1383,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.SIBLINGS)) { + if (lexer.identifierEquals(FnvHash.Constants.SIBLINGS)) { lexer.nextToken(); orderBy.setSibings(true); } @@ -1423,12 +1423,12 @@ public class SQLExprParser extends SQLParser { item.setType(SQLOrderingSpecification.DESC); } - if (lexer.identifierEquals(FnvConstants.NULLS)) { + if (lexer.identifierEquals(FnvHash.Constants.NULLS)) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.FIRST)) { + if (lexer.identifierEquals(FnvHash.Constants.FIRST)) { lexer.nextToken(); item.setNullsOrderType(SQLSelectOrderByItem.NullsOrderType.NullsFirst); - } else if (lexer.identifierEquals(FnvConstants.LAST)) { + } else if (lexer.identifierEquals(FnvHash.Constants.LAST)) { lexer.nextToken(); item.setNullsOrderType(SQLSelectOrderByItem.NullsOrderType.NullsLast); } else { @@ -1842,7 +1842,7 @@ public class SQLExprParser extends SQLParser { rightExp = primary(); expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Escape, rightExp, getDbType()); } - } else if (lexer.identifierEquals(FnvConstants.RLIKE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.RLIKE)) { lexer.nextToken(); rightExp = equality(); @@ -1900,7 +1900,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(FnvConstants.REGEXP)) { + } else if (lexer.identifierEquals(FnvHash.Constants.REGEXP)) { lexer.nextToken(); rightExp = equality(); @@ -1909,7 +1909,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(FnvConstants.SIMILAR)) { + if (lexer.identifierEquals(FnvHash.Constants.SIMILAR)) { lexer.nextToken(); accept(Token.TO); @@ -2010,7 +2010,7 @@ public class SQLExprParser extends SQLParser { expr = new SQLBetweenExpr(expr, true, beginExpr, endExpr); return expr; - } else if (lexer.identifierEquals(FnvConstants.RLIKE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.RLIKE)) { lexer.nextToken(); SQLExpr rightExp = primary(); @@ -2024,7 +2024,7 @@ public class SQLExprParser extends SQLParser { rightExp = relationalRest(rightExp); return new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotILike, rightExp, getDbType()); - } else if (lexer.identifierEquals(FnvConstants.REGEXP)) { + } else if (lexer.identifierEquals(FnvHash.Constants.REGEXP)) { lexer.nextToken(); SQLExpr rightExp = primary(); @@ -2102,14 +2102,14 @@ public class SQLExprParser extends SQLParser { accept(Token.RPAREN); } - if (lexer.identifierEquals(FnvConstants.PRECISION) - && dataType.nameHashCode64() == FnvConstants.DOUBLE) { + if (lexer.identifierEquals(FnvHash.Constants.PRECISION) + && dataType.nameHashCode64() == FnvHash.Constants.DOUBLE) { lexer.nextToken(); dataType.setName("DOUBLE PRECISION"); } - if (FnvConstants.TIMESTAMP == dataType.nameHashCode64()) { - if (lexer.identifierEquals(FnvConstants.WITHOUT)) { + if (FnvHash.Constants.TIMESTAMP == dataType.nameHashCode64()) { + if (lexer.identifierEquals(FnvHash.Constants.WITHOUT)) { lexer.nextToken(); acceptIdentifier("TIME"); acceptIdentifier("ZONE"); @@ -2132,14 +2132,14 @@ public class SQLExprParser extends SQLParser { 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 + return hash == FnvHash.Constants.CHAR + || hash == FnvHash.Constants.VARCHAR + || hash == FnvHash.Constants.NCHAR + || hash == FnvHash.Constants.NVARCHAR + || hash == FnvHash.Constants.TINYTEXT + || hash == FnvHash.Constants.TEXT + || hash == FnvHash.Constants.MEDIUMTEXT + || hash == FnvHash.Constants.LONGTEXT ; } @@ -2149,7 +2149,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.CHARACTER)) { + if (lexer.identifierEquals(FnvHash.Constants.CHARACTER)) { lexer.nextToken(); accept(Token.SET); @@ -2166,7 +2166,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); } - if (lexer.identifierEquals(FnvConstants.COLLATE)) { + if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { lexer.nextToken(); if (lexer.token != Token.IDENTIFIER) { @@ -2347,16 +2347,16 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token == Token.ENABLE) { lexer.nextToken(); check.setEnable(true); - } else if (lexer.identifierEquals(FnvConstants.VALIDATE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.VALIDATE)) { lexer.nextToken(); check.setValidate(Boolean.TRUE); - } else if (lexer.identifierEquals(FnvConstants.NOVALIDATE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.NOVALIDATE)) { lexer.nextToken(); check.setValidate(Boolean.FALSE); - } else if (lexer.identifierEquals(FnvConstants.RELY)) { + } else if (lexer.identifierEquals(FnvHash.Constants.RELY)) { lexer.nextToken(); check.setRely(Boolean.TRUE); - } else if (lexer.identifierEquals(FnvConstants.NORELY)) { + } else if (lexer.identifierEquals(FnvHash.Constants.NORELY)) { lexer.nextToken(); check.setRely(Boolean.FALSE); } @@ -2389,16 +2389,16 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token == Token.ENABLE) { lexer.nextToken(); unique.setEnable(true); - } else if (lexer.identifierEquals(FnvConstants.VALIDATE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.VALIDATE)) { lexer.nextToken(); unique.setValidate(Boolean.TRUE); - } else if (lexer.identifierEquals(FnvConstants.NOVALIDATE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.NOVALIDATE)) { lexer.nextToken(); unique.setValidate(Boolean.FALSE); - } else if (lexer.identifierEquals(FnvConstants.RELY)) { + } else if (lexer.identifierEquals(FnvHash.Constants.RELY)) { lexer.nextToken(); unique.setRely(Boolean.TRUE); - } else if (lexer.identifierEquals(FnvConstants.NORELY)) { + } else if (lexer.identifierEquals(FnvHash.Constants.NORELY)) { lexer.nextToken(); unique.setRely(Boolean.FALSE); } @@ -2417,7 +2417,7 @@ public class SQLExprParser extends SQLParser { item.setTarget(var); if (lexer.token == Token.COLONEQ) { lexer.nextToken(); - } else if (lexer.token == Token.TRUE || lexer.identifierEquals(FnvConstants.TRUE)) { + } else if (lexer.token == Token.TRUE || lexer.identifierEquals(FnvHash.Constants.TRUE)) { lexer.nextToken(); item.setValue(new SQLBooleanExpr(true)); return item; @@ -2531,7 +2531,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.ON) { lexer.nextToken(); accept(Token.DELETE); - if (lexer.identifierEquals(FnvConstants.CASCADE)) { + if (lexer.identifierEquals(FnvHash.Constants.CASCADE)) { lexer.nextToken(); fk.setOnDeleteCascade(true); } else { @@ -2557,11 +2557,11 @@ public class SQLExprParser extends SQLParser { long hash_lower = lexer.hash_lower(); lexer.nextTokenComma(); - if (hash_lower == FnvConstants.CONNECT_BY_ROOT) { + if (hash_lower == FnvHash.Constants.CONNECT_BY_ROOT) { connectByRoot = true; expr = new SQLIdentifierExpr(lexer.stringVal()); lexer.nextToken(); - } else if (FnvConstants.DATE == hash_lower + } else if (FnvHash.Constants.DATE == hash_lower && lexer.token == Token.LITERAL_CHARS && (JdbcConstants.ORACLE.equals(getDbType()) || JdbcConstants.POSTGRESQL.equals(getDbType()))) { @@ -2594,7 +2594,7 @@ public class SQLExprParser extends SQLParser { return new SQLSelectItem(expr, as, connectByRoot); } - if (token == Token.IDENTIFIER && hash_lower != FnvConstants.CURRENT) { + if (token == Token.IDENTIFIER && hash_lower != FnvHash.Constants.CURRENT) { String as = lexer.stringVal(); lexer.nextTokenComma(); return new SQLSelectItem(expr, as, connectByRoot); @@ -2638,7 +2638,7 @@ public class SQLExprParser extends SQLParser { SQLGroupingSetExpr expr = new SQLGroupingSetExpr(); - if (lexer.token == Token.SET || lexer.identifierEquals(FnvConstants.SET)) { + if (lexer.token == Token.SET || lexer.identifierEquals(FnvHash.Constants.SET)) { lexer.nextToken(); } else { return new SQLIdentifierExpr(tmp); @@ -2668,13 +2668,13 @@ public class SQLExprParser extends SQLParser { accept(Token.LPAREN); this.exprList(values.getItems(), values); accept(Token.RPAREN); - } else if (lexer.identifierEquals(FnvConstants.LESS)) { + } else if (lexer.identifierEquals(FnvHash.Constants.LESS)) { lexer.nextToken(); acceptIdentifier("THAN"); values = new SQLPartitionValue(SQLPartitionValue.Operator.LessThan); - if (lexer.identifierEquals(FnvConstants.MAXVALUE)) { + if (lexer.identifierEquals(FnvHash.Constants.MAXVALUE)) { SQLIdentifierExpr maxValue = new SQLIdentifierExpr(lexer.stringVal()); lexer.nextToken(); maxValue.setParent(values); @@ -2713,7 +2713,7 @@ public class SQLExprParser extends SQLParser { limit.setOffset(temp); lexer.nextToken(); limit.setRowCount(this.expr()); - } else if (lexer.identifierEquals(FnvConstants.OFFSET)) { + } else if (lexer.identifierEquals(FnvHash.Constants.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 95077c7367..40e770f801 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -20,7 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; -import com.alibaba.druid.util.FnvConstants; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.JdbcConstants; public class SQLSelectParser extends SQLParser { @@ -42,7 +42,7 @@ public class SQLSelectParser extends SQLParser { public SQLSelect select() { SQLSelect select = new SQLSelect(); - if (lexer.token() == Token.WITH) { + if (lexer.token == Token.WITH) { SQLWithSubqueryClause with = this.parseWith(); select.setWithSubQuery(with); } @@ -176,13 +176,13 @@ public class SQLSelectParser extends SQLParser { } if (JdbcConstants.INFORMIX.equals(dbType)) { - if (lexer.identifierEquals(FnvConstants.SKIP)) { + if (lexer.identifierEquals(FnvHash.Constants.SKIP)) { lexer.nextToken(); SQLExpr offset = this.exprParser.primary(); queryBlock.setOffset(offset); } - if (lexer.identifierEquals(FnvConstants.FIRST)) { + if (lexer.identifierEquals(FnvHash.Constants.FIRST)) { lexer.nextToken(); SQLExpr first = this.exprParser.primary(); queryBlock.setFirst(first); @@ -219,7 +219,7 @@ public class SQLSelectParser extends SQLParser { SQLWithSubqueryClause withQueryClause = new SQLWithSubqueryClause(); - if (lexer.token == Token.RECURSIVE || lexer.identifierEquals(FnvConstants.RECURSIVE)) { + if (lexer.token == Token.RECURSIVE || lexer.identifierEquals(FnvHash.Constants.RECURSIVE)) { lexer.nextToken(); withQueryClause.setRecursive(true); } @@ -262,7 +262,7 @@ public class SQLSelectParser extends SQLParser { SQLWithSubqueryClause withQueryClause = new SQLWithSubqueryClause(); - if (lexer.token == Token.RECURSIVE || lexer.identifierEquals(FnvConstants.RECURSIVE)) { + if (lexer.token == Token.RECURSIVE || lexer.identifierEquals(FnvHash.Constants.RECURSIVE)) { lexer.nextToken(); withQueryClause.setRecursive(true); } @@ -337,12 +337,12 @@ public class SQLSelectParser extends SQLParser { accept(Token.BY); SQLSelectGroupByClause groupBy = new SQLSelectGroupByClause(); - if (lexer.identifierEquals(FnvConstants.ROLLUP)) { + if (lexer.identifierEquals(FnvHash.Constants.ROLLUP)) { lexer.nextToken(); accept(Token.LPAREN); groupBy.setWithRollUp(true); } - if (lexer.identifierEquals(FnvConstants.CUBE)) { + if (lexer.identifierEquals(FnvHash.Constants.CUBE)) { lexer.nextToken(); accept(Token.LPAREN); groupBy.setWithCube(true); @@ -374,7 +374,7 @@ public class SQLSelectParser extends SQLParser { if (lexer.token == Token.WITH) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.CUBE)) { + if (lexer.identifierEquals(FnvHash.Constants.CUBE)) { lexer.nextToken(); groupBy.setWithCube(true); } else { @@ -524,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(FnvConstants.STRAIGHT_JOIN)) - && (!lexer.identifierEquals(FnvConstants.CROSS)) + && (!lexer.identifierEquals(FnvHash.Constants.STRAIGHT_JOIN)) + && (!lexer.identifierEquals(FnvHash.Constants.CROSS)) && lexer.token != Token.OUTER) { String alias = tableAlias(); if (alias != null) { @@ -537,7 +537,7 @@ public class SQLSelectParser extends SQLParser { SQLJoinTableSource.JoinType joinType = null; - boolean natural = lexer.identifierEquals(FnvConstants.NATURAL) && JdbcConstants.MYSQL.equals(dbType); + boolean natural = lexer.identifierEquals(FnvHash.Constants.NATURAL) && JdbcConstants.MYSQL.equals(dbType); if (natural) { lexer.nextToken(); } @@ -545,10 +545,10 @@ public class SQLSelectParser extends SQLParser { if (lexer.token == Token.LEFT) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.SEMI)) { + if (lexer.identifierEquals(FnvHash.Constants.SEMI)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.LEFT_SEMI_JOIN; - } else if (lexer.identifierEquals(FnvConstants.ANTI)) { + } else if (lexer.identifierEquals(FnvHash.Constants.ANTI)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.LEFT_ANTI_JOIN; } else if (lexer.token == Token.OUTER) { @@ -584,21 +584,21 @@ public class SQLSelectParser extends SQLParser { } else if (lexer.token == Token.COMMA) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.COMMA; - } else if (lexer.identifierEquals(FnvConstants.STRAIGHT_JOIN)) { + } else if (lexer.identifierEquals(FnvHash.Constants.STRAIGHT_JOIN)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.STRAIGHT_JOIN; - } else if (lexer.identifierEquals(FnvConstants.CROSS)) { + } else if (lexer.identifierEquals(FnvHash.Constants.CROSS)) { lexer.nextToken(); if (lexer.token == Token.JOIN) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.CROSS_JOIN; - } else if (lexer.identifierEquals(FnvConstants.APPLY)) { + } else if (lexer.identifierEquals(FnvHash.Constants.APPLY)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.CROSS_APPLY; } } else if (lexer.token == Token.OUTER) { lexer.nextToken(); - if (lexer.identifierEquals(FnvConstants.APPLY)) { + if (lexer.identifierEquals(FnvHash.Constants.APPLY)) { lexer.nextToken(); joinType = SQLJoinTableSource.JoinType.OUTER_APPLY; } @@ -622,7 +622,7 @@ public class SQLSelectParser extends SQLParser { } if (lexer.token == Token.USING - ||lexer.identifierEquals(FnvConstants.USING)) + ||lexer.identifierEquals(FnvHash.Constants.USING)) { Lexer.SavePoint savePoint = lexer.mark(); lexer.nextToken(); @@ -664,7 +664,7 @@ public class SQLSelectParser extends SQLParser { join.setRight(rightTableSource); if (!natural) { - if (tableSource.aliasHashCode64() == FnvConstants.NATURAL && JdbcConstants.MYSQL.equals(dbType)) { + if (tableSource.aliasHashCode64() == FnvHash.Constants.NATURAL && JdbcConstants.MYSQL.equals(dbType)) { tableSource.setAlias(null); natural = true; } @@ -675,7 +675,7 @@ public class SQLSelectParser extends SQLParser { lexer.nextToken(); join.setCondition(expr()); } else if (lexer.token == Token.USING - || lexer.identifierEquals(FnvConstants.USING)) { + || lexer.identifierEquals(FnvHash.Constants.USING)) { Lexer.SavePoint savePoint = lexer.mark(); lexer.nextToken(); if (lexer.token == Token.LPAREN) { @@ -717,11 +717,11 @@ public class SQLSelectParser extends SQLParser { return; } - if (lexer.identifierEquals(FnvConstants.OFFSET) || lexer.token == Token.OFFSET) { + if (lexer.identifierEquals(FnvHash.Constants.OFFSET) || lexer.token == Token.OFFSET) { lexer.nextToken(); SQLExpr offset = this.exprParser.primary(); queryBlock.setOffset(offset); - if (lexer.identifierEquals(FnvConstants.ROW) || lexer.identifierEquals(FnvConstants.ROWS)) { + if (lexer.identifierEquals(FnvHash.Constants.ROW) || lexer.identifierEquals(FnvHash.Constants.ROWS)) { lexer.nextToken(); } } @@ -729,14 +729,14 @@ public class SQLSelectParser extends SQLParser { if (lexer.token == Token.FETCH) { lexer.nextToken(); if (lexer.token == Token.FIRST - || lexer.identifierEquals(FnvConstants.NEXT)) { + || lexer.identifierEquals(FnvHash.Constants.NEXT)) { lexer.nextToken(); } else { acceptIdentifier("FIRST"); } SQLExpr first = this.exprParser.primary(); queryBlock.setFirst(first); - if (lexer.identifierEquals(FnvConstants.ROW) || lexer.identifierEquals(FnvConstants.ROWS)) { + if (lexer.identifierEquals(FnvHash.Constants.ROW) || lexer.identifierEquals(FnvHash.Constants.ROWS)) { lexer.nextToken(); } @@ -749,16 +749,16 @@ public class SQLSelectParser extends SQLParser { } protected void parseHierachical(SQLSelectQueryBlock queryBlock) { - if (lexer.token == Token.CONNECT || lexer.identifierEquals(FnvConstants.CONNECT)) { + if (lexer.token == Token.CONNECT || lexer.identifierEquals(FnvHash.Constants.CONNECT)) { lexer.nextToken(); accept(Token.BY); - if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvConstants.PRIOR)) { + if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvHash.Constants.PRIOR)) { lexer.nextToken(); queryBlock.setPrior(true); } - if (lexer.identifierEquals(FnvConstants.NOCYCLE)) { + if (lexer.identifierEquals(FnvHash.Constants.NOCYCLE)) { queryBlock.setNoCycle(true); lexer.nextToken(); @@ -770,27 +770,27 @@ public class SQLSelectParser extends SQLParser { queryBlock.setConnectBy(this.exprParser.expr()); } - if (lexer.token == Token.START || lexer.identifierEquals(FnvConstants.START)) { + if (lexer.token == Token.START || lexer.identifierEquals(FnvHash.Constants.START)) { lexer.nextToken(); accept(Token.WITH); queryBlock.setStartWith(this.exprParser.expr()); } - if (lexer.token == Token.CONNECT || lexer.identifierEquals(FnvConstants.CONNECT)) { + if (lexer.token == Token.CONNECT || lexer.identifierEquals(FnvHash.Constants.CONNECT)) { lexer.nextToken(); accept(Token.BY); - if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvConstants.PRIOR)) { + if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvHash.Constants.PRIOR)) { lexer.nextToken(); queryBlock.setPrior(true); } - if (lexer.identifierEquals(FnvConstants.NOCYCLE)) { + if (lexer.identifierEquals(FnvHash.Constants.NOCYCLE)) { queryBlock.setNoCycle(true); lexer.nextToken(); - if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvConstants.PRIOR)) { + if (lexer.token == Token.PRIOR || lexer.identifierEquals(FnvHash.Constants.PRIOR)) { lexer.nextToken(); queryBlock.setPrior(true); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 9e37fff984..fa4fb748d4 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -36,9 +36,7 @@ import com.alibaba.druid.util.JdbcUtils; public class SQLStatementParser extends SQLParser { protected SQLExprParser exprParser; - protected boolean parseCompleteValues = true; - protected int parseValuesSize = 3; public SQLStatementParser(String sql){ @@ -306,7 +304,7 @@ public class SQLStatementParser extends SQLParser { break; } - if (lexer.token() == Token.LBRACE || lexer.identifierEquals("CALL")) { + if (lexer.token == Token.LBRACE || lexer.identifierEquals("CALL")) { SQLCallStatement stmt = parseCall(); statementList.add(stmt); continue; @@ -357,11 +355,11 @@ public class SQLStatementParser extends SQLParser { continue; } - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { char markChar = lexer.current(); int markBp = lexer.bp(); lexer.nextToken(); - if (lexer.token() == Token.SELECT) { + if (lexer.token == Token.SELECT) { lexer.reset(markBp, markChar, Token.LPAREN); SQLStatement stmt = parseSelect(); statementList.add(stmt); @@ -381,11 +379,11 @@ public class SQLStatementParser extends SQLParser { continue; } - // throw new ParserException("syntax error, " + lexer.token() + " " + // throw new ParserException("syntax error, " + lexer.token + " " // + lexer.stringVal() + ", pos " // + lexer.pos()); //throw new ParserException("not supported." + lexer.info()); - printError(lexer.token()); + printError(lexer.token); } } @@ -401,39 +399,39 @@ public class SQLStatementParser extends SQLParser { final SQLStatement stmt; List hints = null; - if (lexer.token() == Token.HINT) { + if (lexer.token == Token.HINT) { hints = this.exprParser.parseHints(); } - if (lexer.token() == Token.TABLE || lexer.identifierEquals("TEMPORARY")) { + if (lexer.token == Token.TABLE || lexer.identifierEquals("TEMPORARY")) { SQLDropTableStatement dropTable = parseDropTable(false); if (hints != null) { dropTable.setHints(hints); } stmt = dropTable; - } else if (lexer.token() == Token.USER) { + } else if (lexer.token == Token.USER) { stmt = parseDropUser(); - } else if (lexer.token() == Token.INDEX) { + } else if (lexer.token == Token.INDEX) { stmt = parseDropIndex(); - } else if (lexer.token() == Token.VIEW) { + } else if (lexer.token == Token.VIEW) { stmt = parseDropView(false); - } else if (lexer.token() == Token.TRIGGER) { + } else if (lexer.token == Token.TRIGGER) { stmt = parseDropTrigger(false); - } else if (lexer.token() == Token.DATABASE) { + } else if (lexer.token == Token.DATABASE) { stmt = parseDropDatabase(false); - } else if (lexer.token() == Token.FUNCTION) { + } else if (lexer.token == Token.FUNCTION) { stmt = parseDropFunction(false); - } else if (lexer.token() == Token.TABLESPACE) { + } else if (lexer.token == Token.TABLESPACE) { stmt = parseDropTablespace(false); - } else if (lexer.token() == Token.PROCEDURE) { + } else if (lexer.token == Token.PROCEDURE) { stmt = parseDropProcedure(false); - } else if (lexer.token() == Token.SEQUENCE) { + } else if (lexer.token == Token.SEQUENCE) { stmt = parseDropSequece(false); } else { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } if (beforeComments != null) { @@ -471,13 +469,13 @@ public class SQLStatementParser extends SQLParser { } public SQLStatement parseReturn() { - if (lexer.token() == Token.RETURN + if (lexer.token == Token.RETURN || lexer.identifierEquals("RETURN")) { lexer.nextToken(); } SQLReturnStatement stmt = new SQLReturnStatement(); - if (lexer.token() != Token.SEMI) { + if (lexer.token != Token.SEMI) { SQLExpr expr = this.exprParser.expr(); stmt.setExpr(expr); } @@ -491,7 +489,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseUpsert() { SQLInsertStatement insertStatement = new SQLInsertStatement(); - if (lexer.token() == Token.UPSERT || lexer.identifierEquals("UPSERT")) { + if (lexer.token == Token.UPSERT || lexer.identifierEquals("UPSERT")) { lexer.nextToken(); insertStatement.setUpsert(true); } @@ -509,10 +507,10 @@ public class SQLStatementParser extends SQLParser { SQLRollbackStatement stmt = new SQLRollbackStatement(getDbType()); - if (lexer.token() == Token.TO) { + if (lexer.token == Token.TO) { lexer.nextToken(); - if (lexer.identifierEquals("SAVEPOINT") || lexer.token() == Token.SAVEPOINT) { + if (lexer.identifierEquals("SAVEPOINT") || lexer.token == Token.SAVEPOINT) { lexer.nextToken(); } @@ -542,27 +540,27 @@ public class SQLStatementParser extends SQLParser { parsePrivileages(stmt.getPrivileges(), stmt); - if (lexer.token() == Token.ON) { + if (lexer.token == Token.ON) { lexer.nextToken(); - if (lexer.token() == Token.PROCEDURE) { + if (lexer.token == Token.PROCEDURE) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.PROCEDURE); - } else if (lexer.token() == Token.FUNCTION) { + } else if (lexer.token == Token.FUNCTION) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.FUNCTION); - } else if (lexer.token() == Token.TABLE) { + } else if (lexer.token == Token.TABLE) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.TABLE); - } else if (lexer.token() == Token.USER) { + } else if (lexer.token == Token.USER) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.USER); - } else if (lexer.token() == Token.DATABASE) { + } else if (lexer.token == Token.DATABASE) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.DATABASE); } - if (stmt.getObjectType() != null && lexer.token() == Token.COLONCOLON) { + if (stmt.getObjectType() != null && lexer.token == Token.COLONCOLON) { lexer.nextToken(); // sql server } @@ -574,12 +572,12 @@ public class SQLStatementParser extends SQLParser { } } - if (lexer.token() == Token.TO) { + if (lexer.token == Token.TO) { lexer.nextToken(); stmt.setTo(this.exprParser.expr()); } - if (lexer.token() == Token.WITH) { + if (lexer.token == Token.WITH) { lexer.nextToken(); for (;;) { @@ -617,7 +615,7 @@ public class SQLStatementParser extends SQLParser { stmt.setAdminOption(true); } - if (lexer.token() == Token.IDENTIFIED) { + if (lexer.token == Token.IDENTIFIED) { lexer.nextToken(); accept(Token.BY); @@ -631,9 +629,9 @@ public class SQLStatementParser extends SQLParser { } } - if (lexer.token() == Token.WITH) { + if (lexer.token == Token.WITH) { lexer.nextToken(); - if (lexer.token() == Token.GRANT) { + if (lexer.token == Token.GRANT) { lexer.nextToken(); acceptIdentifier("OPTION"); stmt.setWithGrantOption(true); @@ -646,7 +644,7 @@ public class SQLStatementParser extends SQLParser { protected void parsePrivileages(List privileges, SQLObject parent) { for (;;) { String privilege = null; - if (lexer.token() == Token.ALL) { + if (lexer.token == Token.ALL) { lexer.nextToken(); if (lexer.identifierEquals("PRIVILEGES")) { privilege = "ALL PRIVILEGES"; @@ -654,49 +652,49 @@ public class SQLStatementParser extends SQLParser { } else { privilege = "ALL"; } - } else if (lexer.token() == Token.SELECT) { + } else if (lexer.token == Token.SELECT) { privilege = "SELECT"; lexer.nextToken(); - } else if (lexer.token() == Token.UPDATE) { + } else if (lexer.token == Token.UPDATE) { privilege = "UPDATE"; lexer.nextToken(); - } else if (lexer.token() == Token.DELETE) { + } else if (lexer.token == Token.DELETE) { privilege = "DELETE"; lexer.nextToken(); - } else if (lexer.token() == Token.INSERT) { + } else if (lexer.token == Token.INSERT) { privilege = "INSERT"; lexer.nextToken(); - } else if (lexer.token() == Token.INDEX) { + } else if (lexer.token == Token.INDEX) { lexer.nextToken(); privilege = "INDEX"; - } else if (lexer.token() == Token.TRIGGER) { + } else if (lexer.token == Token.TRIGGER) { lexer.nextToken(); privilege = "TRIGGER"; - } else if (lexer.token() == Token.REFERENCES) { + } else if (lexer.token == Token.REFERENCES) { privilege = "REFERENCES"; lexer.nextToken(); - } else if (lexer.token() == Token.CREATE) { + } else if (lexer.token == Token.CREATE) { lexer.nextToken(); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { privilege = "CREATE TABLE"; lexer.nextToken(); - } else if (lexer.token() == Token.SESSION) { + } else if (lexer.token == Token.SESSION) { privilege = "CREATE SESSION"; lexer.nextToken(); - } else if (lexer.token() == Token.TABLESPACE) { + } else if (lexer.token == Token.TABLESPACE) { privilege = "CREATE TABLESPACE"; lexer.nextToken(); - } else if (lexer.token() == Token.USER) { + } else if (lexer.token == Token.USER) { privilege = "CREATE USER"; lexer.nextToken(); - } else if (lexer.token() == Token.VIEW) { + } else if (lexer.token == Token.VIEW) { privilege = "CREATE VIEW"; lexer.nextToken(); - } else if (lexer.token() == Token.ANY) { + } else if (lexer.token == Token.ANY) { lexer.nextToken(); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { lexer.nextToken(); privilege = "CREATE ANY TABLE"; } else if (lexer.identifierEquals("MATERIALIZED")) { @@ -704,7 +702,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.VIEW); privilege = "CREATE ANY MATERIALIZED VIEW"; } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + throw new ParserException("TODO : " + lexer.token + " " + lexer.stringVal()); } } else if (lexer.identifierEquals("SYNONYM")) { privilege = "CREATE SYNONYM"; @@ -717,20 +715,20 @@ public class SQLStatementParser extends SQLParser { accept(Token.TABLE); privilege = "CREATE TEMPORARY TABLE"; } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + throw new ParserException("TODO : " + lexer.token + " " + lexer.stringVal()); } - } else if (lexer.token() == Token.ALTER) { + } else if (lexer.token == Token.ALTER) { lexer.nextToken(); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { privilege = "ALTER TABLE"; lexer.nextToken(); - } else if (lexer.token() == Token.SESSION) { + } else if (lexer.token == Token.SESSION) { privilege = "ALTER SESSION"; lexer.nextToken(); - } else if (lexer.token() == Token.ANY) { + } else if (lexer.token == Token.ANY) { lexer.nextToken(); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { lexer.nextToken(); privilege = "ALTER ANY TABLE"; } else if (lexer.identifierEquals("MATERIALIZED")) { @@ -738,23 +736,23 @@ public class SQLStatementParser extends SQLParser { accept(Token.VIEW); privilege = "ALTER ANY MATERIALIZED VIEW"; } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + throw new ParserException("TODO : " + lexer.token + " " + lexer.stringVal()); } } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + throw new ParserException("TODO : " + lexer.token + " " + lexer.stringVal()); } - } else if (lexer.token() == Token.DROP) { + } else if (lexer.token == Token.DROP) { lexer.nextToken(); - if (lexer.token() == Token.DROP) { + if (lexer.token == Token.DROP) { privilege = "DROP TABLE"; lexer.nextToken(); - } else if (lexer.token() == Token.SESSION) { + } else if (lexer.token == Token.SESSION) { privilege = "DROP SESSION"; lexer.nextToken(); - } else if (lexer.token() == Token.ANY) { + } else if (lexer.token == Token.ANY) { lexer.nextToken(); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { lexer.nextToken(); privilege = "DROP ANY TABLE"; } else if (lexer.identifierEquals("MATERIALIZED")) { @@ -762,7 +760,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.VIEW); privilege = "DROP ANY MATERIALIZED VIEW"; } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + throw new ParserException("TODO : " + lexer.token + " " + lexer.stringVal()); } } else { privilege = "DROP"; @@ -795,11 +793,11 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.identifierEquals("FILE")) { lexer.nextToken(); privilege = "FILE"; - } else if (lexer.token() == Token.GRANT) { + } else if (lexer.token == Token.GRANT) { lexer.nextToken(); acceptIdentifier("OPTION"); privilege = "GRANT OPTION"; - } else if (lexer.token() == Token.LOCK) { + } else if (lexer.token == Token.LOCK) { lexer.nextToken(); acceptIdentifier("TABLES"); privilege = "LOCK TABLES"; @@ -818,10 +816,10 @@ public class SQLStatementParser extends SQLParser { acceptIdentifier("CLIENT"); privilege = "REPLICATION CLIENT"; } - } else if (lexer.token() == Token.SHOW) { + } else if (lexer.token == Token.SHOW) { lexer.nextToken(); - if (lexer.token() == Token.VIEW) { + if (lexer.token == Token.VIEW) { lexer.nextToken(); privilege = "SHOW VIEW"; } else { @@ -846,7 +844,7 @@ public class SQLStatementParser extends SQLParser { if (privilege != null) { SQLExpr expr = new SQLIdentifierExpr(privilege); - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { expr = this.exprParser.primaryRest(expr); } @@ -854,7 +852,7 @@ public class SQLStatementParser extends SQLParser { privileges.add(expr); } - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -869,19 +867,19 @@ public class SQLStatementParser extends SQLParser { parsePrivileages(stmt.getPrivileges(), stmt); - if (lexer.token() == Token.ON) { + if (lexer.token == Token.ON) { lexer.nextToken(); - if (lexer.token() == Token.PROCEDURE) { + if (lexer.token == Token.PROCEDURE) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.PROCEDURE); - } else if (lexer.token() == Token.FUNCTION) { + } else if (lexer.token == Token.FUNCTION) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.FUNCTION); - } else if (lexer.token() == Token.TABLE) { + } else if (lexer.token == Token.TABLE) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.TABLE); - } else if (lexer.token() == Token.USER) { + } else if (lexer.token == Token.USER) { lexer.nextToken(); stmt.setObjectType(SQLObjectType.USER); } @@ -894,7 +892,7 @@ public class SQLStatementParser extends SQLParser { } } - if (lexer.token() == Token.FROM) { + if (lexer.token == Token.FROM) { lexer.nextToken(); stmt.setFrom(this.exprParser.expr()); } @@ -920,51 +918,51 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseAlter() { accept(Token.ALTER); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { lexer.nextToken(); SQLAlterTableStatement stmt = new SQLAlterTableStatement(getDbType()); stmt.setName(this.exprParser.name()); for (;;) { - if (lexer.token() == Token.DROP) { + if (lexer.token == Token.DROP) { parseAlterDrop(stmt); } else if (lexer.identifierEquals("ADD")) { lexer.nextToken(); boolean ifNotExists = false; - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.NOT); accept(Token.EXISTS); ifNotExists = true; } - if (lexer.token() == Token.PRIMARY) { + if (lexer.token == Token.PRIMARY) { SQLPrimaryKey primaryKey = this.exprParser.parsePrimaryKey(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); stmt.addItem(item); - } else if (lexer.token() == Token.IDENTIFIER) { + } else if (lexer.token == Token.IDENTIFIER) { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); stmt.addItem(item); - } else if (lexer.token() == Token.COLUMN) { + } else if (lexer.token == Token.COLUMN) { lexer.nextToken(); SQLAlterTableAddColumn item = parseAlterTableAddColumn(); stmt.addItem(item); - } else if (lexer.token() == Token.CHECK) { + } else if (lexer.token == Token.CHECK) { SQLCheck check = this.exprParser.parseCheck(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(check); stmt.addItem(item); - } else if (lexer.token() == Token.CONSTRAINT) { + } else if (lexer.token == Token.CONSTRAINT) { SQLConstraint constraint = this.exprParser.parseConstaint(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); stmt.addItem(item); - } else if (lexer.token() == Token.FOREIGN) { + } else if (lexer.token == Token.FOREIGN) { SQLConstraint constraint = this.exprParser.parseForeignKey(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); stmt.addItem(item); - } else if (lexer.token() == Token.PARTITION) { + } else if (lexer.token == Token.PARTITION) { lexer.nextToken(); SQLAlterTableAddPartition addPartition = new SQLAlterTableAddPartition(); @@ -980,10 +978,10 @@ public class SQLStatementParser extends SQLParser { } else { throw new ParserException("TODO " + lexer.info()); } - } else if (lexer.token() == Token.DISABLE) { + } else if (lexer.token == Token.DISABLE) { lexer.nextToken(); - if (lexer.token() == Token.CONSTRAINT) { + if (lexer.token == Token.CONSTRAINT) { lexer.nextToken(); SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); item.setConstraintName(this.exprParser.name()); @@ -997,9 +995,9 @@ public class SQLStatementParser extends SQLParser { SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys(); stmt.addItem(item); } - } else if (lexer.token() == Token.ENABLE) { + } else if (lexer.token == Token.ENABLE) { lexer.nextToken(); - if (lexer.token() == Token.CONSTRAINT) { + if (lexer.token == Token.CONSTRAINT) { lexer.nextToken(); SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); item.setConstraintName(this.exprParser.name()); @@ -1013,12 +1011,12 @@ public class SQLStatementParser extends SQLParser { SQLAlterTableEnableKeys item = new SQLAlterTableEnableKeys(); stmt.addItem(item); } - } else if (lexer.token() == Token.ALTER) { + } else if (lexer.token == Token.ALTER) { lexer.nextToken(); - if (lexer.token() == Token.COLUMN) { + if (lexer.token == Token.COLUMN) { SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); stmt.addItem(alterColumn); - } else if (lexer.token() == Token.LITERAL_ALIAS) { + } else if (lexer.token == Token.LITERAL_ALIAS) { SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); stmt.addItem(alterColumn); } else { @@ -1039,11 +1037,11 @@ public class SQLStatementParser extends SQLParser { renameColumn.setTo(toName); stmt.addItem(renameColumn); - } else if (lexer.token() == Token.COMMENT) { + } else if (lexer.token == Token.COMMENT) { lexer.nextToken(); SQLExpr comment; - if (lexer.token() == Token.LITERAL_ALIAS) { + if (lexer.token == Token.LITERAL_ALIAS) { String alias = lexer.stringVal(); if (alias.length() > 2 && alias.charAt(0) == '"' && alias.charAt(alias.length() - 1) == '"') { alias = alias.substring(1, alias.length() - 1); @@ -1072,7 +1070,7 @@ public class SQLStatementParser extends SQLParser { alterColumn.setOriginColumn(columnName); stmt.addItem(alterColumn); } - } else if (lexer.token() == Token.WITH) { + } else if (lexer.token == Token.WITH) { lexer.nextToken(); acceptIdentifier("NOCHECK"); acceptIdentifier("ADD"); @@ -1084,10 +1082,10 @@ public class SQLStatementParser extends SQLParser { stmt.addItem(addCheck); } else if (lexer.identifierEquals("RENAME")) { stmt.addItem(parseAlterTableRename()); - } else if (lexer.token() == Token.SET) { + } else if (lexer.token == Token.SET) { lexer.nextToken(); - if (lexer.token() == Token.COMMENT) { + if (lexer.token == Token.COMMENT) { lexer.nextToken(); SQLAlterTableSetComment setComment = new SQLAlterTableSetComment(); setComment.setComment(this.exprParser.primary()); @@ -1100,7 +1098,7 @@ public class SQLStatementParser extends SQLParser { } else { throw new ParserException("TODO " + lexer.info()); } - } else if (lexer.token() == Token.PARTITION) { + } else if (lexer.token == Token.PARTITION) { lexer.nextToken(); SQLAlterTableRenamePartition renamePartition = new SQLAlterTableRenamePartition(); @@ -1111,7 +1109,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.RPAREN); - if (lexer.token() == Token.ENABLE) { + if (lexer.token == Token.ENABLE) { lexer.nextToken(); if (lexer.identifierEquals("LIFECYCLE")) { lexer.nextToken(); @@ -1127,7 +1125,7 @@ public class SQLStatementParser extends SQLParser { continue; } - if (lexer.token() == Token.DISABLE) { + if (lexer.token == Token.DISABLE) { lexer.nextToken(); if (lexer.identifierEquals("LIFECYCLE")) { lexer.nextToken(); @@ -1158,7 +1156,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableTouch item = new SQLAlterTableTouch(); - if (lexer.token() == Token.PARTITION) { + if (lexer.token == Token.PARTITION) { lexer.nextToken(); accept(Token.LPAREN); @@ -1177,7 +1175,7 @@ public class SQLStatementParser extends SQLParser { } return stmt; - } else if (lexer.token() == Token.VIEW) { + } else if (lexer.token == Token.VIEW) { lexer.nextToken(); SQLName viewName = this.exprParser.name(); @@ -1202,7 +1200,7 @@ public class SQLStatementParser extends SQLParser { protected SQLAlterTableItem parseAlterTableRename() { acceptIdentifier("RENAME"); - if (lexer.token() == Token.COLUMN) { + if (lexer.token == Token.COLUMN) { lexer.nextToken(); SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn(); renameColumn.setColumn(this.exprParser.name()); @@ -1211,7 +1209,7 @@ public class SQLStatementParser extends SQLParser { return renameColumn; } - if (lexer.token() == Token.TO) { + if (lexer.token == Token.TO) { lexer.nextToken(); SQLAlterTableRename item = new SQLAlterTableRename(); item.setTo(this.exprParser.name()); @@ -1235,19 +1233,19 @@ public class SQLStatementParser extends SQLParser { boolean ifExists = false; - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); ifExists = true; } - if (lexer.token() == Token.CONSTRAINT) { + if (lexer.token == Token.CONSTRAINT) { lexer.nextToken(); SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); item.setConstraintName(this.exprParser.name()); stmt.addItem(item); - } else if (lexer.token() == Token.COLUMN) { + } else if (lexer.token == Token.COLUMN) { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); @@ -1258,7 +1256,7 @@ public class SQLStatementParser extends SQLParser { } stmt.addItem(item); - } else if (lexer.token() == Token.LITERAL_ALIAS) { + } else if (lexer.token == Token.LITERAL_ALIAS) { SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); @@ -1268,11 +1266,11 @@ public class SQLStatementParser extends SQLParser { } stmt.addItem(item); - } else if (lexer.token() == Token.PARTITION) { + } else if (lexer.token == Token.PARTITION) { SQLAlterTableDropPartition dropPartition = parseAlterTableDropPartition(ifExists); stmt.addItem(dropPartition); - } else if (lexer.token() == Token.INDEX) { + } else if (lexer.token == Token.INDEX) { lexer.nextToken(); SQLName indexName = this.exprParser.name(); SQLAlterTableDropIndex item = new SQLAlterTableDropIndex(); @@ -1289,7 +1287,7 @@ public class SQLStatementParser extends SQLParser { dropPartition.setIfExists(ifExists); - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { accept(Token.LPAREN); parseAssignItems(dropPartition.getPartitions(), dropPartition); @@ -1327,7 +1325,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.TABLE); - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); @@ -1336,7 +1334,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLName name = this.exprParser.name(); stmt.addPartition(new SQLExprTableSource(name)); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -1361,7 +1359,7 @@ public class SQLStatementParser extends SQLParser { continue; } - if (lexer.token() == Token.PURGE || lexer.identifierEquals("PURGE")) { + if (lexer.token == Token.PURGE || lexer.identifierEquals("PURGE")) { lexer.nextToken(); stmt.setPurge(true); continue; @@ -1410,7 +1408,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.VIEW); - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); @@ -1419,7 +1417,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLName name = this.exprParser.name(); stmt.addPartition(new SQLExprTableSource(name)); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -1451,7 +1449,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.DATABASE); - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); @@ -1472,7 +1470,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.FUNCTION); - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); @@ -1497,7 +1495,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.TABLESPACE); - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); @@ -1518,7 +1516,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.PROCEDURE); - if (lexer.token() == Token.IF) { + if (lexer.token == Token.IF) { lexer.nextToken(); accept(Token.EXISTS); stmt.setIfExists(true); @@ -1532,12 +1530,12 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseTruncate() { accept(Token.TRUNCATE); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { lexer.nextToken(); } SQLTruncateStatement stmt = new SQLTruncateStatement(getDbType()); - if (lexer.token() == Token.ONLY) { + if (lexer.token == Token.ONLY) { lexer.nextToken(); stmt.setOnly(true); } @@ -1546,7 +1544,7 @@ public class SQLStatementParser extends SQLParser { SQLName name = this.exprParser.name(); stmt.addTableSource(name); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -1555,7 +1553,7 @@ public class SQLStatementParser extends SQLParser { } for (;;) { - if (lexer.token() == Token.PURGE) { + if (lexer.token == Token.PURGE) { lexer.nextToken(); if (lexer.identifierEquals("SNAPSHOT")) { @@ -1563,34 +1561,34 @@ public class SQLStatementParser extends SQLParser { acceptIdentifier("LOG"); stmt.setPurgeSnapshotLog(true); } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + throw new ParserException("TODO : " + lexer.token + " " + lexer.stringVal()); } continue; } - if (lexer.token() == Token.RESTART) { + if (lexer.token == Token.RESTART) { lexer.nextToken(); accept(Token.IDENTITY); stmt.setRestartIdentity(Boolean.TRUE); continue; - } else if (lexer.token() == Token.SHARE) { + } else if (lexer.token == Token.SHARE) { lexer.nextToken(); accept(Token.IDENTITY); stmt.setRestartIdentity(Boolean.FALSE); continue; } - if (lexer.token() == Token.CASCADE) { + if (lexer.token == Token.CASCADE) { lexer.nextToken(); stmt.setCascade(Boolean.TRUE); continue; - } else if (lexer.token() == Token.RESTRICT) { + } else if (lexer.token == Token.RESTRICT) { lexer.nextToken(); stmt.setCascade(Boolean.FALSE); continue; } - if (lexer.token() == Token.DROP) { + if (lexer.token == Token.DROP) { lexer.nextToken(); acceptIdentifier("STORAGE"); stmt.setDropStorage(true); @@ -1621,7 +1619,7 @@ public class SQLStatementParser extends SQLParser { continue; } - if (lexer.token() == Token.CONTINUE) { + if (lexer.token == Token.CONTINUE) { lexer.nextToken(); accept(Token.IDENTITY); continue; @@ -1642,7 +1640,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseInsert() { SQLInsertStatement stmt = new SQLInsertStatement(); - if (lexer.token() == Token.INSERT) { + if (lexer.token == Token.INSERT) { accept(Token.INSERT); } @@ -1659,31 +1657,31 @@ public class SQLStatementParser extends SQLParser { } protected void parseInsert0(SQLInsertInto insertStatement, boolean acceptSubQuery) { - if (lexer.token() == Token.INTO) { + if (lexer.token == Token.INTO) { lexer.nextToken(); SQLName tableName = this.exprParser.name(); insertStatement.setTableName(tableName); - if (lexer.token() == Token.LITERAL_ALIAS) { + if (lexer.token == Token.LITERAL_ALIAS) { insertStatement.setAlias(tableAlias()); } parseInsert0_hinits(insertStatement); - if (lexer.token() == Token.IDENTIFIER) { + if (lexer.token == Token.IDENTIFIER) { insertStatement.setAlias(lexer.stringVal()); lexer.nextToken(); } } - if (lexer.token() == (Token.LPAREN)) { + if (lexer.token == (Token.LPAREN)) { lexer.nextToken(); parseInsertColumns(insertStatement); accept(Token.RPAREN); } - if (lexer.token() == Token.VALUES) { + if (lexer.token == Token.VALUES) { lexer.nextToken(); for (;;) { accept(Token.LPAREN); @@ -1692,14 +1690,14 @@ public class SQLStatementParser extends SQLParser { insertStatement.addValueCause(values); accept(Token.RPAREN); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } else { break; } } - } else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) { + } else if (acceptSubQuery && (lexer.token == Token.SELECT || lexer.token == Token.LPAREN)) { SQLSelect select = this.createSQLSelectParser().select(); insertStatement.setQuery(select); } @@ -1720,7 +1718,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLExpr expr = this.exprParser.expr(); stmt.addUser(expr); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -1735,7 +1733,7 @@ public class SQLStatementParser extends SQLParser { SQLDropIndexStatement stmt = new SQLDropIndexStatement(getDbType()); stmt.setIndexName(this.exprParser.name()); - if (lexer.token() == Token.ON) { + if (lexer.token == Token.ON) { lexer.nextToken(); stmt.setTableName(this.exprParser.name()); } @@ -1745,14 +1743,14 @@ public class SQLStatementParser extends SQLParser { public SQLCallStatement parseCall() { boolean brace = false; - if (lexer.token() == Token.LBRACE) { + if (lexer.token == Token.LBRACE) { lexer.nextToken(); brace = true; } SQLCallStatement stmt = new SQLCallStatement(getDbType()); - if (lexer.token() == Token.QUES) { + if (lexer.token == Token.QUES) { lexer.nextToken(); accept(Token.EQ); stmt.setOutParameter(new SQLVariantRefExpr("?")); @@ -1762,7 +1760,7 @@ public class SQLStatementParser extends SQLParser { stmt.setProcedureName(exprParser.name()); - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { lexer.nextToken(); exprParser.exprList(stmt.getParameters(), stmt); accept(Token.RPAREN); @@ -1791,7 +1789,7 @@ public class SQLStatementParser extends SQLParser { item.setParent(parent); items.add(item); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } else { @@ -1815,7 +1813,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.CREATE); - Token token = lexer.token(); + Token token = lexer.token; if (token == Token.TABLE || lexer.identifierEquals("GLOBAL")) { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); @@ -1831,7 +1829,7 @@ public class SQLStatementParser extends SQLParser { || lexer.identifierEquals("NONCLUSTERED") // sql server ) { return parseCreateIndex(false); - } else if (lexer.token() == Token.SEQUENCE) { + } else if (lexer.token == Token.SEQUENCE) { return parseCreateSequence(false); } else if (token == Token.OR) { lexer.nextToken(); @@ -1840,17 +1838,17 @@ public class SQLStatementParser extends SQLParser { if (lexer.identifierEquals("FORCE")) { lexer.nextToken(); } - if (lexer.token() == Token.PROCEDURE) { + if (lexer.token == Token.PROCEDURE) { lexer.reset(markBp, markChar, Token.CREATE); return parseCreateProcedure(); } - if (lexer.token() == Token.VIEW) { + if (lexer.token == Token.VIEW) { lexer.reset(markBp, markChar, Token.CREATE); return parseCreateView(); } - if (lexer.token() == Token.TRIGGER) { + if (lexer.token == Token.TRIGGER) { lexer.reset(markBp, markChar, Token.CREATE); return parseCreateTrigger(); } @@ -1907,11 +1905,11 @@ public class SQLStatementParser extends SQLParser { return parseCreateMaterializedView(); } - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLCreateFunctionStatement parseCreateFunction() { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLStatement parseCreateMaterializedView() { @@ -1940,9 +1938,9 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.identifierEquals("FORCE")) { lexer.nextToken(); stmt.setRefreshForce(true); - } else if (lexer.token() == Token.ON) { + } else if (lexer.token == Token.ON) { lexer.nextToken(); - if (lexer.token() == Token.COMMIT) { + if (lexer.token == Token.COMMIT) { lexer.nextToken(); stmt.setRefreshOnCommit(true); } else { @@ -1956,7 +1954,7 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.identifierEquals("BUILD")) { lexer.nextToken(); - if (lexer.identifierEquals("IMMEDIATE") || lexer.token() == Token.IMMEDIATE) { + if (lexer.identifierEquals("IMMEDIATE") || lexer.token == Token.IMMEDIATE) { lexer.nextToken(); stmt.setBuildImmediate(true); } else { @@ -1966,7 +1964,7 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.identifierEquals("PARALLEL")) { lexer.nextToken(); stmt.setParallel(true); - if (lexer.token() == Token.LITERAL_INT) { + if (lexer.token == Token.LITERAL_INT) { stmt.setParallelValue(lexer.integerValue().intValue()); lexer.nextToken(); } @@ -1975,7 +1973,7 @@ public class SQLStatementParser extends SQLParser { } } - if (lexer.token() == Token.ENABLE) { + if (lexer.token == Token.ENABLE) { lexer.nextToken(); acceptIdentifier("QUERY"); acceptIdentifier("REWRITE"); @@ -1990,11 +1988,11 @@ public class SQLStatementParser extends SQLParser { } public SQLStatement parseCreateDbLink() { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLStatement parseCreateSynonym() { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLStatement parseCreateTrigger() { @@ -2002,7 +2000,7 @@ public class SQLStatementParser extends SQLParser { SQLCreateTriggerStatement stmt = new SQLCreateTriggerStatement(getDbType()); - if (lexer.token() == Token.OR) { + if (lexer.token == Token.OR) { lexer.nextToken(); accept(Token.REPLACE); @@ -2027,19 +2025,19 @@ public class SQLStatementParser extends SQLParser { } for (;;) { - if (lexer.token() == Token.INSERT) { + if (lexer.token == Token.INSERT) { lexer.nextToken(); stmt.getTriggerEvents().add(TriggerEvent.INSERT); continue; } - if (lexer.token() == Token.UPDATE) { + if (lexer.token == Token.UPDATE) { lexer.nextToken(); stmt.getTriggerEvents().add(TriggerEvent.UPDATE); continue; } - if (lexer.token() == Token.DELETE) { + if (lexer.token == Token.DELETE) { lexer.nextToken(); stmt.getTriggerEvents().add(TriggerEvent.DELETE); continue; @@ -2050,7 +2048,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.ON); stmt.setOn(this.exprParser.name()); - if (lexer.token() == Token.FOR) { + if (lexer.token == Token.FOR) { lexer.nextToken(); acceptIdentifier("EACH"); accept(Token.ROW); @@ -2066,11 +2064,11 @@ public class SQLStatementParser extends SQLParser { } public SQLStatement parseBlock() { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLStatement parseCreateDatabase() { - if (lexer.token() == Token.CREATE) { + if (lexer.token == Token.CREATE) { lexer.nextToken(); } @@ -2082,11 +2080,11 @@ public class SQLStatementParser extends SQLParser { } public SQLCreateProcedureStatement parseCreateProcedure() { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLStatement parseCreateSequence(boolean acceptCreate) { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token); } public SQLStatement parseCreateIndex(boolean acceptCreate) { @@ -2095,7 +2093,7 @@ public class SQLStatementParser extends SQLParser { } SQLCreateIndexStatement stmt = new SQLCreateIndexStatement(getDbType()); - if (lexer.token() == Token.UNIQUE) { + if (lexer.token == Token.UNIQUE) { lexer.nextToken(); if (lexer.identifierEquals("CLUSTERED")) { lexer.nextToken(); @@ -2125,7 +2123,7 @@ public class SQLStatementParser extends SQLParser { SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); item.setParent(stmt); stmt.addItem(item); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -2153,7 +2151,7 @@ public class SQLStatementParser extends SQLParser { public SQLUpdateStatement parseUpdateStatement() { SQLUpdateStatement udpateStatement = createUpdateStatement(); - if (lexer.token() == Token.UPDATE) { + if (lexer.token == Token.UPDATE) { lexer.nextToken(); SQLTableSource tableSource = this.exprParser.createSelectParser().parseTableSource(); @@ -2162,7 +2160,7 @@ public class SQLStatementParser extends SQLParser { parseUpdateSet(udpateStatement); - if (lexer.token() == (Token.WHERE)) { + if (lexer.token == (Token.WHERE)) { lexer.nextToken(); udpateStatement.setWhere(this.exprParser.expr()); } @@ -2177,7 +2175,7 @@ public class SQLStatementParser extends SQLParser { SQLUpdateSetItem item = this.exprParser.parseUpdateSetItem(); update.addItem(item); - if (lexer.token() != Token.COMMA) { + if (lexer.token != Token.COMMA) { break; } @@ -2192,13 +2190,13 @@ public class SQLStatementParser extends SQLParser { public SQLDeleteStatement parseDeleteStatement() { SQLDeleteStatement deleteStatement = new SQLDeleteStatement(getDbType()); - if (lexer.token() == Token.DELETE) { + if (lexer.token == Token.DELETE) { lexer.nextToken(); - if (lexer.token() == (Token.FROM)) { + if (lexer.token == (Token.FROM)) { lexer.nextToken(); } - if (lexer.token() == Token.COMMENT) { + if (lexer.token == Token.COMMENT) { lexer.nextToken(); } @@ -2206,14 +2204,14 @@ public class SQLStatementParser extends SQLParser { deleteStatement.setTableName(tableName); - if (lexer.token() == Token.FROM) { + if (lexer.token == Token.FROM) { lexer.nextToken(); SQLTableSource tableSource = createSQLSelectParser().parseTableSource(); deleteStatement.setFrom(tableSource); } } - if (lexer.token() == (Token.WHERE)) { + if (lexer.token == (Token.WHERE)) { lexer.nextToken(); SQLExpr where = this.exprParser.expr(); deleteStatement.setWhere(where); @@ -2231,11 +2229,11 @@ public class SQLStatementParser extends SQLParser { public SQLCreateViewStatement parseCreateView() { SQLCreateViewStatement createView = new SQLCreateViewStatement(getDbType()); - if (lexer.token() == Token.CREATE) { + if (lexer.token == Token.CREATE) { lexer.nextToken(); } - if (lexer.token() == Token.OR) { + if (lexer.token == Token.OR) { lexer.nextToken(); accept(Token.REPLACE); createView.setOrReplace(true); @@ -2272,7 +2270,7 @@ public class SQLStatementParser extends SQLParser { this.accept(Token.VIEW); - if (lexer.token() == Token.IF || lexer.identifierEquals("IF")) { + if (lexer.token == Token.IF || lexer.identifierEquals("IF")) { lexer.nextToken(); accept(Token.NOT); accept(Token.EXISTS); @@ -2281,12 +2279,12 @@ public class SQLStatementParser extends SQLParser { createView.setName(exprParser.name()); - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { lexer.nextToken(); for (;;) { - if (lexer.token() == Token.CONSTRAINT) { + if (lexer.token == Token.CONSTRAINT) { SQLTableConstraint constraint = (SQLTableConstraint) this.exprParser.parseConstaint(); createView.addColumn(constraint); } else { @@ -2297,11 +2295,11 @@ public class SQLStatementParser extends SQLParser { this.exprParser.parseColumnRest(column); - if (lexer.token() == Token.COMMENT) { + if (lexer.token == Token.COMMENT) { lexer.nextToken(); SQLExpr comment; - if (lexer.token() == Token.LITERAL_ALIAS) { + if (lexer.token == Token.LITERAL_ALIAS) { String alias = lexer.stringVal(); if (alias.length() > 2 && alias.charAt(0) == '"' && alias.charAt(alias.length() - 1) == '"') { alias = alias.substring(1, alias.length() - 1); @@ -2318,7 +2316,7 @@ public class SQLStatementParser extends SQLParser { createView.addColumn(column); } - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); } else { break; @@ -2328,7 +2326,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.RPAREN); } - if (lexer.token() == Token.COMMENT) { + if (lexer.token == Token.COMMENT) { lexer.nextToken(); SQLCharExpr comment = (SQLCharExpr) exprParser.primary(); createView.setComment(comment); @@ -2339,7 +2337,7 @@ public class SQLStatementParser extends SQLParser { SQLSelectParser selectParser = this.createSQLSelectParser(); createView.setSubQuery(selectParser.select()); - if (lexer.token() == Token.WITH) { + if (lexer.token == Token.WITH) { lexer.nextToken(); if (lexer.identifierEquals("CASCADED")) { @@ -2354,7 +2352,7 @@ public class SQLStatementParser extends SQLParser { createView.setWithReadOnly(true); } - if (lexer.token() == Token.CHECK) { + if (lexer.token == Token.CHECK) { lexer.nextToken(); createView.setWithCheckOption(true); } @@ -2369,10 +2367,10 @@ public class SQLStatementParser extends SQLParser { accept(Token.ON); - if (lexer.token() == Token.TABLE) { + if (lexer.token == Token.TABLE) { stmt.setType(SQLCommentStatement.Type.TABLE); lexer.nextToken(); - } else if (lexer.token() == Token.COLUMN) { + } else if (lexer.token == Token.COLUMN) { stmt.setType(SQLCommentStatement.Type.COLUMN); lexer.nextToken(); } @@ -2398,7 +2396,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLColumnDefinition columnDef = this.exprParser.parseColumn(); item.addColumn(columnDef); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); if (lexer.identifierEquals("ADD")) { break; @@ -2427,8 +2425,8 @@ public class SQLStatementParser extends SQLParser { List list = new ArrayList(); this.parseStatementList(list, 1); if (tryBest) { - if (lexer.token() != Token.EOF) { - throw new ParserException("sql syntax error, no terminated. " + lexer.token()); + if (lexer.token != Token.EOF) { + throw new ParserException("sql syntax error, no terminated. " + lexer.token); } } return list.get(0); @@ -2440,7 +2438,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); } - if (lexer.token() == Token.FOR) { + if (lexer.token == Token.FOR) { lexer.nextToken(); } @@ -2472,25 +2470,25 @@ public class SQLStatementParser extends SQLParser { item.setType("FULLTEXT"); } - if (lexer.token() == Token.UNIQUE) { + if (lexer.token == Token.UNIQUE) { item.setUnique(true); lexer.nextToken(); - if (lexer.token() == Token.INDEX) { + if (lexer.token == Token.INDEX) { lexer.nextToken(); - } else if (lexer.token() == Token.KEY) { + } else if (lexer.token == Token.KEY) { item.setKey(true); lexer.nextToken(); } } else { - if (lexer.token() == Token.INDEX) { + if (lexer.token == Token.INDEX) { accept(Token.INDEX); - } else if (lexer.token() == Token.KEY) { + } else if (lexer.token == Token.KEY) { item.setKey(true); accept(Token.KEY); } } - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { lexer.nextToken(); } else { item.setName(this.exprParser.name()); @@ -2510,7 +2508,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); item.addItem(column); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -2530,9 +2528,9 @@ public class SQLStatementParser extends SQLParser { accept(Token.OPEN); stmt.setCursorName(exprParser.name().getSimpleName()); - if (lexer.token() == Token.FOR) { + if (lexer.token == Token.FOR) { lexer.nextToken(); - if (lexer.token() == Token.SELECT) { + if (lexer.token == Token.SELECT) { SQLSelectParser selectParser = createSQLSelectParser(); SQLSelect select = selectParser.select(); SQLQueryExpr queryExpr = new SQLQueryExpr(select); @@ -2561,7 +2559,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.INTO); for (;;) { stmt.getInto().add(this.exprParser.name()); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } @@ -2607,7 +2605,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.INTO); - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { lexer.nextToken(); SQLSelect select = this.createSQLSelectParser().select(); SQLSubqueryTableSource tableSource = new SQLSubqueryTableSource(select); @@ -2628,9 +2626,9 @@ public class SQLStatementParser extends SQLParser { stmt.setOn(exprParser.expr()); boolean insertFlag = false; - if (lexer.token() == Token.WHEN) { + if (lexer.token == Token.WHEN) { lexer.nextToken(); - if (lexer.token() == Token.MATCHED) { + if (lexer.token == Token.MATCHED) { SQLMergeStatement.MergeUpdateClause updateClause = new SQLMergeStatement.MergeUpdateClause(); lexer.nextToken(); accept(Token.THEN); @@ -2643,7 +2641,7 @@ public class SQLStatementParser extends SQLParser { updateClause.addItem(item); item.setParent(updateClause); - if (lexer.token() == (Token.COMMA)) { + if (lexer.token == (Token.COMMA)) { lexer.nextToken(); continue; } @@ -2651,30 +2649,30 @@ public class SQLStatementParser extends SQLParser { break; } - if (lexer.token() == Token.WHERE) { + if (lexer.token == Token.WHERE) { lexer.nextToken(); updateClause.setWhere(exprParser.expr()); } - if (lexer.token() == Token.DELETE) { + if (lexer.token == Token.DELETE) { lexer.nextToken(); accept(Token.WHERE); updateClause.setWhere(exprParser.expr()); } stmt.setUpdateClause(updateClause); - } else if (lexer.token() == Token.NOT) { + } else if (lexer.token == Token.NOT) { lexer.nextToken(); insertFlag = true; } } if (!insertFlag) { - if (lexer.token() == Token.WHEN) { + if (lexer.token == Token.WHEN) { lexer.nextToken(); } - if (lexer.token() == Token.NOT) { + if (lexer.token == Token.NOT) { lexer.nextToken(); insertFlag = true; } @@ -2687,7 +2685,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.THEN); accept(Token.INSERT); - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { accept(Token.LPAREN); exprParser.exprList(insertClause.getColumns(), insertClause); accept(Token.RPAREN); @@ -2697,7 +2695,7 @@ public class SQLStatementParser extends SQLParser { exprParser.exprList(insertClause.getValues(), insertClause); accept(Token.RPAREN); - if (lexer.token() == Token.WHERE) { + if (lexer.token == Token.WHERE) { lexer.nextToken(); insertClause.setWhere(exprParser.expr()); } @@ -2717,18 +2715,18 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); accept(Token.ERRORS); - if (lexer.token() == Token.INTO) { + if (lexer.token == Token.INTO) { lexer.nextToken(); errorClause.setInto(exprParser.name()); } - if (lexer.token() == Token.LPAREN) { + if (lexer.token == Token.LPAREN) { lexer.nextToken(); errorClause.setSimpleExpression(exprParser.expr()); accept(Token.RPAREN); } - if (lexer.token() == Token.REJECT) { + if (lexer.token == Token.REJECT) { lexer.nextToken(); accept(Token.LIMIT); errorClause.setLimit(exprParser.expr()); @@ -2744,10 +2742,10 @@ public class SQLStatementParser extends SQLParser { } public SQLStatement parseDescribe() { - if (lexer.token() == Token.DESC || lexer.identifierEquals("DESCRIBE")) { + if (lexer.token == Token.DESC || lexer.identifierEquals("DESCRIBE")) { lexer.nextToken(); } else { - throw new ParserException("expect DESC, actual " + lexer.token()); + throw new ParserException("expect DESC, actual " + lexer.token); } SQLDescribeStatement stmt = new SQLDescribeStatement(); @@ -2765,17 +2763,17 @@ public class SQLStatementParser extends SQLParser { } stmt.setObject(this.exprParser.name()); - Token token = lexer.token(); + Token token = lexer.token; if (token == Token.PARTITION) { lexer.nextToken(); this.accept(Token.LPAREN); for (;;) { stmt.getPartition().add(this.exprParser.expr()); - if (lexer.token() == Token.COMMA) { + if (lexer.token == Token.COMMA) { lexer.nextToken(); continue; } - if (lexer.token() == Token.RPAREN) { + if (lexer.token == Token.RPAREN) { lexer.nextToken(); break; } @@ -2858,7 +2856,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseWith() { SQLWithSubqueryClause with = this.parseWithQuery(); - if (lexer.token() == Token.SELECT) { + if (lexer.token == Token.SELECT) { SQLSelectParser selectParser = createSQLSelectParser(); SQLSelect select = selectParser.select(); select.setWithSubQuery(with); 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 f4b8c5abe5..6f0d9c6e74 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -37,7 +37,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.FnvConstants; +import com.alibaba.druid.util.FnvHash; import com.alibaba.druid.util.PGUtils; import java.util.ArrayList; @@ -1488,7 +1488,7 @@ class SchemaResolveVisitorFactory { long hash = x.nameHashCode64(); SQLTableSource tableSource = null; - if ((hash == FnvConstants.LEVEL || hash == FnvConstants.CONNECT_BY_ISCYCLE) + if ((hash == FnvHash.Constants.LEVEL || hash == FnvHash.Constants.CONNECT_BY_ISCYCLE) && ctx.object instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) ctx.object; if (queryBlock.getStartWith() != null 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 7b28c24e5a..b0ca06ce30 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -43,7 +43,6 @@ 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.FnvHash; -import com.alibaba.druid.util.FnvConstants; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.StringUtils; @@ -1169,9 +1168,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - if ((hash == FnvConstants.LEVEL - || hash == FnvConstants.CONNECT_BY_ISCYCLE - || hash == FnvConstants.ROWNUM) + if ((hash == FnvHash.Constants.LEVEL + || hash == FnvHash.Constants.CONNECT_BY_ISCYCLE + || hash == FnvHash.Constants.ROWNUM) && x.getResolvedColumn() == null && tableSource == null) { return false; @@ -1471,7 +1470,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (expr instanceof SQLIdentifierExpr) { SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; - if (identifierExpr.nameHashCode64() == FnvConstants.DUAL) { + if (identifierExpr.nameHashCode64() == FnvHash.Constants.DUAL) { return null; } diff --git a/src/main/java/com/alibaba/druid/util/FnvConstants.java b/src/main/java/com/alibaba/druid/util/FnvConstants.java index 5be5851b1f..486dbda597 100644 --- a/src/main/java/com/alibaba/druid/util/FnvConstants.java +++ b/src/main/java/com/alibaba/druid/util/FnvConstants.java @@ -15,146 +15,6 @@ */ package com.alibaba.druid.util; -public interface FnvConstants { - long HIGH_PRIORITY = FnvHash.fnv1a_64_lower("HIGH_PRIORITY"); - long DISTINCTROW = FnvHash.fnv1a_64_lower("DISTINCTROW"); - long STRAIGHT_JOIN = FnvHash.fnv1a_64_lower("STRAIGHT_JOIN"); - long SQL_SMALL_RESULT = FnvHash.fnv1a_64_lower("SQL_SMALL_RESULT"); - long SQL_BIG_RESULT = FnvHash.fnv1a_64_lower("SQL_BIG_RESULT"); - long SQL_BUFFER_RESULT = FnvHash.fnv1a_64_lower("SQL_BUFFER_RESULT"); - long SQL_CACHE = FnvHash.fnv1a_64_lower("SQL_CACHE"); - long SQL_NO_CACHE = FnvHash.fnv1a_64_lower("SQL_NO_CACHE"); - long SQL_CALC_FOUND_ROWS = FnvHash.fnv1a_64_lower("SQL_CALC_FOUND_ROWS"); - long OUTFILE = FnvHash.fnv1a_64_lower("OUTFILE"); - long SETS = FnvHash.fnv1a_64_lower("SETS"); - long REGEXP = FnvHash.fnv1a_64_lower("REGEXP"); - long RLIKE = FnvHash.fnv1a_64_lower("RLIKE"); - long USING = FnvHash.fnv1a_64_lower("USING"); - long IGNORE = FnvHash.fnv1a_64_lower("IGNORE"); - long FORCE = FnvHash.fnv1a_64_lower("FORCE"); - long CROSS = FnvHash.fnv1a_64_lower("CROSS"); - long NATURAL = FnvHash.fnv1a_64_lower("NATURAL"); - long APPLY = FnvHash.fnv1a_64_lower("APPLY"); - long CONNECT = FnvHash.fnv1a_64_lower("CONNECT"); - long START = FnvHash.fnv1a_64_lower("START"); - long BTREE = FnvHash.fnv1a_64_lower("BTREE"); - long HASH = FnvHash.fnv1a_64_lower("HASH"); - long NO_WAIT = FnvHash.fnv1a_64_lower("NO_WAIT"); - long WAIT = FnvHash.fnv1a_64_lower("WAIT"); - long NOWAIT = FnvHash.fnv1a_64_lower("NOWAIT"); - long ERRORS = FnvHash.fnv1a_64_lower("ERRORS"); - long VALUE = FnvHash.fnv1a_64_lower("VALUE"); - long NEXT = FnvHash.fnv1a_64_lower("NEXT"); - long NEXTVAL = FnvHash.fnv1a_64_lower("NEXTVAL"); - long CURRVAL = FnvHash.fnv1a_64_lower("CURRVAL"); - long PREVVAL = FnvHash.fnv1a_64_lower("PREVVAL"); - long PREVIOUS = FnvHash.fnv1a_64_lower("PREVIOUS"); - long LOW_PRIORITY = FnvHash.fnv1a_64_lower("LOW_PRIORITY"); - long COMMIT_ON_SUCCESS = FnvHash.fnv1a_64_lower("COMMIT_ON_SUCCESS"); - long ROLLBACK_ON_FAIL = FnvHash.fnv1a_64_lower("ROLLBACK_ON_FAIL"); - long QUEUE_ON_PK = FnvHash.fnv1a_64_lower("QUEUE_ON_PK"); - long TARGET_AFFECT_ROW = FnvHash.fnv1a_64_lower("TARGET_AFFECT_ROW"); - long COLLATE = FnvHash.fnv1a_64_lower("COLLATE"); - long BOOLEAN = FnvHash.fnv1a_64_lower("BOOLEAN"); - long CHARSET = FnvHash.fnv1a_64_lower("CHARSET"); - long SEMI = FnvHash.fnv1a_64_lower("SEMI"); - long ANTI = FnvHash.fnv1a_64_lower("ANTI"); - long PRIOR = FnvHash.fnv1a_64_lower("PRIOR"); - long NOCYCLE = FnvHash.fnv1a_64_lower("NOCYCLE"); - long CONNECT_BY_ROOT = FnvHash.fnv1a_64_lower("CONNECT_BY_ROOT"); - long DATE = FnvHash.fnv1a_64_lower("DATE"); - long TIMESTAMP = FnvHash.fnv1a_64_lower("TIMESTAMP"); - long CURRENT = FnvHash.fnv1a_64_lower("CURRENT"); - long COUNT = FnvHash.fnv1a_64_lower("COUNT"); - long ROW_NUMBER = FnvHash.fnv1a_64_lower("ROW_NUMBER"); - long WM_CONAT = FnvHash.fnv1a_64_lower("WM_CONAT"); - long AVG = FnvHash.fnv1a_64_lower("AVG"); - long MAX = FnvHash.fnv1a_64_lower("MAX"); - long MIN = FnvHash.fnv1a_64_lower("MIN"); - long STDDEV = FnvHash.fnv1a_64_lower("STDDEV"); - long SUM = FnvHash.fnv1a_64_lower("SUM"); - long GROUP_CONCAT = FnvHash.fnv1a_64_lower("GROUP_CONCAT"); - long DEDUPLICATION = FnvHash.fnv1a_64_lower("DEDUPLICATION"); - long CONVERT = FnvHash.fnv1a_64_lower("CONVERT"); - long CHAR = FnvHash.fnv1a_64_lower("CHAR"); - long VARCHAR = FnvHash.fnv1a_64_lower("VARCHAR"); - long VARCHAR2 = FnvHash.fnv1a_64_lower("VARCHAR2"); - long NCHAR = FnvHash.fnv1a_64_lower("NCHAR"); - long NVARCHAR = FnvHash.fnv1a_64_lower("NVARCHAR"); - long NVARCHAR2 = FnvHash.fnv1a_64_lower("NVARCHAR2"); - long TINYTEXT = FnvHash.fnv1a_64_lower("TINYTEXT"); - long TEXT = FnvHash.fnv1a_64_lower("TEXT"); - long MEDIUMTEXT = FnvHash.fnv1a_64_lower("MEDIUMTEXT"); - long LONGTEXT = FnvHash.fnv1a_64_lower("LONGTEXT"); - long TRIM = FnvHash.fnv1a_64_lower("TRIM"); - long LEADING = FnvHash.fnv1a_64_lower("LEADING"); - long BOTH = FnvHash.fnv1a_64_lower("BOTH"); - long TRAILING = FnvHash.fnv1a_64_lower("TRAILING"); - long MOD = FnvHash.fnv1a_64_lower("MOD"); - long MATCH = FnvHash.fnv1a_64_lower("MATCH"); - long EXTRACT = FnvHash.fnv1a_64_lower("EXTRACT"); - long POSITION = FnvHash.fnv1a_64_lower("POSITION"); - long DUAL = FnvHash.fnv1a_64_lower("DUAL"); - long LEVEL = FnvHash.fnv1a_64_lower("LEVEL"); - long CONNECT_BY_ISCYCLE = FnvHash.fnv1a_64_lower("CONNECT_BY_ISCYCLE"); - long CURRENT_TIMESTAMP = FnvHash.fnv1a_64_lower("CURRENT_TIMESTAMP"); - long FALSE = FnvHash.fnv1a_64_lower("FALSE"); - long TRUE = FnvHash.fnv1a_64_lower("TRUE"); - long SET = FnvHash.fnv1a_64_lower("SET"); - long LESS = FnvHash.fnv1a_64_lower("LESS"); - long MAXVALUE = FnvHash.fnv1a_64_lower("MAXVALUE"); - long OFFSET = FnvHash.fnv1a_64_lower("OFFSET"); - long RAW = FnvHash.fnv1a_64_lower("RAW"); - long LONG = FnvHash.fnv1a_64_lower("LONG"); - long ROWNUM = FnvHash.fnv1a_64_lower("ROWNUM"); - long PRECISION = FnvHash.fnv1a_64_lower("PRECISION"); - long DOUBLE = FnvHash.fnv1a_64_lower("DOUBLE"); - long WITHOUT = FnvHash.fnv1a_64_lower("WITHOUT"); +public interface FnvConstants extends FnvHash.Constants { - long DEFINER = FnvHash.fnv1a_64_lower("DEFINER"); - long DETERMINISTIC = FnvHash.fnv1a_64_lower("DETERMINISTIC"); - long CONTAINS = FnvHash.fnv1a_64_lower("CONTAINS"); - long SQL = FnvHash.fnv1a_64_lower("SQL"); - long CALL = FnvHash.fnv1a_64_lower("CALL"); - long CHARACTER = FnvHash.fnv1a_64_lower("CHARACTER"); - - long VALIDATE = FnvHash.fnv1a_64_lower("VALIDATE"); - long NOVALIDATE = FnvHash.fnv1a_64_lower("NOVALIDATE"); - long SIMILAR = FnvHash.fnv1a_64_lower("SIMILAR"); - long CASCADE = FnvHash.fnv1a_64_lower("CASCADE"); - long RELY = FnvHash.fnv1a_64_lower("RELY"); - long NORELY = FnvHash.fnv1a_64_lower("NORELY"); - long ROW = FnvHash.fnv1a_64_lower("ROW"); - long ROWS = FnvHash.fnv1a_64_lower("ROWS"); - long RANGE = FnvHash.fnv1a_64_lower("RANGE"); - long PRECEDING = FnvHash.fnv1a_64_lower("PRECEDING"); - long FOLLOWING = FnvHash.fnv1a_64_lower("FOLLOWING"); - long UNBOUNDED = FnvHash.fnv1a_64_lower("UNBOUNDED"); - long SIBLINGS = FnvHash.fnv1a_64_lower("SIBLINGS"); - long NULLS = FnvHash.fnv1a_64_lower("NULLS"); - long FIRST = FnvHash.fnv1a_64_lower("FIRST"); - long LAST = FnvHash.fnv1a_64_lower("LAST"); - long AUTO_INCREMENT = FnvHash.fnv1a_64_lower("AUTO_INCREMENT"); - long STORAGE = FnvHash.fnv1a_64_lower("STORAGE"); - long STORED = FnvHash.fnv1a_64_lower("STORED"); - long VIRTUAL = FnvHash.fnv1a_64_lower("VIRTUAL"); - long UNSIGNED = FnvHash.fnv1a_64_lower("UNSIGNED"); - long ZEROFILL = FnvHash.fnv1a_64_lower("ZEROFILL"); - long GLOBAL = FnvHash.fnv1a_64_lower("GLOBAL"); - long SESSION = FnvHash.fnv1a_64_lower("SESSION"); - long NAMES = FnvHash.fnv1a_64_lower("NAMES"); - long PARTIAL = FnvHash.fnv1a_64_lower("PARTIAL"); - long SIMPLE = FnvHash.fnv1a_64_lower("SIMPLE"); - long RESTRICT = FnvHash.fnv1a_64_lower("RESTRICT"); - long ON = FnvHash.fnv1a_64_lower("ON"); - long ACTION = FnvHash.fnv1a_64_lower("ACTION"); - long SEPARATOR = FnvHash.fnv1a_64_lower("SEPARATOR"); - long DATA = FnvHash.fnv1a_64_lower("DATA"); - long MAX_ROWS = FnvHash.fnv1a_64_lower("MAX_ROWS"); - long MIN_ROWS = FnvHash.fnv1a_64_lower("MIN_ROWS"); - long ENGINE = FnvHash.fnv1a_64_lower("ENGINE"); - long SKIP = FnvHash.fnv1a_64_lower("SKIP"); - long RECURSIVE = FnvHash.fnv1a_64_lower("RECURSIVE"); - long ROLLUP = FnvHash.fnv1a_64_lower("ROLLUP"); - long CUBE = FnvHash.fnv1a_64_lower("CUBE"); } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 06c422d94e..415e1755e6 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -244,4 +244,148 @@ public final class FnvHash { return hashCode; } + + public static interface Constants { + long HIGH_PRIORITY = fnv1a_64_lower("HIGH_PRIORITY"); + long DISTINCTROW = fnv1a_64_lower("DISTINCTROW"); + long STRAIGHT_JOIN = fnv1a_64_lower("STRAIGHT_JOIN"); + long SQL_SMALL_RESULT = fnv1a_64_lower("SQL_SMALL_RESULT"); + long SQL_BIG_RESULT = fnv1a_64_lower("SQL_BIG_RESULT"); + long SQL_BUFFER_RESULT = fnv1a_64_lower("SQL_BUFFER_RESULT"); + long SQL_CACHE = fnv1a_64_lower("SQL_CACHE"); + long SQL_NO_CACHE = fnv1a_64_lower("SQL_NO_CACHE"); + long SQL_CALC_FOUND_ROWS = fnv1a_64_lower("SQL_CALC_FOUND_ROWS"); + long OUTFILE = fnv1a_64_lower("OUTFILE"); + long SETS = fnv1a_64_lower("SETS"); + long REGEXP = fnv1a_64_lower("REGEXP"); + long RLIKE = fnv1a_64_lower("RLIKE"); + long USING = fnv1a_64_lower("USING"); + long IGNORE = fnv1a_64_lower("IGNORE"); + long FORCE = fnv1a_64_lower("FORCE"); + long CROSS = fnv1a_64_lower("CROSS"); + long NATURAL = fnv1a_64_lower("NATURAL"); + long APPLY = fnv1a_64_lower("APPLY"); + long CONNECT = fnv1a_64_lower("CONNECT"); + long START = fnv1a_64_lower("START"); + long BTREE = fnv1a_64_lower("BTREE"); + long HASH = fnv1a_64_lower("HASH"); + long NO_WAIT = fnv1a_64_lower("NO_WAIT"); + long WAIT = fnv1a_64_lower("WAIT"); + long NOWAIT = fnv1a_64_lower("NOWAIT"); + long ERRORS = fnv1a_64_lower("ERRORS"); + long VALUE = fnv1a_64_lower("VALUE"); + long NEXT = fnv1a_64_lower("NEXT"); + long NEXTVAL = fnv1a_64_lower("NEXTVAL"); + long CURRVAL = fnv1a_64_lower("CURRVAL"); + long PREVVAL = fnv1a_64_lower("PREVVAL"); + long PREVIOUS = fnv1a_64_lower("PREVIOUS"); + long LOW_PRIORITY = fnv1a_64_lower("LOW_PRIORITY"); + long COMMIT_ON_SUCCESS = fnv1a_64_lower("COMMIT_ON_SUCCESS"); + long ROLLBACK_ON_FAIL = fnv1a_64_lower("ROLLBACK_ON_FAIL"); + long QUEUE_ON_PK = fnv1a_64_lower("QUEUE_ON_PK"); + long TARGET_AFFECT_ROW = fnv1a_64_lower("TARGET_AFFECT_ROW"); + long COLLATE = fnv1a_64_lower("COLLATE"); + long BOOLEAN = fnv1a_64_lower("BOOLEAN"); + long CHARSET = fnv1a_64_lower("CHARSET"); + long SEMI = fnv1a_64_lower("SEMI"); + long ANTI = fnv1a_64_lower("ANTI"); + long PRIOR = fnv1a_64_lower("PRIOR"); + long NOCYCLE = fnv1a_64_lower("NOCYCLE"); + long CONNECT_BY_ROOT = fnv1a_64_lower("CONNECT_BY_ROOT"); + long DATE = fnv1a_64_lower("DATE"); + long TIMESTAMP = fnv1a_64_lower("TIMESTAMP"); + long CURRENT = fnv1a_64_lower("CURRENT"); + long COUNT = fnv1a_64_lower("COUNT"); + long ROW_NUMBER = fnv1a_64_lower("ROW_NUMBER"); + long WM_CONAT = fnv1a_64_lower("WM_CONAT"); + long AVG = fnv1a_64_lower("AVG"); + long MAX = fnv1a_64_lower("MAX"); + long MIN = fnv1a_64_lower("MIN"); + long STDDEV = fnv1a_64_lower("STDDEV"); + long SUM = fnv1a_64_lower("SUM"); + long GROUP_CONCAT = fnv1a_64_lower("GROUP_CONCAT"); + long DEDUPLICATION = fnv1a_64_lower("DEDUPLICATION"); + long CONVERT = fnv1a_64_lower("CONVERT"); + long CHAR = fnv1a_64_lower("CHAR"); + long VARCHAR = fnv1a_64_lower("VARCHAR"); + long VARCHAR2 = fnv1a_64_lower("VARCHAR2"); + long NCHAR = fnv1a_64_lower("NCHAR"); + long NVARCHAR = fnv1a_64_lower("NVARCHAR"); + long NVARCHAR2 = fnv1a_64_lower("NVARCHAR2"); + long TINYTEXT = fnv1a_64_lower("TINYTEXT"); + long TEXT = fnv1a_64_lower("TEXT"); + long MEDIUMTEXT = fnv1a_64_lower("MEDIUMTEXT"); + long LONGTEXT = fnv1a_64_lower("LONGTEXT"); + long TRIM = fnv1a_64_lower("TRIM"); + long LEADING = fnv1a_64_lower("LEADING"); + long BOTH = fnv1a_64_lower("BOTH"); + long TRAILING = fnv1a_64_lower("TRAILING"); + long MOD = fnv1a_64_lower("MOD"); + long MATCH = fnv1a_64_lower("MATCH"); + long EXTRACT = fnv1a_64_lower("EXTRACT"); + long POSITION = fnv1a_64_lower("POSITION"); + long DUAL = fnv1a_64_lower("DUAL"); + long LEVEL = fnv1a_64_lower("LEVEL"); + long CONNECT_BY_ISCYCLE = fnv1a_64_lower("CONNECT_BY_ISCYCLE"); + long CURRENT_TIMESTAMP = fnv1a_64_lower("CURRENT_TIMESTAMP"); + long FALSE = fnv1a_64_lower("FALSE"); + long TRUE = fnv1a_64_lower("TRUE"); + long SET = fnv1a_64_lower("SET"); + long LESS = fnv1a_64_lower("LESS"); + long MAXVALUE = fnv1a_64_lower("MAXVALUE"); + long OFFSET = fnv1a_64_lower("OFFSET"); + long RAW = fnv1a_64_lower("RAW"); + long LONG = fnv1a_64_lower("LONG"); + long ROWNUM = fnv1a_64_lower("ROWNUM"); + long PRECISION = fnv1a_64_lower("PRECISION"); + long DOUBLE = fnv1a_64_lower("DOUBLE"); + long WITHOUT = fnv1a_64_lower("WITHOUT"); + + long DEFINER = fnv1a_64_lower("DEFINER"); + long DETERMINISTIC = fnv1a_64_lower("DETERMINISTIC"); + long CONTAINS = fnv1a_64_lower("CONTAINS"); + long SQL = fnv1a_64_lower("SQL"); + long CALL = fnv1a_64_lower("CALL"); + long CHARACTER = fnv1a_64_lower("CHARACTER"); + + long VALIDATE = fnv1a_64_lower("VALIDATE"); + long NOVALIDATE = fnv1a_64_lower("NOVALIDATE"); + long SIMILAR = fnv1a_64_lower("SIMILAR"); + long CASCADE = fnv1a_64_lower("CASCADE"); + long RELY = fnv1a_64_lower("RELY"); + long NORELY = fnv1a_64_lower("NORELY"); + long ROW = fnv1a_64_lower("ROW"); + long ROWS = fnv1a_64_lower("ROWS"); + long RANGE = fnv1a_64_lower("RANGE"); + long PRECEDING = fnv1a_64_lower("PRECEDING"); + long FOLLOWING = fnv1a_64_lower("FOLLOWING"); + long UNBOUNDED = fnv1a_64_lower("UNBOUNDED"); + long SIBLINGS = fnv1a_64_lower("SIBLINGS"); + long NULLS = fnv1a_64_lower("NULLS"); + long FIRST = fnv1a_64_lower("FIRST"); + long LAST = fnv1a_64_lower("LAST"); + long AUTO_INCREMENT = fnv1a_64_lower("AUTO_INCREMENT"); + long STORAGE = fnv1a_64_lower("STORAGE"); + long STORED = fnv1a_64_lower("STORED"); + long VIRTUAL = fnv1a_64_lower("VIRTUAL"); + long UNSIGNED = fnv1a_64_lower("UNSIGNED"); + long ZEROFILL = fnv1a_64_lower("ZEROFILL"); + long GLOBAL = fnv1a_64_lower("GLOBAL"); + long SESSION = fnv1a_64_lower("SESSION"); + long NAMES = fnv1a_64_lower("NAMES"); + long PARTIAL = fnv1a_64_lower("PARTIAL"); + long SIMPLE = fnv1a_64_lower("SIMPLE"); + long RESTRICT = fnv1a_64_lower("RESTRICT"); + long ON = fnv1a_64_lower("ON"); + long ACTION = fnv1a_64_lower("ACTION"); + long SEPARATOR = fnv1a_64_lower("SEPARATOR"); + long DATA = fnv1a_64_lower("DATA"); + long MAX_ROWS = fnv1a_64_lower("MAX_ROWS"); + long MIN_ROWS = fnv1a_64_lower("MIN_ROWS"); + long ENGINE = fnv1a_64_lower("ENGINE"); + long SKIP = fnv1a_64_lower("SKIP"); + long RECURSIVE = fnv1a_64_lower("RECURSIVE"); + long ROLLUP = fnv1a_64_lower("ROLLUP"); + long CUBE = fnv1a_64_lower("CUBE"); + } } diff --git a/src/main/java/com/alibaba/druid/util/PGUtils.java b/src/main/java/com/alibaba/druid/util/PGUtils.java index af7dbc7bd3..e4a2c1425a 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 = { - FnvConstants.CURRENT_TIMESTAMP + FnvHash.Constants.CURRENT_TIMESTAMP }; Arrays.sort(array); pseudoColumnHashCodes = array; 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 110a7200fd..3df780d9a0 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -52,7 +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.FnvHash; import com.alibaba.druid.util.JdbcUtils; import com.alibaba.druid.util.ServletPathMatcher; import com.alibaba.druid.util.StringUtils; @@ -1624,7 +1624,7 @@ public class WallVisitorUtils { SQLExpr selectItemExpr = queryBlock.getSelectList().get(0).getExpr(); if (selectItemExpr instanceof SQLAggregateExpr) { if (((SQLAggregateExpr) selectItemExpr) - .methodNameHashCod64() == FnvConstants.COUNT) { + .methodNameHashCod64() == FnvHash.Constants.COUNT) { simpleCount = true; } } 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 c81de8b919..729e9cca07 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,5 +1,6 @@ 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.FnvHash; import junit.framework.TestCase; @@ -44,5 +45,23 @@ public class HashTest_1_propertyExpr extends TestCase { new SQLPropertyExpr("\"ESCROW\"","\"HT_TASK_TRADE_HISTORY_NEW\"").hashCode64()); } + public void test_changeOwner() throws Exception { + SQLIdentifierExpr table = new SQLIdentifierExpr("t1"); + SQLPropertyExpr column = new SQLPropertyExpr(table, "f0"); + + assertEquals(FnvHash.hashCode64("t1"), table.hashCode64()); + assertEquals(FnvHash.hashCode64("t1.f0"), column.hashCode64()); + + table.setName("t2"); + + assertEquals(FnvHash.hashCode64("t2"), table.hashCode64()); + assertEquals(FnvHash.hashCode64("t2.f0"), column.hashCode64()); + + column.setName("f1"); + + assertEquals(FnvHash.hashCode64("t2.f1"), column.hashCode64()); + + } + //ESCROW.HT_TASK_TRADE_HISTORY_NEW } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/SimplifyTest.java b/src/test/java/com/alibaba/druid/bvt/sql/SimplifyTest.java new file mode 100644 index 0000000000..d688f22a44 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/SimplifyTest.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.bvt.sql; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import junit.framework.TestCase; + +public class SimplifyTest extends TestCase { + public void test_simplify_column() throws Exception { + SQLColumnDefinition column = new SQLColumnDefinition(); + + column.setName("`a`"); + + SQLName name_0 = column.getName(); + column.simplify(); + + assertNotSame(name_0, column.getName()); + assertEquals("a", column.getName().getSimpleName()); + + name_0 = column.getName(); + column.simplify(); + assertSame(name_0, column.getName()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest77.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest77.java new file mode 100644 index 0000000000..861d8a7fbb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest77.java @@ -0,0 +1,116 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest77 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT\n" + + " a.contract_header_id,\n" + + " a.contract_number,\n" + + " a.contract_name,\n" + + " b.field_value contract_amount,\n" + + " c.payment_rate,\n" + + " d.id customer_id,\n" + + " d.name customer_name,\n" + + " a.salesrep_id\n" + + "FROM (\n" + + " tcc_cpr.tcc_cpr_contract_headers a\n" + + " LEFT JOIN tcc_cpr.virtual_value2004 b ON\n" + + " a.contract_header_id = b.contract_header_id\n" + + " AND\n" + + " b.template_id =\n" + + " CASE\n" + + " WHEN a.contract_category = 'SALES' THEN 1\n" + + " WHEN a.contract_category = 'INTERNATIONAL' THEN 49\n" + + " END\n" + + " AND\n" + + " b.enabled_flag = 'Y'\n" + + " LEFT JOIN tcc_cpr.tcc_cpr_payment c ON\n" + + " a.contract_header_id = c.contract_header_id\n" + + " AND\n" + + " c.payment_condition_code = 'ZTE_PAYMENT_YUFU'\n" + + " AND\n" + + " c.enabled_flag = 'Y'\n" + + ")\n" + + " LEFT JOIN tcc_cust.tcc_cust_customer d ON (\n" + + " a.customer_id = d.id\n" + + " AND (\n" + + " d.enable_flag = 'Y'\n" + + " OR\n" + + " d.enable_flag = 'T'\n" + + " )\n" + + " )\n" + + "WHERE\n" + + " a.enabled_flag = 'Y'"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(4, visitor.getTables().size()); + assertEquals(18, visitor.getColumns().size()); + assertEquals(12, visitor.getConditions().size()); + assertEquals(3, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT a.contract_header_id, a.contract_number, a.contract_name, b.field_value AS contract_amount, c.payment_rate\n" + + "\t, d.id AS customer_id, d.name AS customer_name, a.salesrep_id\n" + + "FROM tcc_cpr.tcc_cpr_contract_headers a\n" + + "LEFT JOIN tcc_cpr.virtual_value2004 b ON a.contract_header_id = b.contract_header_id\n" + + "AND b.template_id = CASE \n" + + "\tWHEN a.contract_category = 'SALES' THEN 1\n" + + "\tWHEN a.contract_category = 'INTERNATIONAL' THEN 49\n" + + "END\n" + + "AND b.enabled_flag = 'Y' \n" + + "LEFT JOIN tcc_cpr.tcc_cpr_payment c ON a.contract_header_id = c.contract_header_id\n" + + "AND c.payment_condition_code = 'ZTE_PAYMENT_YUFU'\n" + + "AND c.enabled_flag = 'Y' \n" + + "\tLEFT JOIN tcc_cust.tcc_cust_customer d ON a.customer_id = d.id\n" + + "AND (d.enable_flag = 'Y'\n" + + "\tOR d.enable_flag = 'T') \n" + + "WHERE a.enabled_flag = 'Y'", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest78.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest78.java new file mode 100644 index 0000000000..9961f70372 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest78.java @@ -0,0 +1,463 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest78 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "WITH resulttable AS (\n" + + " SELECT DISTINCT\n" + + " tcc_cust.get_visit_cust_name(h.visit_id) AS cust_name,\n" + + " h.visit_id,\n" + + " h.visit_code,\n" + + " h.visit_title,\n" + + " h.visit_start_date AS visitstsrtdate,\n" + + " TO_CHAR(\n" + + " h.visit_end_date,\n" + + " 'YYYY-MM-DD'\n" + + " ) AS visit_end_date,\n" + + " h.master_dept_id,\n" + + " h.area_id,\n" + + " h.creation_time,\n" + + " h.visit_mode,\n" + + " h.track_flag,\n" + + " h.customer_id,\n" + + " h.visit_state,\n" + + " cust.level_,\n" + + " h.approve_state,\n" + + " h.evamemo,\n" + + " h.approver_leader AS approveby,\n" + + " h.created_by\n" + + " FROM\n" + + " tcc_cust.tcc_cust_visit_header h,\n" + + " tcc_cust.tcc_cust_visit_join custjoin,\n" + + " tcc_cust.tcc_cust_visit_join ourjion,\n" + + " tcc_cust.tcc_cust_person_info person,\n" + + " tcc_cust.tcc_cust_customer cust\n" + + " WHERE\n" + + " h.visit_id = custjoin.visit_id (+)\n" + + " AND\n" + + " custjoin.join_id = person.id (+)\n" + + " AND\n" + + " custjoin.join_type (+) =?\n" + + " AND\n" + + " h.visit_id = ourjion.visit_id (+)\n" + + " AND\n" + + " ourjion.join_type (+) =?\n" + + " AND\n" + + " h.customer_id = cust.id (+)\n" + + " AND\n" + + " h.enable_flag =?\n" + + " AND\n" + + " custjoin.enable_flag (+) =?\n" + + " AND\n" + + " ourjion.enable_flag (+) =?\n" + + " AND\n" + + " h.parent_visit_id =:1\n" + + " UNION\n" + + " SELECT DISTINCT\n" + + " tcc_cust.get_visit_cust_name(h.visit_id) AS cust_name,\n" + + " h.visit_id,\n" + + " h.visit_code,\n" + + " h.visit_title,\n" + + " h.visit_start_date AS visitstsrtdate,\n" + + " TO_CHAR(\n" + + " h.visit_end_date,\n" + + " 'YYYY-MM-DD'\n" + + " ) AS visit_end_date,\n" + + " h.master_dept_id,\n" + + " h.area_id,\n" + + " h.creation_time,\n" + + " h.visit_mode,\n" + + " h.track_flag,\n" + + " h.customer_id,\n" + + " h.visit_state,\n" + + " cust.level_,\n" + + " h.approve_state,\n" + + " h.evamemo,\n" + + " h.approver_leader AS approveby,\n" + + " h.created_by\n" + + " FROM\n" + + " tcc_cust.tcc_cust_visit_header h,\n" + + " tcc_cust.tcc_cust_visit_join custjoin,\n" + + " tcc_cust.tcc_cust_visit_join ourjion,\n" + + " tcc_cust.tcc_cust_person_info person,\n" + + " tcc_cust.tcc_cust_customer cust\n" + + " WHERE\n" + + " h.visit_id = custjoin.visit_id (+)\n" + + " AND\n" + + " custjoin.join_id = person.id (+)\n" + + " AND\n" + + " custjoin.join_type (+) =?\n" + + " AND\n" + + " h.visit_id = ourjion.visit_id (+)\n" + + " AND\n" + + " ourjion.join_type (+) =?\n" + + " AND\n" + + " h.customer_id = cust.id (+)\n" + + " AND\n" + + " h.enable_flag =?\n" + + " AND\n" + + " custjoin.enable_flag (+) =?\n" + + " AND\n" + + " ourjion.enable_flag (+) =?\n" + + " AND\n" + + " person.id IN (\n" + + " SELECT\n" + + " *\n" + + " FROM\n" + + " (\n" + + " SELECT DISTINCT\n" + + " t.id AS personid\n" + + " FROM\n" + + " tcc_cust.tcc_cust_person_info t,\n" + + " tcc_cust.tcc_cust_customer cust\n" + + " WHERE\n" + + " t.enable_flag =?\n" + + " AND\n" + + " cust.enable_flag =?\n" + + " AND (\n" + + " t.is_temp =?\n" + + " OR\n" + + " t.is_temp IS NULL\n" + + " ) AND\n" + + " cust.id = t.customer_id\n" + + " AND\n" + + " cust.id IN (\n" + + " SELECT DISTINCT\n" + + " customer_id\n" + + " FROM\n" + + " tcc_cust.tcc_cust_customer_power tccp\n" + + " WHERE\n" + + " tccp.employeeid =?\n" + + " AND\n" + + " tccp.enable_flag =?\n" + + " )\n" + + " UNION\n" + + " SELECT DISTINCT\n" + + " t.id AS personid\n" + + " FROM\n" + + " tcc_cust.tcc_cust_person_info t,\n" + + " tcc_cust.tcc_cust_customer cust\n" + + " WHERE\n" + + " t.enable_flag =?\n" + + " AND\n" + + " cust.enable_flag =?\n" + + " AND (\n" + + " t.is_temp =?\n" + + " OR\n" + + " t.is_temp IS NULL\n" + + " ) AND\n" + + " cust.id = t.customer_id\n" + + " AND\n" + + " cust.id IN (\n" + + " SELECT DISTINCT\n" + + " ucoa.cust_org_id\n" + + " FROM\n" + + " tcc_fnd.tcc_fnd_userorg_cust_org_auth ucoa,\n" + + " tcc_fnd.tcc_fnd_emplyees eep\n" + + " WHERE\n" + + " ucoa.user_org_id = eep.dept_id\n" + + " AND\n" + + " eep.emplyee_id =?\n" + + " AND\n" + + " ucoa.enable_flag =?\n" + + " )\n" + + " UNION\n" + + " SELECT DISTINCT\n" + + " t.id AS personid\n" + + " FROM\n" + + " tcc_cust.tcc_cust_person_info t,\n" + + " tcc_cust.tcc_cust_customer cust\n" + + " WHERE\n" + + " t.enable_flag =?\n" + + " AND\n" + + " cust.enable_flag =?\n" + + " AND (\n" + + " t.is_temp =?\n" + + " OR\n" + + " t.is_temp IS NULL\n" + + " ) AND\n" + + " cust.id = t.customer_id\n" + + " AND\n" + + " t.id IN (\n" + + " SELECT DISTINCT\n" + + " euca.cust_person_id\n" + + " FROM\n" + + " tcc_fnd.tcc_fnd_user_contact_auth euca\n" + + " WHERE\n" + + " euca.user_id =?\n" + + " AND\n" + + " euca.enable_flag =?\n" + + " )\n" + + " UNION\n" + + " SELECT DISTINCT\n" + + " t.id AS personid\n" + + " FROM\n" + + " tcc_cust.tcc_cust_person_info t\n" + + " WHERE\n" + + " t.enable_flag =?\n" + + " AND (\n" + + " t.is_temp =?\n" + + " OR\n" + + " t.is_temp IS NULL\n" + + " ) AND\n" + + " t.created_by =?\n" + + " ) temp\n" + + " )\n" + + " AND\n" + + " h.parent_visit_id =:2\n" + + " ORDER BY\n" + + " creation_time DESC,\n" + + " visitstsrtdate\n" + + ") SELECT\n" + + " cust_name,\n" + + " visit_id,\n" + + " visit_code,\n" + + " visit_title,\n" + + " visit_start_date,\n" + + " visit_end_date,\n" + + " master_dept_id,\n" + + " area_id,\n" + + " creation_time,\n" + + " visit_mode,\n" + + " track_flag,\n" + + " customer_id,\n" + + " visit_state,\n" + + " tcc_cust.get_join_info(\n" + + " lasttab.visit_id,\n" + + " ?\n" + + " ) AS person_name,\n" + + " level_,\n" + + " approve_state,\n" + + " evamemo,\n" + + " approveby,\n" + + " (\n" + + " SELECT\n" + + " e.nameno\n" + + " FROM\n" + + " tcc_fnd.tcc_fnd_emplyees e\n" + + " WHERE\n" + + " e.emplyee_id = lasttab.created_by\n" + + " ) AS created_by,\n" + + " area_name,\n" + + " master_dept_name,\n" + + " resultcount,\n" + + " resultnums\n" + + "FROM\n" + + " (\n" + + " SELECT\n" + + " result.*,\n" + + " TO_CHAR(\n" + + " result.visitstsrtdate,\n" + + " 'YYYY-MM-DD'\n" + + " ) AS visit_start_date,\n" + + " ROWNUM AS resultnums\n" + + " FROM\n" + + " (\n" + + " SELECT\n" + + " *\n" + + " FROM\n" + + " (\n" + + " SELECT\n" + + " resulttable.*,\n" + + " viewtable.*,\n" + + " area.full_area_name AS area_name,\n" + + " d.full_name AS master_dept_name\n" + + " FROM\n" + + " resulttable,\n" + + " (\n" + + " SELECT\n" + + " COUNT(1) AS resultcount\n" + + " FROM\n" + + " resulttable\n" + + " ) viewtable,\n" + + " tcc_cust.tcc_cust_area_info_v area,\n" + + " tcc_fnd.tcc_fnd_depts_v d\n" + + " WHERE\n" + + " resulttable.area_id = area.area_id (+)\n" + + " AND\n" + + " resulttable.master_dept_id = d.dept_id (+)\n" + + " ORDER BY\n" + + " resulttable.creation_time DESC,\n" + + " resulttable.visitstsrtdate\n" + + " )\n" + + " ) result\n" + + " ) lasttab\n" + + "WHERE\n" + + " resultnums >:3\n" + + " AND\n" + + " resultnums <=:4"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(10, visitor.getTables().size()); + assertEquals(65, visitor.getColumns().size()); + assertEquals(30, visitor.getConditions().size()); + assertEquals(7, visitor.getRelationships().size()); + assertEquals(2, visitor.getOrderByColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("WITH resulttable AS (\n" + + "\t\tSELECT DISTINCT tcc_cust.get_visit_cust_name(h.visit_id) AS cust_name, h.visit_id, h.visit_code, h.visit_title\n" + + "\t\t\t, h.visit_start_date AS visitstsrtdate, TO_CHAR(h.visit_end_date, 'YYYY-MM-DD') AS visit_end_date, h.master_dept_id\n" + + "\t\t\t, h.area_id, h.creation_time, h.visit_mode, h.track_flag, h.customer_id\n" + + "\t\t\t, h.visit_state, cust.level_, h.approve_state, h.evamemo, h.approver_leader AS approveby\n" + + "\t\t\t, h.created_by\n" + + "\t\tFROM tcc_cust.tcc_cust_visit_header h, tcc_cust.tcc_cust_visit_join custjoin, tcc_cust.tcc_cust_visit_join ourjion, tcc_cust.tcc_cust_person_info person, tcc_cust.tcc_cust_customer cust\n" + + "\t\tWHERE h.visit_id = custjoin.visit_id(+)\n" + + "\t\t\tAND custjoin.join_id = person.id(+)\n" + + "\t\t\tAND custjoin.join_type(+) = ?\n" + + "\t\t\tAND h.visit_id = ourjion.visit_id(+)\n" + + "\t\t\tAND ourjion.join_type(+) = ?\n" + + "\t\t\tAND h.customer_id = cust.id(+)\n" + + "\t\t\tAND h.enable_flag = ?\n" + + "\t\t\tAND custjoin.enable_flag(+) = ?\n" + + "\t\t\tAND ourjion.enable_flag(+) = ?\n" + + "\t\t\tAND h.parent_visit_id = :1\n" + + "\t\tUNION\n" + + "\t\tSELECT DISTINCT tcc_cust.get_visit_cust_name(h.visit_id) AS cust_name, h.visit_id, h.visit_code, h.visit_title\n" + + "\t\t\t, h.visit_start_date AS visitstsrtdate, TO_CHAR(h.visit_end_date, 'YYYY-MM-DD') AS visit_end_date, h.master_dept_id\n" + + "\t\t\t, h.area_id, h.creation_time, h.visit_mode, h.track_flag, h.customer_id\n" + + "\t\t\t, h.visit_state, cust.level_, h.approve_state, h.evamemo, h.approver_leader AS approveby\n" + + "\t\t\t, h.created_by\n" + + "\t\tFROM tcc_cust.tcc_cust_visit_header h, tcc_cust.tcc_cust_visit_join custjoin, tcc_cust.tcc_cust_visit_join ourjion, tcc_cust.tcc_cust_person_info person, tcc_cust.tcc_cust_customer cust\n" + + "\t\tWHERE h.visit_id = custjoin.visit_id(+)\n" + + "\t\t\tAND custjoin.join_id = person.id(+)\n" + + "\t\t\tAND custjoin.join_type(+) = ?\n" + + "\t\t\tAND h.visit_id = ourjion.visit_id(+)\n" + + "\t\t\tAND ourjion.join_type(+) = ?\n" + + "\t\t\tAND h.customer_id = cust.id(+)\n" + + "\t\t\tAND h.enable_flag = ?\n" + + "\t\t\tAND custjoin.enable_flag(+) = ?\n" + + "\t\t\tAND ourjion.enable_flag(+) = ?\n" + + "\t\t\tAND person.id IN (\n" + + "\t\t\t\tSELECT *\n" + + "\t\t\t\tFROM (\n" + + "\t\t\t\t\tSELECT DISTINCT t.id AS personid\n" + + "\t\t\t\t\tFROM tcc_cust.tcc_cust_person_info t, tcc_cust.tcc_cust_customer cust\n" + + "\t\t\t\t\tWHERE t.enable_flag = ?\n" + + "\t\t\t\t\t\tAND cust.enable_flag = ?\n" + + "\t\t\t\t\t\tAND (t.is_temp = ?\n" + + "\t\t\t\t\t\t\tOR t.is_temp IS NULL)\n" + + "\t\t\t\t\t\tAND cust.id = t.customer_id\n" + + "\t\t\t\t\t\tAND cust.id IN (\n" + + "\t\t\t\t\t\t\tSELECT DISTINCT customer_id\n" + + "\t\t\t\t\t\t\tFROM tcc_cust.tcc_cust_customer_power tccp\n" + + "\t\t\t\t\t\t\tWHERE tccp.employeeid = ?\n" + + "\t\t\t\t\t\t\t\tAND tccp.enable_flag = ?\n" + + "\t\t\t\t\t\t)\n" + + "\t\t\t\t\tUNION\n" + + "\t\t\t\t\tSELECT DISTINCT t.id AS personid\n" + + "\t\t\t\t\tFROM tcc_cust.tcc_cust_person_info t, tcc_cust.tcc_cust_customer cust\n" + + "\t\t\t\t\tWHERE t.enable_flag = ?\n" + + "\t\t\t\t\t\tAND cust.enable_flag = ?\n" + + "\t\t\t\t\t\tAND (t.is_temp = ?\n" + + "\t\t\t\t\t\t\tOR t.is_temp IS NULL)\n" + + "\t\t\t\t\t\tAND cust.id = t.customer_id\n" + + "\t\t\t\t\t\tAND cust.id IN (\n" + + "\t\t\t\t\t\t\tSELECT DISTINCT ucoa.cust_org_id\n" + + "\t\t\t\t\t\t\tFROM tcc_fnd.tcc_fnd_userorg_cust_org_auth ucoa, tcc_fnd.tcc_fnd_emplyees eep\n" + + "\t\t\t\t\t\t\tWHERE ucoa.user_org_id = eep.dept_id\n" + + "\t\t\t\t\t\t\t\tAND eep.emplyee_id = ?\n" + + "\t\t\t\t\t\t\t\tAND ucoa.enable_flag = ?\n" + + "\t\t\t\t\t\t)\n" + + "\t\t\t\t\tUNION\n" + + "\t\t\t\t\tSELECT DISTINCT t.id AS personid\n" + + "\t\t\t\t\tFROM tcc_cust.tcc_cust_person_info t, tcc_cust.tcc_cust_customer cust\n" + + "\t\t\t\t\tWHERE t.enable_flag = ?\n" + + "\t\t\t\t\t\tAND cust.enable_flag = ?\n" + + "\t\t\t\t\t\tAND (t.is_temp = ?\n" + + "\t\t\t\t\t\t\tOR t.is_temp IS NULL)\n" + + "\t\t\t\t\t\tAND cust.id = t.customer_id\n" + + "\t\t\t\t\t\tAND t.id IN (\n" + + "\t\t\t\t\t\t\tSELECT DISTINCT euca.cust_person_id\n" + + "\t\t\t\t\t\t\tFROM tcc_fnd.tcc_fnd_user_contact_auth euca\n" + + "\t\t\t\t\t\t\tWHERE euca.user_id = ?\n" + + "\t\t\t\t\t\t\t\tAND euca.enable_flag = ?\n" + + "\t\t\t\t\t\t)\n" + + "\t\t\t\t\tUNION\n" + + "\t\t\t\t\tSELECT DISTINCT t.id AS personid\n" + + "\t\t\t\t\tFROM tcc_cust.tcc_cust_person_info t\n" + + "\t\t\t\t\tWHERE t.enable_flag = ?\n" + + "\t\t\t\t\t\tAND (t.is_temp = ?\n" + + "\t\t\t\t\t\t\tOR t.is_temp IS NULL)\n" + + "\t\t\t\t\t\tAND t.created_by = ?\n" + + "\t\t\t\t) temp\n" + + "\t\t\t)\n" + + "\t\t\tAND h.parent_visit_id = :2\n" + + "\t\tORDER BY creation_time DESC, visitstsrtdate\n" + + "\t)\n" + + "SELECT cust_name, visit_id, visit_code, visit_title, visit_start_date\n" + + "\t, visit_end_date, master_dept_id, area_id, creation_time, visit_mode\n" + + "\t, track_flag, customer_id, visit_state\n" + + "\t, tcc_cust.get_join_info(lasttab.visit_id, ?) AS person_name, level_\n" + + "\t, approve_state, evamemo, approveby\n" + + "\t, (\n" + + "\t\tSELECT e.nameno\n" + + "\t\tFROM tcc_fnd.tcc_fnd_emplyees e\n" + + "\t\tWHERE e.emplyee_id = lasttab.created_by\n" + + "\t) AS created_by, area_name, master_dept_name, resultcount, resultnums\n" + + "FROM (\n" + + "\tSELECT result.*, TO_CHAR(result.visitstsrtdate, 'YYYY-MM-DD') AS visit_start_date, ROWNUM AS resultnums\n" + + "\tFROM (\n" + + "\t\tSELECT *\n" + + "\t\tFROM (\n" + + "\t\t\tSELECT resulttable.*, viewtable.*, area.full_area_name AS area_name, d.full_name AS master_dept_name\n" + + "\t\t\tFROM resulttable, (\n" + + "\t\t\t\tSELECT COUNT(1) AS resultcount\n" + + "\t\t\t\tFROM resulttable\n" + + "\t\t\t) viewtable, tcc_cust.tcc_cust_area_info_v area, tcc_fnd.tcc_fnd_depts_v d\n" + + "\t\t\tWHERE resulttable.area_id = area.area_id(+)\n" + + "\t\t\t\tAND resulttable.master_dept_id = d.dept_id(+)\n" + + "\t\t\tORDER BY resulttable.creation_time DESC, resulttable.visitstsrtdate\n" + + "\t\t)\n" + + "\t) result\n" + + ") lasttab\n" + + "WHERE resultnums > :3\n" + + "\tAND resultnums <= :4", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +}