diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVIsitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVIsitorAdapter.java index f87bc1e6ea..11e46a5e67 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVIsitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVIsitorAdapter.java @@ -54,6 +54,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRefDataType; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleReferencesConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; @@ -76,6 +77,13 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements OracleASTVisitor { + public boolean visit(OracleSelect x) { + return true; + } + + public void endVisit(OracleSelect x) { + } + @Override public void endVisit(OracleAggregateExpr astNode) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java index 921bc1572f..501cf14b43 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleASTVisitor.java @@ -55,6 +55,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRefDataType; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleReferencesConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; @@ -362,4 +363,8 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleBinaryDoubleExpr x); void endVisit(OracleBinaryDoubleExpr x); + + boolean visit(OracleSelect x); + + void endVisit(OracleSelect x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java index c2e9bb6c9d..c82b276c7b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java @@ -1673,4 +1673,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } + @Override + public void endVisit(OracleSelect x) { + + } + } 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 2489c56fad..2655fd37ee 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 @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; 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; @@ -160,6 +161,25 @@ public class OracleSchemaStatVisitor extends OracleASTVIsitorAdapter { return false; } + public void endVisit(OracleSelect x) { + } + + public boolean visit(OracleSelect x) { + accept(x.getFactoring()); + accept(x.getQuery()); + + String originalTable = currentTableLocal.get(); + + currentTableLocal.set((String) x.getQuery().getAttribute("table")); + x.putAttribute("_old_local_", originalTable); + + accept(x.getOrderBy()); + + currentTableLocal.set(originalTable); + + return false; + } + public void endVisit(SQLSelect x) { } diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleResourceTest.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleResourceTest.java index 7e6bc29a7c..476d7587b8 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleResourceTest.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/visitor/OracleResourceTest.java @@ -20,7 +20,7 @@ public class OracleResourceTest extends TestCase { public void test_0() throws Exception { // 13 - exec_test("bvt/parser/oracle-28.txt"); + exec_test("bvt/parser/oracle-29.txt"); // for (int i = 0; i <= 53; ++i) { // exec_test("bvt/parser/oracle-" + i + ".txt"); // }