From 597383d6af414a9d41e65f9fdeef307735948207 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 21 Jun 2011 15:40:25 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0SQL=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=BB=9F=E8=AE=A1SQL=E4=B8=AD?= =?UTF-8?q?=E6=89=80=E4=BD=BF=E7=94=A8=E7=9A=84=E8=A1=A8=E5=92=8C=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@268 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../mysql/visitor/MySqlSchemaStatVisitor.java | 8 +- .../mysql/bvt/visitor/MySqlResourceTest.java | 90 +++++++++++++++++++ .../visitor/MySqlSchemaStatVisitorTest1.java | 28 ++++++ 3 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlResourceTest.java 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 28e98bd350..510c6d638b 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 @@ -354,8 +354,8 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter { } public int hashCode() { - int tableHashCode = table != null ? table.hashCode() : 0; - int nameHashCode = name != null ? name.hashCode() : 0; + int tableHashCode = table != null ? table.toLowerCase().hashCode() : 0; + int nameHashCode = name != null ? name.toLowerCase().hashCode() : 0; return tableHashCode + nameHashCode; } @@ -376,7 +376,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter { return false; } } else { - if (!table.equals(column.getTable())) { + if (!table.equalsIgnoreCase(column.getTable())) { return false; } } @@ -386,7 +386,7 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter { return false; } } else { - if (!name.equals(column.getName())) { + if (!name.equalsIgnoreCase(column.getName())) { return false; } } diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlResourceTest.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlResourceTest.java new file mode 100644 index 0000000000..49aea86a73 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlResourceTest.java @@ -0,0 +1,90 @@ +package com.alibaba.druid.sql.mysql.bvt.visitor; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +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.dialect.mysql.visitor.MySqlParameterizedOutputVisitor; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.util.JdbcUtils; + +public class MySqlResourceTest extends TestCase { + + public void test_0() throws Exception { + exec_test("bvt/parser/mysql-0.txt"); + exec_test("bvt/parser/mysql-1.txt"); + exec_test("bvt/parser/mysql-2.txt"); + exec_test("bvt/parser/mysql-3.txt"); + exec_test("bvt/parser/mysql-4.txt"); + exec_test("bvt/parser/mysql-5.txt"); + exec_test("bvt/parser/mysql-6.txt"); + exec_test("bvt/parser/mysql-7.txt"); + exec_test("bvt/parser/mysql-8.txt"); + exec_test("bvt/parser/mysql-9.txt"); + exec_test("bvt/parser/mysql-10.txt"); + } + + public void exec_test(String resource) throws Exception { + System.out.println(resource); + InputStream is = null; + + is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); + Reader reader = new InputStreamReader(is, "UTF-8"); + String input = JdbcUtils.read(reader); + JdbcUtils.close(reader); + String[] items = input.split("---------------------------"); + String sql = items[0].trim(); + String expect = items[1].trim(); + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + System.out.println(); + System.out.println(); + } + + void mergValidate(String sql, String expect) { + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + StringBuilder out = new StringBuilder(); + MySqlParameterizedOutputVisitor visitor = new MySqlParameterizedOutputVisitor(out); + statemen.accept(visitor); + + System.out.println(out.toString()); + + Assert.assertEquals(expect, out.toString()); + } + + private String output(List stmtList) { + StringBuilder out = new StringBuilder(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(out); + + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + + return out.toString(); + } +} diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest1.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest1.java index dd391d5839..262fe00dbd 100644 --- a/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest1.java +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest1.java @@ -39,4 +39,32 @@ public class MySqlSchemaStatVisitorTest1 extends TestCase { Assert.assertEquals(true, visitor.getFields().contains(new Column("usergroups", "name"))); } + + public void test_1() throws Exception { + String sql = "select a.name, b.name FROM users a, usergroups b on a.groupId = b.id where a.groupID = ?"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + Assert.assertEquals(true, visitor.getTables().containsKey("usergroups")); + + Assert.assertEquals(4, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "groupId"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("usergroups", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("usergroups", "name"))); + + } }