From fae4f442391af977f9c67067a00ebe810e6e0464 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 19 Jun 2017 16:54:04 +0800 Subject: [PATCH] sql desensitize support. --- .../java/com/alibaba/druid/sql/SQLUtils.java | 26 +++- .../ast/statement/SQLCreateViewStatement.java | 27 ++++- .../sql/visitor/SQLASTOutputVisitor.java | 33 ++++- .../druid/sql/visitor/SchemaStatVisitor.java | 31 ++++- .../java/com/alibaba/druid/util/Utils.java | 113 ++++++++++++++++++ .../sql/MySqlPerfMain_schemaStat.java | 84 +++++++++++++ .../filter/wall/mysql/MySqlWallTest87.java | 2 +- .../bvt/sql/oracle/DesensitizationTest.java | 44 +++++++ .../DesensitizationTest_createTable.java | 33 +++++ .../DesensitizationTest_createView.java | 46 +++++++ .../oracle/DesensitizationTest_delete.java | 27 +++++ .../oracle/DesensitizationTest_insert.java | 32 +++++ .../oracle/DesensitizationTest_update.java | 29 +++++ .../druid/bvt/utils/Fnv64_lower_test.java | 14 +++ 14 files changed, 525 insertions(+), 16 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/benckmark/sql/MySqlPerfMain_schemaStat.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createTable.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createView.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_delete.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_insert.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_update.java create mode 100644 src/test/java/com/alibaba/druid/bvt/utils/Fnv64_lower_test.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index ec5fa1d5ad..070993d5cf 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -15,11 +15,9 @@ */ package com.alibaba.druid.sql; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLReplaceable; @@ -277,8 +275,9 @@ public class SQLUtils { option = DEFAULT_FORMAT_OPTION; } visitor.setUppCase(option.isUppCase()); - visitor.setPrettyFormat(option.isPrettyFormat()); - visitor.setParameterized(option.isParameterized()); + visitor.setPrettyFormat(option.prettyFormat); + visitor.setParameterized(option.parameterized); + visitor.setDesensitize(option.desensitize); if (tableMapping != null) { visitor.setTableMapping(tableMapping); @@ -630,6 +629,7 @@ public class SQLUtils { private boolean ucase = true; private boolean prettyFormat = true; private boolean parameterized = false; + private boolean desensitize = false; public FormatOption() { @@ -649,6 +649,14 @@ public class SQLUtils { this.parameterized = parameterized; } + public boolean isDesensitize() { + return desensitize; + } + + public void setDesensitize(boolean desensitize) { + this.desensitize = desensitize; + } + public boolean isUppCase() { return ucase; } @@ -865,5 +873,15 @@ public class SQLUtils { return false; } + + public static String desensitizeTable(String tableName) { + if (tableName == null) { + return null; + } + + tableName = normalize(tableName); + long hash = Utils.fnv_64_lower(tableName); + return Utils.hex_t(hash); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java index 7d61109a63..290ecf17b1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java @@ -30,7 +30,7 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt private boolean orReplace = false; private boolean force = false; - protected SQLName name; + // protected SQLName name; protected SQLSelect subQuery; protected boolean ifNotExists = false; @@ -38,6 +38,8 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt protected SQLName definer; protected String sqlSecurity; + protected SQLExprTableSource tableSource; + protected final List columns = new ArrayList(); private Level with; @@ -61,11 +63,26 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt } public SQLName getName() { - return name; + if (tableSource == null) { + return null; + } + + return (SQLName) tableSource.getExpr(); } public void setName(SQLName name) { - this.name = name; + this.setTableSource(new SQLExprTableSource(name)); + } + + public SQLExprTableSource getTableSource() { + return tableSource; + } + + public void setTableSource(SQLExprTableSource tableSource) { + if (tableSource != null) { + tableSource.setParent(this); + } + this.tableSource = tableSource; } public Level getWith() { @@ -151,7 +168,7 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt public void output(StringBuffer buf) { buf.append("CREATE VIEW "); - this.name.output(buf); + this.getName().output(buf); if (this.columns.size() > 0) { buf.append(" ("); @@ -176,7 +193,7 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, this.name); + acceptChild(visitor, this.tableSource); acceptChild(visitor, this.columns); acceptChild(visitor, this.comment); acceptChild(visitor, this.subQuery); 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 8f39140342..e6ad078901 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -24,6 +24,7 @@ import java.sql.NClob; import java.text.SimpleDateFormat; import java.util.*; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; @@ -69,6 +70,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet protected transient int lines = 0; + protected boolean desensitize = false; + public SQLASTOutputVisitor(Appendable appender){ this.appender = appender; } @@ -118,6 +121,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return parameters; } + public boolean isDesensitize() { + return desensitize; + } + + public void setDesensitize(boolean desensitize) { + this.desensitize = desensitize; + } + public Set getTables() { return this.tables; } @@ -1423,6 +1434,26 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet addTable(expr.toString()); } + if (desensitize) { + SQLExpr owner = null; + String ident = null; + if (expr instanceof SQLIdentifierExpr) { + ident = ((SQLIdentifierExpr) expr).getName(); + } else if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; + propertyExpr.getOwner().accept(this); + print('.'); + + ident = propertyExpr.getName(); + } + + if (ident != null) { + String desensitizeTable = SQLUtils.desensitizeTable(ident); + print0(desensitizeTable); + return; + } + } + if (tableMapping != null && expr instanceof SQLName) { String tableName = expr.toString(); @@ -2446,7 +2477,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print0(ucase ? "IF NOT EXISTS " : "if not exists "); } - x.getName().accept(this); + x.getTableSource().accept(this); if (x.getColumns().size() > 0) { println(); 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 e9fee8a17a..86d4348d46 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -426,7 +426,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return true; } - switch (x.getOperator()) { + final SQLBinaryOperator op = x.getOperator(); + final SQLExpr left = x.getLeft(); + final SQLExpr right = x.getRight(); + + switch (op) { case Equality: case NotEqual: case GreaterThan: @@ -439,15 +443,32 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { case NotLike: case Is: case IsNot: - handleCondition(x.getLeft(), x.getOperator().name, x.getRight()); - handleCondition(x.getRight(), x.getOperator().name, x.getLeft()); + handleCondition(left, x.getOperator().name, right); + handleCondition(right, x.getOperator().name, left); - handleRelationship(x.getLeft(), x.getOperator().name, x.getRight()); + handleRelationship(left, x.getOperator().name, right); break; + case BooleanOr:{ + List list = SQLBinaryOpExpr.split(x, op); + + for (SQLExpr item : list) { + if (item instanceof SQLBinaryOpExpr) { + visit((SQLBinaryOpExpr) item); + } else { + item.accept(this); + } + } + + return false; + } default: break; } - return true; + + left.accept(this); + right.accept(this); + + return false; } protected void handleRelationship(SQLExpr left, String operator, SQLExpr right) { diff --git a/src/main/java/com/alibaba/druid/util/Utils.java b/src/main/java/com/alibaba/druid/util/Utils.java index 5b37b2833d..4bbb04f354 100644 --- a/src/main/java/com/alibaba/druid/util/Utils.java +++ b/src/main/java/com/alibaba/druid/util/Utils.java @@ -334,4 +334,117 @@ public class Utils { public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } + + public static String hex(int hash) { + byte[] bytes = new byte[4]; + + bytes[3] = (byte) (hash ); + bytes[2] = (byte) (hash >>> 8); + bytes[1] = (byte) (hash >>> 16); + bytes[0] = (byte) (hash >>> 24); + + + char[] chars = new char[8]; + for (int i = 0; i < 4; ++i) { + byte b = bytes[i]; + + int a = b & 0xFF; + int b0 = a >> 4; + int b1 = a & 0xf; + + chars[i * 2] = (char) (b0 + (b0 < 10 ? 48 : 55)); + chars[i * 2 + 1] = (char) (b1 + (b1 < 10 ? 48 : 55)); + } + + return new String(chars); + } + + public static String hex(long hash) { + byte[] bytes = new byte[8]; + + bytes[7] = (byte) (hash ); + bytes[6] = (byte) (hash >>> 8); + bytes[5] = (byte) (hash >>> 16); + bytes[4] = (byte) (hash >>> 24); + bytes[3] = (byte) (hash >>> 32); + bytes[2] = (byte) (hash >>> 40); + bytes[1] = (byte) (hash >>> 48); + bytes[0] = (byte) (hash >>> 56); + + char[] chars = new char[16]; + for (int i = 0; i < 8; ++i) { + byte b = bytes[i]; + + int a = b & 0xFF; + int b0 = a >> 4; + int b1 = a & 0xf; + + chars[i * 2] = (char) (b0 + (b0 < 10 ? 48 : 55)); + chars[i * 2 + 1] = (char) (b1 + (b1 < 10 ? 48 : 55)); + } + + return new String(chars); + } + + public static String hex_t(long hash) { + byte[] bytes = new byte[8]; + + bytes[7] = (byte) (hash ); + bytes[6] = (byte) (hash >>> 8); + bytes[5] = (byte) (hash >>> 16); + bytes[4] = (byte) (hash >>> 24); + bytes[3] = (byte) (hash >>> 32); + bytes[2] = (byte) (hash >>> 40); + bytes[1] = (byte) (hash >>> 48); + bytes[0] = (byte) (hash >>> 56); + + char[] chars = new char[18]; + chars[0] = 'T'; + chars[1] = '_'; + for (int i = 0; i < 8; ++i) { + byte b = bytes[i]; + + int a = b & 0xFF; + int b0 = a >> 4; + int b1 = a & 0xf; + + chars[i * 2 + 2] = (char) (b0 + (b0 < 10 ? 48 : 55)); + chars[i * 2 + 3] = (char) (b1 + (b1 < 10 ? 48 : 55)); + } + + return new String(chars); + } + + public static long fnv_64(String input) { + if (input == null) { + return 0; + } + + long hash = 0x811c9dc5; + for (int i = 0; i < input.length(); ++i) { + char c = input.charAt(i); + hash ^= c; + hash *= 0x1000193; + } + + return hash; + } + + public static long fnv_64_lower(String input) { + if (input == null) { + return 0; + } + + long hash = 0x811c9dc5; + for (int i = 0; i < input.length(); ++i) { + char c = input.charAt(i); + if (c >= 'A' && c <= 'Z') { + c += 32; + } + hash ^= c; + hash *= 0x1000193; + } + + return hash; + } } diff --git a/src/test/java/com/alibaba/druid/benckmark/sql/MySqlPerfMain_schemaStat.java b/src/test/java/com/alibaba/druid/benckmark/sql/MySqlPerfMain_schemaStat.java new file mode 100644 index 0000000000..ef58bf4986 --- /dev/null +++ b/src/test/java/com/alibaba/druid/benckmark/sql/MySqlPerfMain_schemaStat.java @@ -0,0 +1,84 @@ +/* + * 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.benckmark.sql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; +import com.alibaba.druid.sql.test.TestUtils; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.util.Utils; + +import java.lang.management.ManagementFactory; +import java.util.List; + +public class MySqlPerfMain_schemaStat { + + public static void main(String[] args) throws Exception { + System.out.println(System.getProperty("java.vm.name") + " " + System.getProperty("java.runtime.version")); + List arguments = ManagementFactory.getRuntimeMXBean().getInputArguments(); + System.out.println(arguments); + + String sql = "select * from t "; + for (int i = 0; i < 300; ++i) { + if (i == 0) { + sql += " WHERE "; + } else { + sql += " OR "; + } + sql += (" id = " + i); + } + + for (int i = 0; i < 10; ++i) { + perfMySql(sql); + } + } + + static long perfMySql(String sql) { + long startYGC = TestUtils.getYoungGC(); + long startYGCTime = TestUtils.getYoungGCTime(); + long startFGC = TestUtils.getFullGC(); + + long startMillis = System.currentTimeMillis(); + for (int i = 0; i < 100 * 1; ++i) { + execMySql(sql); + } + long millis = System.currentTimeMillis() - startMillis; + + long ygc = TestUtils.getYoungGC() - startYGC; + long ygct = TestUtils.getYoungGCTime() - startYGCTime; + long fgc = TestUtils.getFullGC() - startFGC; + + System.out.println("MySql\t" + millis + ", ygc " + ygc + ", ygct " + ygct + ", fgc " + fgc); + return millis; + } + + static String execMySql(String sql) { + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + + for (SQLStatement stmt : statementList) { + stmt.accept(statVisitor); + } + // for (SQLStatement statement : statementList) { + // statement.accept(visitor); + // visitor.println(); + // } + return ""; + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest87.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest87.java index 93186d37e9..95f55ba400 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest87.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest87.java @@ -37,7 +37,7 @@ public class MySqlWallTest87 extends TestCase { Assert.assertTrue(provider.checkValid(// "CREATE VIEW test.v AS SELECT * FROM t;")); - Assert.assertEquals(1, provider.getTableStats().size()); + Assert.assertEquals(2, provider.getTableStats().size()); Assert.assertTrue(provider.getTableStats().containsKey("t")); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest.java new file mode 100644 index 0000000000..0545c0a72f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +public class DesensitizationTest extends TestCase { + public void test_for_desensitization() throws Exception { + String sql = "select id, name from mytable where id = 3"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("SELECT id, name\n" + + "FROM T_771DB81F525E1E75\n" + + "WHERE id = ?", desens_Sql); + } + + public void test_for_desensitization_1() throws Exception { + String sql = "select id, name from \"mytable\" where id = 3"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("SELECT id, name\n" + + "FROM T_771DB81F525E1E75\n" + + "WHERE id = ?", desens_Sql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createTable.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createTable.java new file mode 100644 index 0000000000..77ba5bb94d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createTable.java @@ -0,0 +1,33 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +public class DesensitizationTest_createTable extends TestCase { + public void test_for_desensitization() throws Exception { + String sql = "CREATE TABLE customers\n" + + "( customer_id number(10) NOT NULL,\n" + + " customer_name varchar2(50) NOT NULL,\n" + + " city varchar2(50)\n" + + ");"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("CREATE TABLE T_69BFC132C09344DE (\n" + + "\tcustomer_id number(10) NOT NULL,\n" + + "\tcustomer_name varchar2(50) NOT NULL,\n" + + "\tcity varchar2(50)\n" + + ");", desens_Sql); + } +} 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 new file mode 100644 index 0000000000..0defc7b991 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_createView.java @@ -0,0 +1,46 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by wenshao on 19/06/2017. + */ +public class DesensitizationTest_createView extends TestCase { + public void test_for_desensitization() throws Exception { + String sql = "CREATE VIEW sup_orders AS\n" + + " SELECT suppliers.supplier_id, orders.quantity, orders.price\n" + + " FROM suppliers\n" + + " INNER JOIN orders\n" + + " ON suppliers.supplier_id = orders.supplier_id\n" + + " WHERE suppliers.supplier_name = 'Microsoft';"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("CREATE VIEW T_14856F0E5B66E911\n" + + "AS\n" + + "SELECT suppliers.supplier_id, orders.quantity, orders.price\n" + + "FROM T_126BF2439561E30E\n" + + "\tINNER JOIN T_C5B90BBF325E96EC ON suppliers.supplier_id = orders.supplier_id \n" + + "WHERE suppliers.supplier_name = ?;", desens_Sql); + + Map tableMapping = new HashMap(); + tableMapping.put(SQLUtils.desensitizeTable("sup_orders"), "sup_orders"); + tableMapping.put(SQLUtils.desensitizeTable("suppliers"), "suppliers"); + + String restore_sql = SQLUtils.refactor(desens_Sql, JdbcConstants.ORACLE, tableMapping); + System.out.println("-------------------"); + System.out.println(restore_sql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_delete.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_delete.java new file mode 100644 index 0000000000..797dde6f8b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_delete.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +public class DesensitizationTest_delete extends TestCase { + public void test_for_desensitization() throws Exception { + String sql = "DELETE FROM customers\n" + + "WHERE last_name = 'Smith';"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("DELETE FROM T_69BFC132C09344DE\n" + + "WHERE last_name = ?;", desens_Sql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_insert.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_insert.java new file mode 100644 index 0000000000..48601c1f11 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_insert.java @@ -0,0 +1,32 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +public class DesensitizationTest_insert extends TestCase { + public void test_for_desensitization() throws Exception { + String sql = "INSERT INTO suppliers\n" + + "(supplier_id, supplier_name)\n" + + "SELECT account_no, name\n" + + "FROM customers\n" + + "WHERE customer_id > 5000;"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("INSERT INTO T_126BF2439561E30E (supplier_id, supplier_name)\n" + + "SELECT account_no, name\n" + + "FROM T_69BFC132C09344DE\n" + + "WHERE customer_id > ?;", desens_Sql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_update.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_update.java new file mode 100644 index 0000000000..47ad95c7fa --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/DesensitizationTest_update.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +public class DesensitizationTest_update extends TestCase { + public void test_for_desensitization() throws Exception { + String sql = "UPDATE customers\n" + + "SET last_name = 'Anderson'\n" + + "WHERE customer_id = 5000;"; + + SQLUtils.FormatOption option = new SQLUtils.FormatOption(); + option.setDesensitize(true); + option.setParameterized(true); + + String desens_Sql = SQLUtils.format(sql, JdbcConstants.ORACLE, option); + System.out.println(sql); + System.out.println("-------------------"); + System.out.println(desens_Sql); + + assertEquals("UPDATE T_69BFC132C09344DE\n" + + "SET last_name = ?\n" + + "WHERE customer_id = ?;", desens_Sql); + } +} 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 new file mode 100644 index 0000000000..21b3db6ded --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/utils/Fnv64_lower_test.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.utils; + +import com.alibaba.druid.util.Utils; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +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")); + } +}