From 9a931e45d55f25ab503ad8a779a3da8541c1607b Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 11 May 2017 19:48:46 +0800 Subject: [PATCH] oracle sql parser support pl/sql raise statement. --- .../oracle/ast/stmt/OracleRaiseStatement.java | 41 +++++++++ .../oracle/parser/OracleStatementParser.java | 47 +++------- .../oracle/visitor/OracleASTVisitor.java | 53 +---------- .../visitor/OracleASTVisitorAdapter.java | 58 +++--------- .../oracle/visitor/OracleOutputVisitor.java | 65 ++++--------- .../visitor/OracleSchemaStatVisitor.java | 60 +++--------- .../bvt/sql/oracle/pl/Oracle_pl_case_2.java | 92 +++++++++++++++++++ 7 files changed, 190 insertions(+), 226 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleRaiseStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_case_2.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleRaiseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleRaiseStatement.java new file mode 100644 index 0000000000..481db25e11 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleRaiseStatement.java @@ -0,0 +1,41 @@ +/* + * 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.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleRaiseStatement extends OracleStatementImpl { + + private SQLExpr exception; + + public SQLExpr getException() { + return exception; + } + + public void setException(SQLExpr exception) { + this.exception = exception; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, exception); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index aafdbc9e81..cb67499401 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -27,44 +27,11 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLStatementParser; @@ -248,6 +215,11 @@ public class OracleStatementParser extends SQLStatementParser { } if (lexer.token() == Token.IDENTIFIER) { + if (lexer.stringVal().equals("RAISE")) { + statementList.add(this.parseRaise()); + continue; + } + SQLExpr expr = exprParser.expr(); OracleExprStatement stmt = new OracleExprStatement(expr); statementList.add(stmt); @@ -469,6 +441,13 @@ public class OracleStatementParser extends SQLStatementParser { } } + public SQLStatement parseRaise() { + lexer.nextToken(); + OracleRaiseStatement stmt = new OracleRaiseStatement(); + stmt.setException(this.exprParser.expr()); + return stmt; + } + public SQLStatement parseCase() { SQLCaseStatement caseStmt = new SQLCaseStatement(); lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index c315544ffc..90a7a32d6a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -45,57 +45,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -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.OracleSavePointStatement; -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.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface OracleASTVisitor extends SQLASTVisitor { @@ -440,6 +393,10 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleExitStatement x); + boolean visit(OracleRaiseStatement x); + + void endVisit(OracleRaiseStatement x); + boolean visit(OracleSavePointStatement x); void endVisit(OracleSavePointStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index ff4effc6c5..48aa766493 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -54,59 +54,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -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.OracleSavePointStatement; -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.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements OracleASTVisitor { @@ -994,6 +948,16 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } + @Override + public boolean visit(OracleRaiseStatement x) { + return true; + } + + @Override + public void endVisit(OracleRaiseStatement x) { + + } + @Override public boolean visit(OracleSavePointStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index e81b507a2f..46c63ac3fe 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -65,65 +65,17 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -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.OracleSavePointStatement; -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.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; import com.alibaba.druid.util.JdbcConstants; @@ -2514,6 +2466,21 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } + @Override + public boolean visit(OracleRaiseStatement x) { + print0(ucase ? "RAISE" : "raise"); + if (x.getException() != null) { + print(' '); + x.getException().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleRaiseStatement x) { + + } + @Override public void endVisit(SQLRollbackStatement x) { 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 972041568f..f147596eee 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 @@ -77,59 +77,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDbLinkStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; -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.OracleSavePointStatement; -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.OracleSelectJoin; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; @@ -1319,7 +1273,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleExitStatement x) { - return true; + return false; } @Override @@ -1327,6 +1281,16 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } + @Override + public boolean visit(OracleRaiseStatement x) { + return false; + } + + @Override + public void endVisit(OracleRaiseStatement x) { + + } + @Override public boolean visit(OracleSavePointStatement x) { return false; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_case_2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_case_2.java new file mode 100644 index 0000000000..3ca2ecba79 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_case_2.java @@ -0,0 +1,92 @@ +/* + * 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.pl; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class Oracle_pl_case_2 extends OracleTest { + + public void test_0() throws Exception { + String sql = "CASE l_employee_type\n" + + " WHEN 'S' \n" + + " THEN\n" + + " award_bonus (l_employee_id);\n" + + " WHEN 'H' \n" + + " THEN\n" + + " award_bonus (l_employee_id);\n" + + " WHEN 'C' \n" + + " THEN\n" + + " award_commissioned_bonus (\n" + + " l_employee_id);\n" + + " ELSE\n" + + " RAISE invalid_employee_type;\n" + + "END CASE;"; // + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); + for (SQLStatement statement : statementList) { + statement.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(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name"))); + +// Assert.assertEquals(7, visitor.getColumns().size()); +// Assert.assertEquals(3, visitor.getConditions().size()); +// Assert.assertEquals(1, visitor.getRelationships().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + + { + String output = SQLUtils.toOracleString(stmt); + assertEquals("CASE l_employee_type\n" + + "\tWHEN 'S' THEN award_bonus(l_employee_id); \n" + + "\tWHEN 'H' THEN award_bonus(l_employee_id); \n" + + "\tWHEN 'C' THEN award_commissioned_bonus(l_employee_id);\n" + + "\tELSE RAISE invalid_employee_type;\n" + + "END CASE", // + output); + } + { + String output = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("case l_employee_type\n" + + "\twhen 'S' then award_bonus(l_employee_id); \n" + + "\twhen 'H' then award_bonus(l_employee_id); \n" + + "\twhen 'C' then award_commissioned_bonus(l_employee_id);\n" + + "\telse raise invalid_employee_type;\n" + + "end case", // + output); + } + } +}