From 6cfba1a0b9656121099839a5419f7b97ae3fb0e3 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 30 Jun 2017 11:25:11 +0800 Subject: [PATCH] improved sql parser. support create materialized view --- .../SQLCreateMaterializedViewStatement.java | 282 ++++++++++++++++++ .../druid/sql/parser/SQLStatementParser.java | 79 +++++ .../sql/visitor/SQLASTOutputVisitor.java | 60 ++++ .../druid/sql/visitor/SQLASTVisitor.java | 5 +- .../sql/visitor/SQLASTVisitorAdapter.java | 10 + .../OracleCreateMaterializedViewTest0.java | 77 +++++ .../OracleCreateMaterializedViewTest1.java | 74 +++++ .../OracleCreateMaterializedViewTest2.java | 80 +++++ ...OracleCreateViewTest10_with_read_only.java | 2 +- 9 files changed, 667 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateMaterializedViewStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest0.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest2.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateMaterializedViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateMaterializedViewStatement.java new file mode 100644 index 0000000000..1409c0bfa2 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateMaterializedViewStatement.java @@ -0,0 +1,282 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 30/06/2017. + */ +public class SQLCreateMaterializedViewStatement extends SQLStatementImpl implements OracleSegmentAttributes { + private SQLName name; + private List columns = new ArrayList(); + + private boolean refreshFast; + private boolean refreshComlete; + private boolean refreshForce; + private boolean refreshOnCommit; + private boolean refreshOnDemand; + + private boolean buildImmediate; + private boolean buildDeferred; + + private SQLSelect query; + + // oracle + private Integer pctfree; + private Integer pctused; + private Integer initrans; + + private Integer maxtrans; + private Integer pctincrease; + private Integer freeLists; + private Boolean compress; + private Integer compressLevel; + private boolean compressForOltp; + private Integer pctthreshold; + + private Boolean logging; + + protected SQLName tablespace; + protected SQLObject storage; + + private Boolean parallel; + private Integer parallelValue; + + private Boolean enableQueryRewrite; + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + if (name != null) { + name.setParent(this); + } + this.name = name; + } + + public List getColumns() { + return columns; + } + + public SQLSelect getQuery() { + return query; + } + + public void setQuery(SQLSelect query) { + if (query != null) { + query.setParent(this); + } + this.query = query; + } + + public boolean isBuildImmediate() { + return buildImmediate; + } + + public void setBuildImmediate(boolean buildImmediate) { + this.buildImmediate = buildImmediate; + } + + public boolean isBuildDeferred() { + return buildDeferred; + } + + public void setBuildDeferred(boolean buildDeferred) { + this.buildDeferred = buildDeferred; + } + + public boolean isRefresh() { + return this.refreshFast || refreshComlete || refreshForce || refreshOnDemand || refreshOnCommit; + } + + public boolean isRefreshFast() { + return refreshFast; + } + + public void setRefreshFast(boolean refreshFast) { + this.refreshFast = refreshFast; + } + + public boolean isRefreshComlete() { + return refreshComlete; + } + + public void setRefreshComlete(boolean refreshComlete) { + this.refreshComlete = refreshComlete; + } + + public boolean isRefreshForce() { + return refreshForce; + } + + public void setRefreshForce(boolean refreshForce) { + this.refreshForce = refreshForce; + } + + public boolean isRefreshOnCommit() { + return refreshOnCommit; + } + + public void setRefreshOnCommit(boolean refreshOnCommit) { + this.refreshOnCommit = refreshOnCommit; + } + + public boolean isRefreshOnDemand() { + return refreshOnDemand; + } + + public void setRefreshOnDemand(boolean refreshOnDemand) { + this.refreshOnDemand = refreshOnDemand; + } + + public Integer getPctfree() { + return pctfree; + } + + public void setPctfree(Integer pctfree) { + this.pctfree = pctfree; + } + + public Integer getPctused() { + return pctused; + } + + public void setPctused(Integer pctused) { + this.pctused = pctused; + } + + public Integer getInitrans() { + return initrans; + } + + public void setInitrans(Integer initrans) { + this.initrans = initrans; + } + + public Integer getMaxtrans() { + return maxtrans; + } + + public void setMaxtrans(Integer maxtrans) { + this.maxtrans = maxtrans; + } + + public Integer getPctincrease() { + return pctincrease; + } + + public void setPctincrease(Integer pctincrease) { + this.pctincrease = pctincrease; + } + + public Integer getFreeLists() { + return freeLists; + } + + public void setFreeLists(Integer freeLists) { + this.freeLists = freeLists; + } + + public Boolean getCompress() { + return compress; + } + + public void setCompress(Boolean compress) { + this.compress = compress; + } + + public Integer getCompressLevel() { + return compressLevel; + } + + public void setCompressLevel(Integer compressLevel) { + this.compressLevel = compressLevel; + } + + public boolean isCompressForOltp() { + return compressForOltp; + } + + public void setCompressForOltp(boolean compressForOltp) { + this.compressForOltp = compressForOltp; + } + + public Integer getPctthreshold() { + return pctthreshold; + } + + public void setPctthreshold(Integer pctthreshold) { + this.pctthreshold = pctthreshold; + } + + public Boolean getLogging() { + return logging; + } + + public void setLogging(Boolean logging) { + this.logging = logging; + } + + public SQLName getTablespace() { + return tablespace; + } + + public void setTablespace(SQLName tablespace) { + if (tablespace != null) { + tablespace.setParent(this); + } + this.tablespace = tablespace; + } + + public SQLObject getStorage() { + return storage; + } + + public void setStorage(SQLObject storage) { + if (storage != null) { + storage.setParent(this); + } + this.storage = storage; + } + + public Boolean getParallel() { + return parallel; + } + + public void setParallel(Boolean parallel) { + this.parallel = parallel; + } + + public Integer getParallelValue() { + return parallelValue; + } + + public void setParallelValue(Integer parallelValue) { + this.parallelValue = parallelValue; + } + + public Boolean getEnableQueryRewrite() { + return enableQueryRewrite; + } + + public void setEnableQueryRewrite(Boolean enableQueryRewrite) { + this.enableQueryRewrite = enableQueryRewrite; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, columns); + acceptChild(visitor, query); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 34a1e26834..9d0a7fb4b3 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -32,6 +32,7 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerEvent; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerType; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.JdbcUtils; @@ -1842,11 +1843,89 @@ public class SQLStatementParser extends SQLParser { } else if (identifierEquals("BITMAP")) { lexer.reset(markBp, markChar, Token.CREATE); return parseCreateIndex(true); + } else if (identifierEquals("MATERIALIZED")) { + lexer.reset(markBp, markChar, Token.CREATE); + return parseCreateMaterializedView(); } throw new ParserException("TODO " + lexer.token()); } + public SQLStatement parseCreateMaterializedView() { + accept(Token.CREATE); + acceptIdentifier("MATERIALIZED"); + accept(Token.VIEW); + + SQLCreateMaterializedViewStatement stmt = new SQLCreateMaterializedViewStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (exprParser instanceof OracleExprParser) { + ((OracleExprParser) exprParser).parseSegmentAttributes(stmt); + } + + if (identifierEquals("REFRESH")) { + lexer.nextToken(); + + for (; ; ) { + if (identifierEquals("FAST")) { + lexer.nextToken(); + stmt.setRefreshFast(true); + } else if (identifierEquals("COMPLETE")) { + lexer.nextToken(); + stmt.setRefreshComlete(true); + } else if (identifierEquals("FORCE")) { + lexer.nextToken(); + stmt.setRefreshForce(true); + } else if (lexer.token() == Token.ON) { + lexer.nextToken(); + if (lexer.token() == Token.COMMIT) { + lexer.nextToken(); + stmt.setRefreshOnCommit(true); + } else { + acceptIdentifier("DEMAND"); + stmt.setRefreshOnDemand(true); + } + } else { + break; + } + } + } else if (identifierEquals("BUILD")) { + lexer.nextToken(); + + if (identifierEquals("IMMEDIATE") || lexer.token() == Token.IMMEDIATE) { + lexer.nextToken(); + stmt.setBuildImmediate(true); + } else { + acceptIdentifier("DEFERRED"); + stmt.setBuildDeferred(true); + } + } else if (identifierEquals("PARALLEL")) { + lexer.nextToken(); + stmt.setParallel(true); + if (lexer.token() == Token.LITERAL_INT) { + stmt.setParallelValue(lexer.integerValue().intValue()); + lexer.nextToken(); + } + } else { + break; + } + } + + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + acceptIdentifier("QUERY"); + acceptIdentifier("REWRITE"); + stmt.setEnableQueryRewrite(true); + } + + accept(Token.AS); + SQLSelect select = this.createSQLSelectParser().select(); + stmt.setQuery(select); + + return stmt; + } + public SQLStatement parseCreateDbLink() { throw new ParserException("TODO " + lexer.token()); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 74af878bab..6c3355ccf3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -4584,4 +4584,64 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } return false; } + + public boolean visit(SQLCreateMaterializedViewStatement x) { + print0(ucase ? "CREATE MATERIALIZED VIEW " : "create materialized view "); + x.getName().accept(this); + this.printOracleSegmentAttributes(x); + println(); + + Boolean parallel = x.getParallel(); + if (parallel != null) { + if (parallel) { + print(ucase ? "PARALLEL" : "parallel"); + Integer parallelValue = x.getParallelValue(); + if (parallelValue != null) { + print(' '); + print(parallelValue); + } + } else { + print(ucase ? "NOPARALLEL" : "noparallel"); + } + println(); + } + + if (x.isBuildImmediate()) { + println(ucase ? "BUILD IMMEDIATE" : "build immediate"); + } + + if (x.isRefresh()) { + print(ucase ? "REFRESH" : "refresh"); + + if (x.isRefreshFast()) { + print(ucase ? " FAST" : " fast"); + } else if (x.isRefreshComlete()) { + print(ucase ? " COMPLETE" : " complete"); + } else if (x.isRefreshForce()) { + print(ucase ? " FORCE" : " force"); + } + + if (x.isRefreshOnCommit()) { + print(ucase ? " ON COMMIT" : " on commit"); + } else if (x.isRefreshOnDemand()) { + print(ucase ? " ON DEMAND" : " on demand"); + } + + println(); + } + + Boolean enableQueryRewrite = x.getEnableQueryRewrite(); + if (enableQueryRewrite != null) { + if (enableQueryRewrite) { + print(ucase ? "ENABLE QUERY REWRITE" : "enable query rewrite"); + } else { + print(ucase ? "DISABLE QUERY REWRITE" : "disable query rewrite"); + } + println(); + } + + println(ucase ? "AS" : "as"); + x.getQuery().accept(this); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index e07265bb7e..c6c28c6fff 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -727,9 +727,12 @@ public interface SQLASTVisitor { void endVisit(SQLCommitStatement x); - boolean visit(SQLFlashbackExpr x); void endVisit(SQLFlashbackExpr x); + + boolean visit(SQLCreateMaterializedViewStatement x); + + void endVisit(SQLCreateMaterializedViewStatement x); // } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 9f85c58393..08ddd224ba 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -1662,4 +1662,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLFlashbackExpr x) { } + + @Override + public boolean visit(SQLCreateMaterializedViewStatement x) { + return true; + } + + @Override + public void endVisit(SQLCreateMaterializedViewStatement x) { + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest0.java new file mode 100644 index 0000000000..ba27ca1427 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest0.java @@ -0,0 +1,77 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +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; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateMaterializedViewTest0 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE MATERIALIZED VIEW sales_summary AS\n" + + " SELECT\n" + + " seller_no,\n" + + " invoice_date,\n" + + " sum(invoice_amt) as sales_amt\n" + + " FROM invoice\n" + + " WHERE invoice_date < CURRENT_DATE\n" + + " GROUP BY\n" + + " seller_no,\n" + + " invoice_date\n" + + " ORDER BY\n" + + " seller_no,\n" + + " invoice_date;\n"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + assertEquals("CREATE MATERIALIZED VIEW sales_summary\n" + + "AS\n" + + "SELECT seller_no, invoice_date, SUM(invoice_amt) AS sales_amt\n" + + "FROM invoice\n" + + "WHERE invoice_date < CURRENT_DATE\n" + + "GROUP BY seller_no, invoice_date\n" + + "ORDER BY seller_no, invoice_date;",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.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()); + + assertEquals(1, visitor.getTables().size()); + + assertEquals(5, visitor.getColumns().size()); + + assertTrue(visitor.getColumns().contains(new TableStat.Column("invoice", "seller_no"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest1.java new file mode 100644 index 0000000000..c71ca074a8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest1.java @@ -0,0 +1,74 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +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; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateMaterializedViewTest1 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE MATERIALIZED VIEW sales_mv\n" + + " BUILD IMMEDIATE\n" + + " REFRESH FAST ON COMMIT\n" + + " AS SELECT t.calendar_year, p.prod_id, \n" + + " SUM(s.amount_sold) AS sum_sales\n" + + " FROM times t, products p, sales s\n" + + " WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n" + + " GROUP BY t.calendar_year, p.prod_id;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + assertEquals("CREATE MATERIALIZED VIEW sales_mv\n" + + "BUILD IMMEDIATE\n" + + "REFRESH FAST ON COMMIT\n" + + "AS\n" + + "SELECT t.calendar_year, p.prod_id, SUM(s.amount_sold) AS sum_sales\n" + + "FROM times t, products p, sales s\n" + + "WHERE t.time_id = s.time_id\n" + + "\tAND p.prod_id = s.prod_id\n" + + "GROUP BY t.calendar_year, p.prod_id;",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.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()); + + assertEquals(3, visitor.getTables().size()); + + assertEquals(7, visitor.getColumns().size()); + + assertTrue(visitor.getColumns().contains(new TableStat.Column("times", "calendar_year"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest2.java new file mode 100644 index 0000000000..3cb160e1da --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateMaterializedViewTest2.java @@ -0,0 +1,80 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +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; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateMaterializedViewTest2 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE MATERIALIZED VIEW sales_by_month_by_state\n" + + " TABLESPACE example\n" + + " PARALLEL 4\n" + + " BUILD IMMEDIATE\n" + + " REFRESH COMPLETE\n" + + " ENABLE QUERY REWRITE\n" + + " AS SELECT t.calendar_month_desc, c.cust_state_province,\n" + + " SUM(s.amount_sold) AS sum_sales\n" + + " FROM times t, sales s, customers c\n" + + " WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id\n" + + " GROUP BY t.calendar_month_desc, c.cust_state_province;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + assertEquals("CREATE MATERIALIZED VIEW sales_by_month_by_state\n" + + "TABLESPACE example\n" + + "PARALLEL 4\n" + + "BUILD IMMEDIATE\n" + + "REFRESH COMPLETE\n" + + "ENABLE QUERY REWRITE\n" + + "AS\n" + + "SELECT t.calendar_month_desc, c.cust_state_province, SUM(s.amount_sold) AS sum_sales\n" + + "FROM times t, sales s, customers c\n" + + "WHERE s.time_id = t.time_id\n" + + "\tAND s.cust_id = c.cust_id\n" + + "GROUP BY t.calendar_month_desc, c.cust_state_province;",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.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()); + + assertEquals(3, visitor.getTables().size()); + + assertEquals(8, visitor.getColumns().size()); + + assertTrue(visitor.getColumns().contains(new TableStat.Column("times", "calendar_month_desc"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest10_with_read_only.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest10_with_read_only.java index 2078a636d2..2471e30e9c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest10_with_read_only.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest10_with_read_only.java @@ -65,6 +65,6 @@ public class OracleCreateViewTest10_with_read_only extends OracleTest { assertEquals(3, visitor.getColumns().size()); - assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "last_name"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("customers", "cust_last_name"))); } }