diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/HiveStatementImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/HiveStatementImpl.java new file mode 100644 index 0000000000..9e2a9dd1a1 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/HiveStatementImpl.java @@ -0,0 +1,7 @@ +package com.alibaba.druid.sql.dialect.hive.ast; + +public abstract class HiveStatementImpl extends HiveSQLObjectImpl implements HiveStatement { + + private static final long serialVersionUID = 1L; + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveShowTablesStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveShowTablesStatement.java new file mode 100644 index 0000000000..9232301b5c --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveShowTablesStatement.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.sql.dialect.hive.ast.stmt; + +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.dialect.hive.ast.HiveStatementImpl; +import com.alibaba.druid.sql.dialect.hive.visitor.HiveASTVisitor; + +public class HiveShowTablesStatement extends HiveStatementImpl { + + private static final long serialVersionUID = 1L; + private SQLCharExpr pattern; + + + public SQLCharExpr getPattern() { + return pattern; + } + + public void setPattern(SQLCharExpr pattern) { + this.pattern = pattern; + } + + @Override + public void accept0(HiveASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, pattern); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java index 1a3d51af4f..958886258c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java @@ -84,6 +84,8 @@ public class HiveLexer extends Lexer { map.put("WITH", Token.WITH); map.put("PARTITIONED", Token.PARTITIONED); + map.put("SHOW", Token.SHOW); + map.put("TABLES", Token.TABLES); DEFAULT_SQL_SERVER_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java index 920fa35a51..36e1e95ea6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java @@ -1,8 +1,14 @@ package com.alibaba.druid.sql.dialect.hive.parser; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.SQLStatementParser; +import java.util.List; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement; +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.parser.Token; public class HiveStatementParser extends SQLStatementParser { @@ -19,4 +25,25 @@ public class HiveStatementParser extends SQLStatementParser { return new HiveCreateTableParser(lexer); } + public boolean parseStatementListDialect(List statementList) { + if (lexer.token() == Token.SHOW) { + lexer.nextToken(); + + if (lexer.token() == Token.TABLES) { + lexer.nextToken(); + + HiveShowTablesStatement stmt = new HiveShowTablesStatement(); + + if (lexer.token() == Token.LITERAL_CHARS) { + stmt.setPattern((SQLCharExpr) exprParser.primary()); + } + + statementList.add(stmt); + return true; + } + + throw new ParserException("TODO " + lexer.token()); + } + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitor.java index 96c59f0158..92fb760731 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitor.java @@ -1,12 +1,17 @@ package com.alibaba.druid.sql.dialect.hive.visitor; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement; +import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface HiveASTVisitor extends SQLASTVisitor { - void endVisit(HiveCreateTableStatement x); + void endVisit(HiveShowTablesStatement x); + boolean visit(HiveShowTablesStatement x); + + void endVisit(HiveCreateTableStatement x); + boolean visit(HiveCreateTableStatement x); void endVisit(HiveCreateTableStatement.PartitionedBy x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitorAdapter.java index 9a39a2e3ae..9652b56dfe 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveASTVisitorAdapter.java @@ -1,6 +1,7 @@ package com.alibaba.druid.sql.dialect.hive.visitor; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement; +import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; public class HiveASTVisitorAdapter extends SQLASTVisitorAdapter implements HiveASTVisitor { @@ -25,4 +26,14 @@ public class HiveASTVisitorAdapter extends SQLASTVisitorAdapter implements HiveA return true; } + @Override + public void endVisit(HiveShowTablesStatement x) { + + } + + @Override + public boolean visit(HiveShowTablesStatement x) { + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java index b33ad551ea..e0d7a2c04a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java @@ -3,6 +3,7 @@ package com.alibaba.druid.sql.dialect.hive.visitor; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement.PartitionedBy; +import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; public class HiveOutputVisitor extends SQLASTOutputVisitor implements HiveASTVisitor { @@ -43,4 +44,19 @@ public class HiveOutputVisitor extends SQLASTOutputVisitor implements HiveASTVis return false; } + @Override + public void endVisit(HiveShowTablesStatement x) { + + } + + @Override + public boolean visit(HiveShowTablesStatement x) { + print("SHOW TABLES"); + if (x.getPattern() != null) { + print(" "); + x.getPattern().accept(this); + } + return false; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java index e5b1f6812f..b536b66268 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveSchemaStatVisitor.java @@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.hive.visitor; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement; +import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; public class HiveSchemaStatVisitor extends SchemaStatVisitor implements HiveASTVisitor { @@ -25,4 +26,14 @@ public class HiveSchemaStatVisitor extends SchemaStatVisitor implements HiveASTV public boolean visit(HiveCreateTableStatement.PartitionedBy x) { return false; } + + @Override + public void endVisit(HiveShowTablesStatement x) { + + } + + @Override + public boolean visit(HiveShowTablesStatement x) { + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateSetListSingleColumnItem.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateSetListSingleColumnItem.java index 879a5fc918..b85d0938fb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateSetListSingleColumnItem.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateSetListSingleColumnItem.java @@ -32,6 +32,7 @@ public class OracleUpdateSetListSingleColumnItem extends OracleUpdateSetListItem public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.column); + acceptChild(visitor, this.value); } visitor.endVisit(this); 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 78501db171..a9d39beeb3 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 @@ -9,6 +9,7 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; @@ -82,16 +83,50 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetValueClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Mode; public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor { + protected Column getColumn(SQLExpr expr) { + if (expr instanceof OracleOuterExpr) { + expr = ((OracleOuterExpr) expr).getExpr(); + } + + return super.getColumn(expr); + } + public boolean visit(OracleSelectTableReference x) { SQLExpr expr = x.getExpr(); + + if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) expr; + if ("TABLE".equalsIgnoreCase(methodInvoke.getMethodName()) && methodInvoke.getParameters().size() == 1) { + expr = methodInvoke.getParameters().get(0); + } + } + + Map aliasMap = aliasLocal.get(); + if (expr instanceof SQLName) { - String ident = ((SQLName) expr).toString(); + String ident; + if (expr instanceof SQLPropertyExpr) { + String owner = ((SQLPropertyExpr) expr).getOwner().toString(); + String name = ((SQLPropertyExpr) expr).getName(); + + if (aliasMap.containsKey(owner)) { + owner = aliasMap.get(owner); + } + ident = owner + "." + name; + } else { + ident = expr.toString(); + } + + if ("DUAL".equalsIgnoreCase(ident)) { + return false; + } - Map aliasMap = aliasLocal.get(); + if (aliasMap.containsKey(ident) && aliasMap.get(ident) == null) { return false; @@ -228,6 +263,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle return super.visit(x); } + + public boolean visit(SQLMethodInvokeExpr x) { + accept(x.getParameters()); + return false; + } public boolean visit(SQLIdentifierExpr x) { if ("ROWNUM".equalsIgnoreCase(x.getName())) { @@ -241,6 +281,10 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle if ("+".equalsIgnoreCase(x.getName())) { return false; } + + if ("LEVEL".equals(x.getName())) { + return false; + } return super.visit(x); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 1375dc4dcc..413807a546 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -157,6 +157,8 @@ public enum Token { // hive PARTITIONED("PARTITIONED"), + SHOW("SHOW"), + TABLES("TABLES"), EOF, ERROR, diff --git a/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest.java new file mode 100644 index 0000000000..a911cf1128 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.bvt.sql.hive; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.hive.parser.HiveStatementParser; +import com.alibaba.druid.sql.dialect.hive.visitor.HiveSchemaStatVisitor; +import com.alibaba.druid.sql.hive.HiveTest; +import com.alibaba.druid.stat.TableStat; + +public class HiveShowTableTest extends HiveTest { + + public void test_hive() throws Exception { + String sql = "SHOW TABLES"; + + HiveStatementParser parser = new HiveStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + HiveSchemaStatVisitor visitor = new HiveSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("invites"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("invites", "foo"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("invites", "bar"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest2.java new file mode 100644 index 0000000000..819e0df98e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest2.java @@ -0,0 +1,39 @@ +package com.alibaba.druid.bvt.sql.hive; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.hive.parser.HiveStatementParser; +import com.alibaba.druid.sql.dialect.hive.visitor.HiveSchemaStatVisitor; +import com.alibaba.druid.sql.hive.HiveTest; + +public class HiveShowTableTest2 extends HiveTest { + + public void test_hive() throws Exception { + String sql = "SHOW TABLES '.*s';"; + + HiveStatementParser parser = new HiveStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + HiveSchemaStatVisitor visitor = new HiveSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("invites"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("invites", "foo"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("invites", "bar"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java new file mode 100644 index 0000000000..1778589f69 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT employees_seq.currval FROM DUAL; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("orders"))); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest3.java new file mode 100644 index 0000000000..5cd6e51b41 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest3.java @@ -0,0 +1,49 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest3 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT department_id, last_name, salary " + // + " FROM employees x " + // + " WHERE salary > (SELECT AVG(salary) " + // + " FROM employees " + // + " WHERE x.department_id = department_id) " + // + " ORDER BY department_id; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "last_name"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest4.java new file mode 100644 index 0000000000..4b1f47d8ad --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest4.java @@ -0,0 +1,49 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest4 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT LPAD(' ',2*(LEVEL-1)) || last_name org_chart, " + // + "employee_id, manager_id, job_id " + // + " FROM employees" + // + " START WITH job_id = 'AD_PRES' " + // + " CONNECT BY PRIOR employee_id = manager_id AND LEVEL <= 2;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(4, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "job_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "last_name"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "manager_id"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest5.java new file mode 100644 index 0000000000..6bc8a9432b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest5.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest5 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT t1.department_id, t2.* FROM hr_info t1, TABLE(t1.people) t2" + // + " WHERE t2.department_id = t1.department_id;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertEquals(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("hr_info"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("hr_info.people"))); + + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("hr_info", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("hr_info.people", "*"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("hr_info.people", "department_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest6.java new file mode 100644 index 0000000000..b6d9b94a94 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest6.java @@ -0,0 +1,53 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest6 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT * FROM departments " + // + " WHERE EXISTS " + // + " (SELECT * FROM employees " + // + " WHERE departments.department_id = employees.department_id " + // + " AND employees.salary > 2500)" + // + " ORDER BY department_name; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(6, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "*"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_name"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "*"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest7.java new file mode 100644 index 0000000000..053f6277ed --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest7.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest7 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT * FROM employees " + // + " WHERE department_id NOT IN " + // + " (SELECT department_id FROM departments " + // + " WHERE location_id = 1700)" + // + " ORDER BY last_name;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(5, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "last_name"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "location_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "*"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest8.java new file mode 100644 index 0000000000..4e084247a3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest8.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest8 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT d.department_id, e.last_name" + // + " FROM departments d, employees e" + // + " WHERE d.department_id = e.department_id(+)" + // + " ORDER BY d.department_id, e.last_name;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest1.java new file mode 100644 index 0000000000..69c41561e6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest1.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleUpdateTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = "UPDATE table1 t_alias1 " + // + " SET column = " + // + " (SELECT expr " + // + " FROM table2 t_alias2 " + // + " WHERE t_alias1.column = t_alias2.column); "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("table1"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("table2"))); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("table1", "column"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("table2", "expr"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("table2", "column"))); + } + +}