From ec5ae21ecfd7b4f6be3f65da7c16f74be5741c67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 13 Feb 2012 15:24:11 +0800 Subject: [PATCH] bug fixed for MySqlSchemaStatVisitor & OracleSchemaStatVisitor --- .../mysql/visitor/MySqlSchemaStatVisitor.java | 4 +- .../visitor/OracleSchemaStatVisitor.java | 4 +- .../visitor/MySqlSchemaStatVisitorTest5.java | 45 +++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.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 4af00a6f7f..91d3ea5f11 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 @@ -47,8 +47,8 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter { } public boolean visit(SQLExprTableSource x) { - if (x.getExpr() instanceof SQLIdentifierExpr) { - String ident = ((SQLIdentifierExpr) x.getExpr()).getName(); + if (x.getExpr() instanceof SQLIdentifierExpr || x.getExpr() instanceof SQLPropertyExpr) { + String ident = x.getExpr().toString(); TableStat stat = tableStats.get(ident); if (stat == null) { stat = new TableStat(); 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 fe46090dc3..8cbd310b5e 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 @@ -54,8 +54,8 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { } public boolean visit(SQLExprTableSource x) { - if (x.getExpr() instanceof SQLName) { - String ident = ((SQLName) x.getExpr()).toString(); + if (x.getExpr() instanceof SQLIdentifierExpr || x.getExpr() instanceof SQLPropertyExpr) { + String ident = x.getExpr().toString(); TableStat stat = tableStats.get(ident); if (stat == null) { stat = new TableStat(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java new file mode 100644 index 0000000000..095efb5820 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlSchemaStatVisitorTest5.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.mysql.visitor; + +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.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlSchemaStatVisitorTest5 extends TestCase { + + public void test_0() throws Exception { + String sql = "SELECT distinct a.id \"id\", a.col \"col\", a.position \"position\", a.panel_id \"panelId\" " + + "FROM (select * from view_position_info) a LEFT JOIN db1.view_portal b ON a.panel_id = b.panel_id " + + " LEFT JOIN (select * from view_portal_panel) c ON a.panel_id = c.panel_id " + + " WHERE b.user_id = ? and ((b.is_grid='y' and c.param_name='is_hidden' and c.param_value='false') or b.is_grid != 'y') and b.user_id in (select user_id from table1 where id = 1) ORDER BY a.col ASC, a.position ASC"; + + 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(4, visitor.getTables().size()); + Assert.assertEquals(true, visitor.containsTable("view_position_info")); + + Assert.assertEquals(7, visitor.getFields().size()); + // Assert.assertEquals(true, visitor.getFields().contains(new + // Column("users", "id"))); + // Assert.assertEquals(true, visitor.getFields().contains(new + // Column("users", "name"))); + + } + +}