From 9df6894d839dbf766610969228469beb130381e3 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 2 Aug 2017 09:33:24 +0800 Subject: [PATCH] bug fixed for sql parser. --- .../java/com/alibaba/druid/sql/SQLUtils.java | 2 +- .../druid/sql/ast/statement/SQLUnique.java | 10 +- .../mysql/visitor/MySqlSchemaStatVisitor.java | 15 +-- .../sql/visitor/SQLASTOutputVisitor.java | 11 +- .../druid/sql/visitor/SchemaStatVisitor.java | 3 + .../java/com/alibaba/druid/util/Utils.java | 19 +++ .../drop/MySqlDropTableTest_1_hints.java | 56 +++++++++ .../sql/mysql/select/MySqlSelectTest_30.java | 4 +- .../DesensitizationTest_createView.java | 2 +- .../sql/oracle/select/OracleSelectTest71.java | 114 ------------------ .../druid/bvt/utils/Fnv64_lower_test.java | 2 + .../java/com/alibaba/druid/test/FNVTest.java | 45 +++++++ 12 files changed, 151 insertions(+), 132 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/drop/MySqlDropTableTest_1_hints.java delete mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java create mode 100644 src/test/java/com/alibaba/druid/test/FNVTest.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index fa68407eba..621bd3600a 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -915,7 +915,7 @@ public class SQLUtils { } tableName = normalize(tableName); - long hash = Utils.fnv_64_lower(tableName); + long hash = Utils.fnv_32_lower(tableName); return Utils.hex_t(hash); } 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 017410a60c..9dd4702d74 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 @@ -37,10 +37,18 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, } public void addColumn(SQLExpr column) { + if (column == null) { + return; + } + + addColumn(new SQLSelectOrderByItem(column)); + } + + public void addColumn(SQLSelectOrderByItem column) { if (column != null) { column.setParent(this); } - this.columns.add(new SQLSelectOrderByItem(column)); + this.columns.add(column); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 1f485c093b..deee382f29 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -21,15 +21,7 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; -import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; -import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; @@ -257,8 +249,9 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlPrimaryKey x) { - for (SQLObject item : x.getColumns()) { - item.accept(this); + for (SQLSelectOrderByItem item : x.getColumns()) { + SQLExpr expr = item.getExpr(); + expr.accept(this); } return false; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 7923d190d5..dee4f6713f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1764,10 +1764,17 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } public boolean visit(SQLDropTableStatement x) { + print0(ucase ? "DROP " : "drop "); + List hints = x.getHints(); + if (hints != null) { + printAndAccept(hints, " "); + print(' '); + }; + if (x.isTemporary()) { - print0(ucase ? "DROP TEMPORARY TABLE " : "drop temporary table "); + print0(ucase ? "TEMPORARY TABLE " : "temporary table "); } else { - print0(ucase ? "DROP TABLE " : "drop table "); + print0(ucase ? "TABLE " : "table "); } if (x.isIfExists()) { 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 870221d3c6..cf1b19157e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -1056,6 +1056,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } if (column != null) { SQLObject parent = x.getParent(); + if (parent instanceof SQLSelectOrderByItem) { + parent = parent.getParent(); + } if (parent instanceof SQLPrimaryKey) { column.setPrimaryKey(true); } else if (parent instanceof SQLUnique) { diff --git a/src/main/java/com/alibaba/druid/util/Utils.java b/src/main/java/com/alibaba/druid/util/Utils.java index fcb561e4eb..e5a733977d 100644 --- a/src/main/java/com/alibaba/druid/util/Utils.java +++ b/src/main/java/com/alibaba/druid/util/Utils.java @@ -442,6 +442,25 @@ public class Utils { return hashCode; } + public static long fnv_32_lower(String key) { + long hashCode = 0x811c9dc5; + for (int i = 0; i < key.length(); ++i) { + char ch = key.charAt(i); + if (ch == '_' || ch == '-') { + continue; + } + + if (ch >= 'A' && ch <= 'Z') { + ch = (char) (ch + 32); + } + + hashCode ^= ch; + hashCode *= 0x01000193; + } + + return hashCode; + } + public static void loadFromFile(String path, Set set) { InputStream is = null; BufferedReader reader = null; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/drop/MySqlDropTableTest_1_hints.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/drop/MySqlDropTableTest_1_hints.java new file mode 100644 index 0000000000..e990ae912c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/drop/MySqlDropTableTest_1_hints.java @@ -0,0 +1,56 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql.drop; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import org.junit.Assert; + +import java.util.List; + +public class MySqlDropTableTest_1_hints extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `temp_bond_keys`.`temp_bond_key_id`;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); +// print(statementList); + + assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("temp_bond_keys.temp_bond_key_id"))); + + assertEquals("DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `temp_bond_keys`.`temp_bond_key_id`;", stmt.toString()); +// assertTrue(visitor.getColumns().contains(new Column("mytable", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_30.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_30.java index d3d91eecc4..436e603b2f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_30.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_30.java @@ -55,14 +55,14 @@ public class MySqlSelectTest_30 extends MysqlTest { String output = SQLUtils.toMySqlString(stmt); Assert.assertEquals("SELECT name" + "\nFROM tab1" - + "\nFOR UPDATE NO_WAIT", // + + "\nFOR UPDATE NOWAIT", // output); } { String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); Assert.assertEquals("select name" + "\nfrom tab1" - + "\nfor update no_wait", // + + "\nfor update nowait", // output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createView.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createView.java index 0defc7b991..6b17e18663 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createView.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createView.java @@ -28,7 +28,7 @@ public class DesensitizationTest_createView extends TestCase { System.out.println("-------------------"); System.out.println(desens_Sql); - assertEquals("CREATE VIEW T_14856F0E5B66E911\n" + + assertEquals("CREATE VIEW T_0E06E66B87C28B46\n" + "AS\n" + "SELECT suppliers.supplier_id, orders.quantity, orders.price\n" + "FROM T_126BF2439561E30E\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java deleted file mode 100644 index 419e0e44dc..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest71.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 1999-2017 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.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 OracleSelectTest71 extends OracleTest { - - public void test_0() throws Exception { - String sql = // - "/* SQL Analyze(130,1) *\n" + - "SELECT *\n" + - "FROM (\n" + - "\tSELECT pohjxx_czr0_.RYNBID AS RYNBID, pohjxx_czr0_.RYID AS RYID, pohjxx_czr0_.HHNBID AS HHNBID, pohjxx_czr0_.HHID AS HHID, pohjxx_czr0_.MLPNBID AS MLPNBID\n" + - "\t\t, pohjxx_czr0_.MLPID AS MLPID, pohjxx_czr0_.ZPID AS ZPID, pohjxx_czr0_.NBSFZID AS NBSFZID, pohjxx_czr0_.GMSFHM AS GMSFHM, pohjxx_czr0_.XM AS XM\n" + - "\t\t, pohjxx_czr0_.X AS X, pohjxx_czr0_.M AS M, pohjxx_czr0_.CYM AS CYM, pohjxx_czr0_.XMPY AS XMPY, pohjxx_czr0_.CYMPY AS CYMPY\n" + - "\t\t, pohjxx_czr0_.XB AS XB, pohjxx_czr0_.MZ AS MZ, pohjxx_czr0_.CSRQ AS CSRQ, pohjxx_czr0_.CSSJ AS CSSJ, pohjxx_czr0_.CSDGJDQ AS CSDGJDQ\n" + - "\t\t, pohjxx_czr0_.CSDSSXQ AS CSDSSXQ, pohjxx_czr0_.CSDXZ AS CSDXZ, pohjxx_czr0_.CSZMBH AS CSZMBH, pohjxx_czr0_.CSZQFRQ AS CSZQFRQ, pohjxx_czr0_.JGGJDQ AS JGGJDQ\n" + - "\t\t, pohjxx_czr0_.JGSSXQ AS JGSSXQ, pohjxx_czr0_.JGXZ AS JGXZ, pohjxx_czr0_.JHRYGMSFHM AS JHRYGMSFHM, pohjxx_czr0_.JHRYXM AS JHRYXM, pohjxx_czr0_.JHRYCYZJDM AS JHRYCYZJDM\n" + - "\t\t, pohjxx_czr0_.JHRYZJHM AS JHRYZJHM, pohjxx_czr0_.JHRYWWX AS JHRYWWX, pohjxx_czr0_.JHRYWWM AS JHRYWWM, pohjxx_czr0_.JHRYJHGX AS JHRYJHGX, pohjxx_czr0_.JHRYLXDH AS JHRYLXDH\n" + - "\t\t, pohjxx_czr0_.JHREGMSFHM AS JHREGMSFHM, pohjxx_czr0_.JHREXM AS JHREXM, pohjxx_czr0_.JHRECYZJDM AS JHRECYZJDM, pohjxx_czr0_.JHREZJHM AS JHREZJHM, pohjxx_czr0_.JHREWWX AS JHREWWX\n" + - "\t\t, pohjxx_czr0_.JHREWWM AS JHREWWM, pohjxx_czr0_.JHREJHGX AS JHREJHGX, pohjxx_czr0_.JHRELXDH AS JHRELXDH, pohjxx_czr0_.FQGMSFHM AS FQGMSFHM, pohjxx_czr0_.FQXM AS FQXM\n" + - "\t\t, pohjxx_czr0_.FQCYZJDM AS FQCYZJDM, pohjxx_czr0_.FQZJHM AS FQZJHM, pohjxx_czr0_.FQWWX AS FQWWX, pohjxx_czr0_.FQWWM AS FQWWM, pohjxx_czr0_.MQGMSFHM AS MQGMSFHM\n" + - "\t\t, pohjxx_czr0_.MQXM AS MQXM, pohjxx_czr0_.MQCYZJDM AS MQCYZJDM, pohjxx_czr0_.MQZJHM AS MQZJHM, pohjxx_czr0_.MQWWX AS MQWWX, pohjxx_czr0_.MQWWM AS MQWWM\n" + - "\t\t, pohjxx_czr0_.POGMSFHM AS POGMSFHM, pohjxx_czr0_.POXM AS POXM, pohjxx_czr0_.POCYZJDM AS POCYZJDM, pohjxx_czr0_.POZJHM AS POZJHM, pohjxx_czr0_.POWWX AS POWWX\n" + - "\t\t, pohjxx_czr0_.POWWM AS POWWM, pohjxx_czr0_.ZJXY AS ZJXY, pohjxx_czr0_.WHCD AS WHCD, pohjxx_czr0_.HYZK AS HYZK, pohjxx_czr0_.BYZK AS BYZK\n" + - "\t\t, pohjxx_czr0_.SG AS SG, pohjxx_czr0_.XX AS XX, pohjxx_czr0_.DHHM AS DHHM, pohjxx_czr0_.DHHM2 AS DHHM2, pohjxx_czr0_.CYZKDWBM AS CYZKDWBM\n" + - "\t\t, pohjxx_czr0_.CYZKDWMC AS CYZKDWMC, pohjxx_czr0_.ZY AS ZY, pohjxx_czr0_.ZYLB AS ZYLB, pohjxx_czr0_.FWCS AS FWCS, pohjxx_czr0_.XXJB AS XXJB\n" + - "\t\t, pohjxx_czr0_.HSQL AS HSQL, pohjxx_czr0_.HYQL AS HYQL, pohjxx_czr0_.HQYLDYY AS HQYLDYY, pohjxx_czr0_.HGJDQQL AS HGJDQQL, pohjxx_czr0_.HSSXQQL AS HSSXQQL\n" + - "\t\t, pohjxx_czr0_.HXZQL AS HXZQL, pohjxx_czr0_.HSLBZ AS HSLBZ, pohjxx_czr0_.HYLBZ AS HYLBZ, pohjxx_czr0_.HQYLDYYLBZ AS HQYLDYYLBZ, pohjxx_czr0_.HGJDQLBZ AS HGJDQLBZ\n" + - "\t\t, pohjxx_czr0_.HSSSQLBZ AS HSSSQLBZ, pohjxx_czr0_.HXZLBZ AS HXZLBZ, pohjxx_czr0_.SWRQ AS SWRQ, pohjxx_czr0_.SWZXLB AS SWZXLB, pohjxx_czr0_.SWYY AS SWYY\n" + - "\t\t, pohjxx_czr0_.SWZXRQ AS SWZXRQ, pohjxx_czr0_.QCRQ AS QCRQ, pohjxx_czr0_.QCZXLB AS QCZXLB, pohjxx_czr0_.QCQYLDYY AS QCQYLDYY, pohjxx_czr0_.QWDGJDQ AS QWDGJDQ\n" + - "\t\t, pohjxx_czr0_.QWDSSXQ AS QWDSSXQ, pohjxx_czr0_.QWDXZ AS QWDXZ, pohjxx_czr0_.BDFW AS BDFW, pohjxx_czr0_.RYLB AS RYLB, pohjxx_czr0_.RYZT AS RYZT\n" + - "\t\t, pohjxx_czr0_.RYSDZT AS RYSDZT, pohjxx_czr0_.LXDBID AS LXDBID, pohjxx_czr0_.JLBZ AS JLBZ, pohjxx_czr0_.YWNR AS YWNR, pohjxx_czr0_.CJHJYWID AS CJHJYWID\n" + - "\t\t, pohjxx_czr0_.CCHJYWID AS CCHJYWID, pohjxx_czr0_.QYSJ AS QYSJ, pohjxx_czr0_.JSSJ AS JSSJ, pohjxx_czr0_.CXBZ AS CXBZ, pohjxx_czr0_.XXQYSJ AS XXQYSJ\n" + - "\t\t, pohjxx_czr0_.ZXSJ AS ZXSJ, pohjxx_czr0_.GXSJ AS GXSJ, pohjxx_czr0_.SJGSDWDM AS SJGSDWDM, pohjxx_czr0_.SJGSDWMC AS SJGSDWMC, pohjxx_czr0_.HYLB AS HYLB\n" + - "\t\t, pohjxx_czr0_.BZ AS BZ, pohjxx_czr0_.SSXQ AS SSXQ, pohjxx_czr0_.JLX AS JLX, pohjxx_czr0_.MLPH AS MLPH, pohjxx_czr0_.MLXZ AS MLXZ\n" + - "\t\t, pohjxx_czr0_.PCS AS PCS, pohjxx_czr0_.ZRQ AS ZRQ, pohjxx_czr0_.XZJD AS XZJD, pohjxx_czr0_.JCWH AS JCWH, pohjxx_czr0_.PXH AS PXH\n" + - "\t\t, pohjxx_czr0_.HB AS HB, pohjxx_czr0_.HH AS HH, pohjxx_czr0_.HLX AS HLX, pohjxx_czr0_.YHZGX AS YHZGX, pohjxx_czr0_.QTSSXQ AS QTSSXQ\n" + - "\t\t, pohjxx_czr0_.QTZZ AS QTZZ, pohjxx_czr0_.XZDCJZT AS XZDCJZT, pohjxx_czr0_.HJDDZBM AS HJDDZBM, pohjxx_czr0_.HJDSSXQ AS HJDSSXQ, pohjxx_czr0_.HJDXXDZ AS HJDXXDZ\n" + - "\t\t, pohjxx_czr0_.HJDRHYZBS AS HJDRHYZBS, pohjxx_czr0_.JZDDZBM AS JZDDZBM, pohjxx_czr0_.JZDSSXQ AS JZDSSXQ, pohjxx_czr0_.JZDXXDZ AS JZDXXDZ, pohjxx_czr0_.QFJG AS QFJG\n" + - "\t\t, pohjxx_czr0_.YXQXQSRQ AS YXQXQSRQ, pohjxx_czr0_.YXQXJZRQ AS YXQXJZRQ, pohjxx_czr0_.ZJDZ AS ZJDZ, pohjxx_czr0_.ZJLB AS ZJLB, pohjxx_czr0_.ZWYZW AS ZWYZW\n" + - "\t\t, pohjxx_czr0_.ZWYZCJG AS ZWYZCJG, pohjxx_czr0_.ZWEZW AS ZWEZW, pohjxx_czr0_.ZWEZCJG AS ZWEZCJG, pohjxx_czr0_.ZWCJJGDM AS ZWCJJGDM, pohjxx_czr0_.SZYCZKDM AS SZYCZKDM\n" + - "\t\t, pohjxx_czr0_.DJZT AS DJZT, pohjxx_czr0_.DJSJ AS DJSJ, pohjxx_czr0_.DJYY AS DJYY, pohjxx_czr0_.JCDJSJ AS JCDJSJ, pohjxx_czr0_.HKDJID AS HKDJID\n" + - "\t\t, pohjxx_czr0_.TJYXZQH AS TJYXZQH, pohjxx_czr0_.CXSX AS CXSX\n" + - "\tFROM TB_001 pohjxx_czr0_\n" + - "\tWHERE 1 = 1\n" + - "\t\tAND (pohjxx_czr0_.CSRQ = ?\n" + - "\t\t\tAND pohjxx_czr0_.JLBZ = ?\n" + - "\t\t\tAND ryzt = ?\n" + - "\t\t\tAND pohjxx_czr0_.CXBZ = ?\n" + - "\t\t\tAND 1 = 1)\n" + - ")\n" + - "WHERE rownum <= :1"; // - - OracleStatementParser parser = new OracleStatementParser(sql); - List statementList = parser.parseStatementList(); - assertEquals(1, statementList.size()); - 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(3, visitor.getTables().size()); - - assertEquals(8, visitor.getColumns().size()); - - { - String text = SQLUtils.toOracleString(stmt); - - assertEquals("SELECT CAST(a.nsrdzdah AS char)\n" + - "FROM DJ_NSRXX_DZB a\n" + - "INNER JOIN DJ_NSRXX b ON a.nsrdzdah = b.nsrdzdah \n" + - "\tINNER JOIN DM_SWJG c ON b.nsr_swjg_dm = c.swjg_dm \n" + - "WHERE (a.nsrsbh_old = ?\n" + - "\t\tOR a.nsrsbh_new = ?)\n" + - "\tAND b.nsrzt_dm <= ?\n" + - "\tAND c.JBDM LIKE ?\n" + - "\tAND rownum = 1", 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/utils/Fnv64_lower_test.java b/src/test/java/com/alibaba/druid/bvt/utils/Fnv64_lower_test.java index 21b3db6ded..c55e3c9e8c 100644 --- a/src/test/java/com/alibaba/druid/bvt/utils/Fnv64_lower_test.java +++ b/src/test/java/com/alibaba/druid/bvt/utils/Fnv64_lower_test.java @@ -10,5 +10,7 @@ public class Fnv64_lower_test extends TestCase { public void test_fnv_lower() throws Exception { assertEquals(Utils.fnv_64_lower("Id"), Utils.fnv_64_lower("ID")); assertEquals(Utils.fnv_64_lower("id"), Utils.fnv_64_lower("ID")); + + System.out.println(Long.toHexString(Utils.fnv_64("druid"))); } } diff --git a/src/test/java/com/alibaba/druid/test/FNVTest.java b/src/test/java/com/alibaba/druid/test/FNVTest.java new file mode 100644 index 0000000000..9a14ae69ab --- /dev/null +++ b/src/test/java/com/alibaba/druid/test/FNVTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.test; + +import junit.framework.TestCase; + +/** + * Created by wenshao on 28/07/2017. + */ +public class FNVTest extends TestCase { + public void test_fnv_32() throws Exception { + System.out.println(" 0x811c9dc5 : " + 0x811c9dc5); + long x = 0xcbf29ce484222325L; + System.out.println(x); + System.out.println(x << 2); + +// 14695981039346656037 + } + + public long fnv(String text) { + long hash = 0x811c9dc5; + for (int i = 0, len = text.length(); i < len; ++i) { + char ch = text.charAt(i); + + hash ^= ch; + hash *= 0x1000193; + } + + return hash; + } + + public long fnv_64( String text) { + long hash = 0xcbf29ce484222325L; + return fnv_64(hash, text); + } + + public long fnv_64(long hash, String text) { + for (int i = 0, len = text.length(); i < len; ++i) { + char ch = text.charAt(i); + + hash *= 0x100000001b3L; + hash ^= ch; + } + + return hash; + } +}