From b42fe2909de358a6c41313e3ae1f676477f8f215 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 22 Jun 2011 02:16:03 +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@273 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../ast/visitor/OracleSchemaStatVisitor.java | 53 +++++++++++++++---- .../visitor/OracleSchemaStatVisitorTest1.java | 6 ++- .../visitor/OracleSchemaStatVisitorTest2.java | 16 +++--- .../visitor/OracleSchemaStatVisitorTest3.java | 8 +-- .../visitor/OracleSchemaStatVisitorTest4.java | 8 +-- .../OracleSchemaStatVisitorTest_Update.java | 8 +-- 6 files changed, 66 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleSchemaStatVisitor.java index d4c5568e9d..abd456e53d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleSchemaStatVisitor.java @@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Mode; @@ -82,7 +83,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { return false; } - + public boolean visit(OracleSelectTableReference x) { if (x.getExpr() instanceof SQLIdentifierExpr) { String ident = ((SQLIdentifierExpr) x.getExpr()).getName(); @@ -91,7 +92,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { stat = new TableStat(); tableStats.put(ident, stat); } - + Mode mode = modeLocal.get(); switch (mode) { case Delete: @@ -109,7 +110,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { default: break; } - + Map aliasMap = aliasLocal.get(); if (aliasMap != null) { if (x.getAlias() != null) { @@ -118,7 +119,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { aliasMap.put(ident, ident); } } - + return false; } @@ -155,6 +156,36 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { aliasLocal.set(null); } + public boolean visit(OracleUpdateStatement x) { + aliasLocal.set(new HashMap()); + + if (x.getTable() instanceof SQLIdentifierExpr) { + String ident = x.getTable().toString(); + currentTableLocal.set(ident); + + TableStat stat = tableStats.get(ident); + if (stat == null) { + stat = new TableStat(); + tableStats.put(ident, stat); + } + stat.incrementUpdateCount(); + + Map aliasMap = aliasLocal.get(); + aliasMap.put(ident, ident); + } else { + accept(x.getTable()); + } + + accept(x.getSetClause()); + accept(x.getWhere()); + + return false; + } + + public void endVisit(OracleUpdateStatement x) { + aliasLocal.set(null); + } + public boolean visit(OracleDeleteStatement x) { return visit((SQLDeleteStatement) x); } @@ -162,7 +193,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { public void endVisit(OracleDeleteStatement x) { aliasLocal.set(null); } - + public boolean visit(SQLDeleteStatement x) { aliasLocal.set(new HashMap()); @@ -173,7 +204,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { String ident = ((SQLIdentifierExpr) x.getTableName()).getName(); currentTableLocal.set(ident); - + TableStat stat = tableStats.get(ident); if (stat == null) { stat = new TableStat(); @@ -285,13 +316,13 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { Mode originalMode = (Mode) x.getAttribute("_original_use_mode"); modeLocal.set(originalMode); } - + public boolean visit(OracleSelectQueryBlock x) { return visit((SQLSelectQueryBlock) x); } - + public void endVisit(OracleSelectQueryBlock x) { - endVisit((SQLSelectQueryBlock)x); + endVisit((SQLSelectQueryBlock) x); } public boolean visit(SQLJoinTableSource x) { @@ -302,7 +333,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { if ("ROWNUM".equalsIgnoreCase(x.getName())) { return false; } - + if (x.getOwner() instanceof SQLIdentifierExpr) { String owner = ((SQLIdentifierExpr) x.getOwner()).getName(); @@ -325,7 +356,7 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { if ("ROWNUM".equalsIgnoreCase(x.getName())) { return false; } - + String currentTable = currentTableLocal.get(); if (currentTable != null) { diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest1.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest1.java index 928af6fb66..9b35f82d95 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest1.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest1.java @@ -8,6 +8,8 @@ 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.sql.dialect.oracle.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.stat.TableStat.Column; public class OracleSchemaStatVisitorTest1 extends TestCase { @@ -15,13 +17,13 @@ public class OracleSchemaStatVisitorTest1 extends TestCase { public void test_0() throws Exception { String sql = "select a.name, b.name FROM users a, usergroups b on a.groupId = b.id"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql); diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest2.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest2.java index 1edabd7a99..ed8c0dc1dc 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest2.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest2.java @@ -6,8 +6,8 @@ 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.sql.dialect.oracle.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.stat.TableStat.Column; public class OracleSchemaStatVisitorTest2 extends TestCase { @@ -15,13 +15,13 @@ public class OracleSchemaStatVisitorTest2 extends TestCase { public void test_0() throws Exception { String sql = "select id, name FROM users"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql); @@ -40,13 +40,13 @@ public class OracleSchemaStatVisitorTest2 extends TestCase { public void test_2() throws Exception { String sql = "select id, name FROM users a"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql); @@ -65,13 +65,13 @@ public class OracleSchemaStatVisitorTest2 extends TestCase { public void test_3() throws Exception { String sql = "select id, a.name FROM users a"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql); diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest3.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest3.java index 3db1c47b69..ca697d6975 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest3.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest3.java @@ -6,8 +6,8 @@ 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.sql.dialect.oracle.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.stat.TableStat.Column; public class OracleSchemaStatVisitorTest3 extends TestCase { @@ -15,13 +15,13 @@ public class OracleSchemaStatVisitorTest3 extends TestCase { public void test_0() throws Exception { String sql = "insert into users2 (id2, name2) select id, name FROM users where loginCount > 1"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql); diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest4.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest4.java index 2a72f27cd7..f26b38533d 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest4.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest4.java @@ -6,8 +6,8 @@ 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.sql.dialect.oracle.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.stat.TableStat.Column; public class OracleSchemaStatVisitorTest4 extends TestCase { @@ -15,13 +15,13 @@ public class OracleSchemaStatVisitorTest4 extends TestCase { public void test_0() throws Exception { String sql = "insert into users (id, name) values(?, ?)"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql); diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Update.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Update.java index d101448bd4..62bab81dee 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Update.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Update.java @@ -6,8 +6,8 @@ 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.sql.dialect.oracle.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.stat.TableStat.Column; public class OracleSchemaStatVisitorTest_Update extends TestCase { @@ -15,13 +15,13 @@ public class OracleSchemaStatVisitorTest_Update extends TestCase { public void test_0() throws Exception { String sql = "update users set loginCount = loginCount + 1 where id = ?"; - MySqlStatementParser parser = new MySqlStatementParser(sql); + OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); Assert.assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); statemen.accept(visitor); System.out.println(sql);