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 ae02a2d54f..2899b30512 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 @@ -9,6 +9,7 @@ import java.util.Set; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; @@ -114,6 +115,14 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { } public boolean visit(OracleDeleteStatement x) { + return visit((SQLDeleteStatement) x); + } + + public void endVisit(OracleDeleteStatement x) { + aliasLocal.set(null); + } + + public boolean visit(SQLDeleteStatement x) { aliasLocal.set(new HashMap()); x.putAttribute("_original_use_mode", modeLocal.get()); @@ -123,13 +132,20 @@ 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(); + tableStats.put(ident, stat); + } + stat.incrementDeleteCount(); accept(x.getWhere()); return false; } - public void endVisit(OracleDeleteStatement x) { + public void endVisit(SQLDeleteStatement x) { aliasLocal.set(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 new file mode 100644 index 0000000000..928af6fb66 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest1.java @@ -0,0 +1,70 @@ +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.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +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); + 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"))); + + } + + 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"))); + + } +} 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 new file mode 100644 index 0000000000..1edabd7a99 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest2.java @@ -0,0 +1,89 @@ +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.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +public class OracleSchemaStatVisitorTest2 extends TestCase { + + public void test_0() throws Exception { + String sql = "select id, name FROM users"; + + 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(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } + + public void test_2() throws Exception { + String sql = "select id, name FROM users a"; + + 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(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } + + public void test_3() throws Exception { + String sql = "select id, a.name FROM users a"; + + 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(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } +} 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 new file mode 100644 index 0000000000..3db1c47b69 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest3.java @@ -0,0 +1,45 @@ +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.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +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); + 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("users2")); + + Assert.assertEquals(5, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "loginCount"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users2", "name2"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users2", "id2"))); + + } + + +} 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 new file mode 100644 index 0000000000..2a72f27cd7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest4.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.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +public class OracleSchemaStatVisitorTest4 extends TestCase { + + public void test_0() throws Exception { + String sql = "insert into users (id, name) values(?, ?)"; + + 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(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } + +} diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Delete.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Delete.java new file mode 100644 index 0000000000..63bacffa40 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Delete.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.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.stat.TableStat.Column; + +public class OracleSchemaStatVisitorTest_Delete extends TestCase { + + public void test_0() throws Exception { + String sql = "delete from users where id = ? or name = ?"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } + +} diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Subquery.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Subquery.java new file mode 100644 index 0000000000..cbc11c7abf --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Subquery.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.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.stat.TableStat.Column; + +public class OracleSchemaStatVisitorTest_Subquery extends TestCase { + + public void test_0() throws Exception { + String sql = "SELECT id2, name2 FROM (select id, name from users limit 10) a"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } + +} diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Subquery2.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Subquery2.java new file mode 100644 index 0000000000..c466603f69 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Subquery2.java @@ -0,0 +1,44 @@ +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.ast.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.stat.TableStat.Column; + +public class OracleSchemaStatVisitorTest_Subquery2 extends TestCase { + + public void test_0() throws Exception { + String sql = "SELECT a.id, a.name, b.name groupName FROM (select id, name, groupId from users WHERE ROWNUM < 10) a inner join groups b on a.groupId = b.id"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + 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("groups")); + + Assert.assertEquals(5, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + 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("groups", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("groups", "name"))); + + } + +} 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 new file mode 100644 index 0000000000..d101448bd4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleSchemaStatVisitorTest_Update.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.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +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); + 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(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "loginCount"))); + + } + +}