From edb44c2a7afb46dd6758eb1ce4c46c9feea602cc Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 20 Sep 2011 03:02:25 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3Dblink=E9=97=AE=E9=A2=98?= 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@880 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../oracle/ast/expr/OracleDbLinkExpr.java | 3 +- .../visitor/OracleSchemaStatVisitor.java | 10 +++-- .../OracleOutputVisitorTest_Aggregate.java | 7 ++-- .../OracleOutputVisitorTest_dblink.java | 40 +++++++++++++++++++ 4 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_dblink.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java index 3ad8fa8b8b..18c205858a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java @@ -17,10 +17,11 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class OracleDbLinkExpr extends SQLExprImpl { +public class OracleDbLinkExpr extends SQLExprImpl implements SQLName { private static final long serialVersionUID = 1L; private SQLExpr expr; 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 0078d3dc70..fe46090dc3 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 @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; @@ -94,8 +95,9 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { } public boolean visit(OracleSelectTableReference x) { - if (x.getExpr() instanceof SQLName) { - String ident = ((SQLName) x.getExpr()).toString(); + SQLExpr expr = x.getExpr(); + if (expr instanceof SQLName) { + String ident = ((SQLName) expr).toString(); TableStat stat = tableStats.get(ident); if (stat == null) { stat = new TableStat(); @@ -355,8 +357,8 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { if (x.getFrom() instanceof SQLExprTableSource) { SQLExprTableSource tableSource = (SQLExprTableSource) x.getFrom(); - if (tableSource.getExpr() instanceof SQLIdentifierExpr) { - String ident = ((SQLIdentifierExpr) tableSource.getExpr()).getName(); + if (tableSource.getExpr() instanceof SQLName) { + String ident = ((SQLName) tableSource.getExpr()).toString(); currentTableLocal.set(ident); x.putAttribute("_old_local_", originalTable); } diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_Aggregate.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_Aggregate.java index e76a6f49ce..b4598c9de1 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_Aggregate.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_Aggregate.java @@ -14,7 +14,7 @@ import com.alibaba.druid.stat.TableStat.Column; public class OracleOutputVisitorTest_Aggregate extends TestCase { public void test_0() throws Exception { - String sql = "SELECT MAX(salary) from emp"; + String sql = "SELECT MAX(salary) from emp where F1 = Date '2011-10-01'"; OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); @@ -28,13 +28,14 @@ public class OracleOutputVisitorTest_Aggregate extends TestCase { Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(true, visitor.containsTable("emp")); - Assert.assertEquals(1, visitor.getFields().size()); + Assert.assertEquals(2, visitor.getFields().size()); Assert.assertEquals(true, visitor.getFields().contains(new Column("emp", "salary"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("emp", "F1"))); StringBuilder buf = new StringBuilder(); OracleOutputVisitor outputVisitor = new OracleOutputVisitor(buf); stmt.accept(outputVisitor); - Assert.assertEquals("SELECT MAX(salary)\nFROM emp;\n", buf.toString()); + Assert.assertEquals("SELECT MAX(salary)\nFROM emp\nWHERE F1 = DATE '2011-10-01';\n", buf.toString()); } } diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_dblink.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_dblink.java new file mode 100644 index 0000000000..d017c8e3cc --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleOutputVisitorTest_dblink.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.oracle.bvt.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.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + + +public class OracleOutputVisitorTest_dblink extends TestCase { + public void test_0() throws Exception { + String sql = "SELECT salary from master@emp"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.containsTable("master@emp")); + + Assert.assertEquals(1, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("master@emp", "salary"))); + + StringBuilder buf = new StringBuilder(); + OracleOutputVisitor outputVisitor = new OracleOutputVisitor(buf); + stmt.accept(outputVisitor); + Assert.assertEquals("SELECT salary\nFROM master@emp;\n", buf.toString()); + + } +}