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 2899b30512..d4c5568e9d 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 @@ -19,6 +19,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; 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.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.stat.TableStat.Mode; @@ -80,6 +82,45 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { return false; } + + public boolean visit(OracleSelectTableReference x) { + if (x.getExpr() instanceof SQLIdentifierExpr) { + String ident = ((SQLIdentifierExpr) x.getExpr()).getName(); + TableStat stat = tableStats.get(ident); + if (stat == null) { + stat = new TableStat(); + tableStats.put(ident, stat); + } + + Mode mode = modeLocal.get(); + switch (mode) { + case Delete: + stat.incrementDeleteCount(); + break; + case Insert: + stat.incrementInsertCount(); + break; + case Update: + stat.incrementUpdateCount(); + break; + case Select: + stat.incrementSelectCount(); + break; + default: + break; + } + + Map aliasMap = aliasLocal.get(); + if (aliasMap != null) { + if (x.getAlias() != null) { + aliasMap.put(x.getAlias(), ident); + } + aliasMap.put(ident, ident); + } + } + + return false; + } public boolean visit(SQLSelect x) { return true; @@ -244,12 +285,24 @@ 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); + } public boolean visit(SQLJoinTableSource x) { return true; } public boolean visit(SQLPropertyExpr x) { + if ("ROWNUM".equalsIgnoreCase(x.getName())) { + return false; + } + if (x.getOwner() instanceof SQLIdentifierExpr) { String owner = ((SQLIdentifierExpr) x.getOwner()).getName(); @@ -269,6 +322,10 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { } public boolean visit(SQLIdentifierExpr x) { + if ("ROWNUM".equalsIgnoreCase(x.getName())) { + return false; + } + String currentTable = currentTableLocal.get(); if (currentTable != null) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index aa1d1b844f..01b3dbb85a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -576,8 +576,8 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.JOIN); joinType = OracleSelectJoin.JoinType.FULL_OUTER_JOIN; } - - if (identifierEquals("INNER")) { + + if (lexer.token() == Token.INNER) { lexer.nextToken(); accept(Token.JOIN); joinType = OracleSelectJoin.JoinType.INNER_JOIN; 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 index cbc11c7abf..9906a69198 100644 --- 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 @@ -13,7 +13,7 @@ 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"; + String sql = "SELECT id2, name2 FROM (select id, name from users where ROWNUM < 10) a"; OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList();