diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLArgument.java b/src/main/java/com/alibaba/druid/sql/ast/SQLArgument.java new file mode 100644 index 0000000000..6df17ab6b3 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLArgument.java @@ -0,0 +1,39 @@ +package com.alibaba.druid.sql.ast; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +/** + * Created by wenshao on 29/05/2017. + */ +public class SQLArgument extends SQLObjectImpl { + private SQLParameter.ParameterType type; + private SQLExpr expr; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + } + + visitor.endVisit(this); + } + + public SQLParameter.ParameterType getType() { + return type; + } + + public SQLExpr getExpr() { + return expr; + } + + public void setType(SQLParameter.ParameterType type) { + this.type = type; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommitStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommitStatement.java new file mode 100644 index 0000000000..a0058f2d19 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommitStatement.java @@ -0,0 +1,118 @@ +/* + * 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.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLCommitStatement extends SQLStatementImpl { + + // oracle + private boolean write; + private Boolean wait; + private Boolean immediate; + + // mysql + private boolean work = false; + private Boolean chain; + private Boolean release; + + // sql server + private SQLExpr transactionName; + private SQLExpr delayedDurability; + + public void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, transactionName); + acceptChild(visitor, delayedDurability); + } + visitor.endVisit(this); + } + + // oracle + public boolean isWrite() { + return write; + } + + public void setWrite(boolean write) { + this.write = write; + } + + public Boolean getWait() { + return wait; + } + + public void setWait(Boolean wait) { + this.wait = wait; + } + + public Boolean getImmediate() { + return immediate; + } + + public void setImmediate(Boolean immediate) { + this.immediate = immediate; + } + + // mysql + public Boolean getChain() { + return chain; + } + + public void setChain(Boolean chain) { + this.chain = chain; + } + + public Boolean getRelease() { + return release; + } + + public void setRelease(Boolean release) { + this.release = release; + } + + public boolean isWork() { + return work; + } + + public void setWork(boolean work) { + this.work = work; + } + + // sql server + public SQLExpr getTransactionName() { + return transactionName; + } + + public void setTransactionName(SQLExpr transactionName) { + if (transactionName != null) { + transactionName.setParent(this); + } + this.transactionName = transactionName; + } + + public SQLExpr getDelayedDurability() { + return delayedDurability; + } + + public void setDelayedDurability(SQLExpr delayedDurability) { + if (delayedDurability != null) { + delayedDurability.setParent(this); + } + this.delayedDurability = delayedDurability; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCommitStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCommitStatement.java deleted file mode 100644 index 22764b5506..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCommitStatement.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.mysql.ast.statement; - -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; - -public class MySqlCommitStatement extends MySqlStatementImpl { - - private boolean work = false; - - private Boolean chain; - private Boolean release; - - public Boolean getChain() { - return chain; - } - - public void setChain(Boolean chain) { - this.chain = chain; - } - - public Boolean getRelease() { - return release; - } - - public void setRelease(Boolean release) { - this.release = release; - } - - public boolean isWork() { - return work; - } - - public void setWork(boolean work) { - this.work = work; - } - - public void accept0(MySqlASTVisitor visitor) { - visitor.visit(this); - - visitor.endVisit(this); - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 3e38491c76..29694535d0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -34,56 +34,8 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.ast.statement.SQLAlterDatabaseStatement; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAnalyzePartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableCheckPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableCoalescePartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDiscardPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropKey; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableImportPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableOptimizePartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableReOrganizePartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableRebuildPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableRepairPartition; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableTruncatePartition; -import com.alibaba.druid.sql.ast.statement.SQLBlockStatement; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; -import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; -import com.alibaba.druid.sql.ast.statement.SQLCreateProcedureStatement; -import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; -import com.alibaba.druid.sql.ast.statement.SQLIfStatement; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; -import com.alibaba.druid.sql.ast.statement.SQLLoopStatement; -import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; -import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; -import com.alibaba.druid.sql.ast.statement.SQLSetStatement; -import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; -import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLUnique; -import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; -import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue; import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue.ConditionType; @@ -98,7 +50,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIterateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlLeaveStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; -import com.alibaba.druid.sql.ast.statement.SQLWhileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAlterColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; @@ -110,7 +61,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; @@ -1728,10 +1678,10 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - public MySqlCommitStatement parseCommit() { + public SQLStatement parseCommit() { acceptIdentifier("COMMIT"); - MySqlCommitStatement stmt = new MySqlCommitStatement(); + SQLCommitStatement stmt = new SQLCommitStatement(); if (identifierEquals("WORK")) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index 7bb9dddc69..75334f191d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -50,7 +50,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; @@ -192,10 +191,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlReplaceStatement x); - void endVisit(MySqlCommitStatement x); - - boolean visit(MySqlCommitStatement x); - void endVisit(MySqlRollbackStatement x); boolean visit(MySqlRollbackStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index d9e5578a4a..6e9b46f8bc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -50,7 +50,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; @@ -282,17 +281,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq return true; } - @Override - public void endVisit(MySqlCommitStatement x) { - - } - - @Override - public boolean visit(MySqlCommitStatement x) { - - return true; - } - @Override public void endVisit(MySqlRollbackStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 99077d4079..2136658110 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -58,7 +58,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; @@ -1224,38 +1223,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - @Override - public void endVisit(MySqlCommitStatement x) { - - } - - @Override - public boolean visit(MySqlCommitStatement x) { - print0(ucase ? "COMMIT" : "commit"); - - if (x.isWork()) { - print0(ucase ? " WORK" : " work"); - } - - if (x.getChain() != null) { - if (x.getChain().booleanValue()) { - print0(ucase ? " AND CHAIN" : " and chain"); - } else { - print0(ucase ? " AND NO CHAIN" : " and no chain"); - } - } - - if (x.getRelease() != null) { - if (x.getRelease().booleanValue()) { - print0(ucase ? " AND RELEASE" : " and release"); - } else { - print0(ucase ? " AND NO RELEASE" : " and no release"); - } - } - - return false; - } - @Override public void endVisit(MySqlRollbackStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index f2504b876b..b11fe6498d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -65,7 +65,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; @@ -411,17 +410,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS return true; } - @Override - public void endVisit(MySqlCommitStatement x) { - - } - - @Override - public boolean visit(MySqlCommitStatement x) { - - return true; - } - @Override public void endVisit(MySqlRollbackStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java deleted file mode 100644 index b9a4a1fd0f..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.dialect.oracle.visitor.OracleASTVisitor; - -public class OracleCommitStatement extends OracleStatementImpl { - - private boolean write; - private Boolean wait; - private Boolean immediate; - - @Override - public void accept0(OracleASTVisitor visitor) { - visitor.visit(this); - visitor.endVisit(this); - } - - public boolean isWrite() { - return write; - } - - public void setWrite(boolean write) { - this.write = write; - } - - public Boolean getWait() { - return wait; - } - - public void setWait(Boolean wait) { - this.wait = wait; - } - - public Boolean getImmediate() { - return immediate; - } - - public void setImmediate(Boolean immediate) { - this.immediate = immediate; - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java index cad9ae40a9..fe126489a0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java @@ -15,13 +15,23 @@ */ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; -import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLArgument; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class OracleExecuteImmediateStatement extends OracleStatementImpl { - private SQLCharExpr dynamicSql; + private SQLExpr dynamicSql; + + private final List arguments = new ArrayList(); + + private final List into = new ArrayList(); + + private final List returnInto = new ArrayList(); public OracleExecuteImmediateStatement(){ } @@ -38,11 +48,11 @@ public class OracleExecuteImmediateStatement extends OracleStatementImpl { visitor.endVisit(this); } - public SQLCharExpr getDynamicSql() { + public SQLExpr getDynamicSql() { return dynamicSql; } - public void setDynamicSql(SQLCharExpr dynamicSql) { + public void setDynamicSql(SQLExpr dynamicSql) { if (dynamicSql != null) { dynamicSql.setParent(this); } @@ -52,4 +62,16 @@ public class OracleExecuteImmediateStatement extends OracleStatementImpl { public void setDynamicSql(String dynamicSql) { this.setDynamicSql(new SQLCharExpr(dynamicSql)); } + + public List getArguments() { + return arguments; + } + + public List getInto() { + return into; + } + + public List getReturnInto() { + return returnInto; + } } 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 a8f2992b3d..1738cc1824 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 @@ -402,7 +402,7 @@ public class OracleStatementParser extends SQLStatementParser { if (identifierEquals("WORK")) { lexer.nextToken(); } - OracleCommitStatement stmt = new OracleCommitStatement(); + SQLCommitStatement stmt = new SQLCommitStatement(); stmt.setParent(parent); if (identifierEquals("WRITE")) { @@ -623,9 +623,54 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); OracleExecuteImmediateStatement stmt = new OracleExecuteImmediateStatement(); - String dyanmiacSql = lexer.stringVal(); - accept(Token.LITERAL_CHARS); + + SQLExpr dyanmiacSql = this.exprParser.primary(); stmt.setDynamicSql(dyanmiacSql); + + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + + this.exprParser.exprList(stmt.getInto(), stmt); + } + + if (lexer.token() == Token.USING) { + lexer.nextToken(); + + for (;;) { + SQLArgument arg = new SQLArgument(); + + if (lexer.token() == Token.IN) { + lexer.nextToken(); + if (lexer.token() == Token.OUT) { + lexer.nextToken(); + arg.setType(SQLParameter.ParameterType.INOUT); + } else { + arg.setType(SQLParameter.ParameterType.IN); + } + } else if (lexer.token() == Token.OUT) { + lexer.nextToken(); + arg.setType(SQLParameter.ParameterType.OUT); + } + + arg.setExpr(this.exprParser.primary()); + arg.setParent(stmt); + stmt.getArguments().add(arg); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + } + + if (lexer.token() == Token.RETURNING) { + lexer.nextToken(); + accept(Token.INTO); + + this.exprParser.exprList(stmt.getReturnInto(), stmt); + } + return stmt; } throw new ParserException("TODO : " + lexer.info()); @@ -1457,7 +1502,7 @@ public class OracleStatementParser extends SQLStatementParser { SQLParameter parameter = new SQLParameter(); SQLName name; - SQLDataType dataType; + SQLDataType dataType = null; if (lexer.token() == Token.CURSOR) { lexer.nextToken(); @@ -1557,7 +1602,8 @@ public class OracleStatementParser extends SQLStatementParser { parameter.setDataType(dataType); parameters.add(parameter); - if (lexer.token() == Token.COMMA || lexer.token() == Token.SEMI) { + Token token = lexer.token(); + if (token == Token.COMMA || token == Token.SEMI) { 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 8fee04aec7..1965426d57 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 @@ -345,10 +345,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleLabelStatement x); - boolean visit(OracleCommitStatement x); - - void endVisit(OracleCommitStatement x); - boolean visit(OracleAlterTriggerStatement x); void endVisit(OracleAlterTriggerStatement 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 fcf9116498..7013e5fa6d 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 @@ -827,16 +827,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(OracleCommitStatement x) { - return true; - } - - @Override - public void endVisit(OracleCommitStatement x) { - - } - @Override public boolean visit(OracleAlterTriggerStatement 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 a87837e2f2..84b06175df 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 @@ -2240,37 +2240,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - @Override - public boolean visit(OracleCommitStatement x) { - print0(ucase ? "COMMIT" : "commit"); - - if (x.isWrite()) { - print0(ucase ? " WRITE" : " write"); - if (x.getWait() != null) { - if (x.getWait().booleanValue()) { - print0(ucase ? " WAIT" : " wait"); - } else { - print0(ucase ? " NOWAIT" : " nowait"); - } - } - - if (x.getImmediate() != null) { - if (x.getImmediate().booleanValue()) { - print0(ucase ? " IMMEDIATE" : " immediate"); - } else { - print0(ucase ? " BATCH" : " batch"); - } - } - } - - return false; - } - - @Override - public void endVisit(OracleCommitStatement x) { - - } - @Override public boolean visit(OracleAlterTriggerStatement x) { print0(ucase ? "ALTER TRIGGER " : "alter trigger "); @@ -3226,6 +3195,24 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public boolean visit(OracleExecuteImmediateStatement x) { print0(ucase ? "EXECUTE IMMEDIATE " : "execute immediate "); x.getDynamicSql().accept(this); + + List into = x.getInto(); + if (into.size() > 0) { + print0(ucase ? " INTO " : " into "); + printAndAccept(into, ", "); + } + + List using = x.getArguments(); + if (using.size() > 0) { + print0(ucase ? " USING " : " using "); + printAndAccept(using, ", "); + } + + List returnInto = x.getReturnInto(); + if (returnInto.size() > 0) { + print0(ucase ? " RETURNNING INTO " : " returnning into "); + printAndAccept(returnInto, ", "); + } return false; } 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 3b11d1befc..aaf6774378 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 @@ -24,24 +24,13 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLCheck; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; -import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; -import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; -import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLUnique; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; @@ -86,7 +75,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement. import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item; 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.parser.SQLParserUtils; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; @@ -280,19 +268,24 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } public boolean visit(SQLIdentifierExpr x) { - if ("ROWNUM".equalsIgnoreCase(x.getName())) { + String name = x.getName(); + if ("ROWNUM".equalsIgnoreCase(name)) { return false; } - if ("SYSDATE".equalsIgnoreCase(x.getName())) { + if ("SYSDATE".equalsIgnoreCase(name)) { return false; } - if ("+".equalsIgnoreCase(x.getName())) { + if ("+".equalsIgnoreCase(name)) { return false; } - if ("LEVEL".equals(x.getName())) { + if ("LEVEL".equals(name)) { + return false; + } + + if ("SQLCODE".equalsIgnoreCase(name)) { return false; } @@ -910,7 +903,23 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - return true; + SQLExpr when = x.getWhen(); + if (when instanceof SQLIdentifierExpr) { + SQLIdentifierExpr ident = (SQLIdentifierExpr) when; + if (ident.getName().equalsIgnoreCase("OTHERS")) { + // skip + } else { + this.visit(ident); + } + } else if (when != null) { + when.accept(this); + } + + for (SQLStatement stmt : x.getStatements()) { + stmt.accept(this); + } + + return false; } @Override @@ -1163,16 +1172,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } - @Override - public boolean visit(OracleCommitStatement x) { - return true; - } - - @Override - public void endVisit(OracleCommitStatement x) { - - } - @Override public boolean visit(OracleAlterTriggerStatement x) { return false; @@ -1453,11 +1452,48 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleExecuteImmediateStatement x) { - String sql = x.getDynamicSql().getText(); + SQLExpr dynamicSql = x.getDynamicSql(); - List stmtList = SQLUtils.parseStatements(sql, getDbType()); - for (SQLStatement stmt : stmtList) { - stmt.accept(this); + String sql = null; + + if (dynamicSql instanceof SQLIdentifierExpr) { + String varName = ((SQLIdentifierExpr) dynamicSql).getName(); + + SQLExpr valueExpr = null; + if (x.getParent() instanceof SQLBlockStatement) { + List statementList = ((SQLBlockStatement) x.getParent()).getStatementList(); + for (int i = 0, size = statementList.size(); i < size; ++i) { + SQLStatement stmt = statementList.get(i); + if (stmt == x) { + break; + } + + if (stmt instanceof SQLSetStatement) { + List items = ((SQLSetStatement) stmt).getItems(); + for (SQLAssignItem item : items) { + if (item.getTarget().equals(dynamicSql)) { + valueExpr = item.getValue(); + break; + } + } + } + } + } + + if (valueExpr != null) { + dynamicSql = valueExpr; + } + } + + if (dynamicSql instanceof SQLCharExpr) { + sql = ((SQLCharExpr) dynamicSql).getText(); + } + + if (sql != null) { + List stmtList = SQLUtils.parseStatements(sql, getDbType()); + for (SQLStatement stmt : stmtList) { + stmt.accept(this); + } } return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGBeginStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGBeginStatement.java deleted file mode 100644 index 8f9091651e..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGBeginStatement.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.postgresql.ast.stmt; - -import com.alibaba.druid.sql.ast.SQLStatementImpl; -import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.JdbcConstants; - -public class PGBeginStatement extends SQLStatementImpl implements PGSQLStatement { - public final boolean isBegin; - - public PGBeginStatement(boolean isBegin) { - super(JdbcConstants.POSTGRESQL); - this.isBegin = isBegin; - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof PGASTVisitor) { - accept0((PGASTVisitor) visitor); - } - } - - @Override - public void accept0(PGASTVisitor visitor) { - visitor.visit(this); - visitor.endVisit(this); - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGCommitStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGStartTransactionStatement.java similarity index 88% rename from src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGCommitStatement.java rename to src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGStartTransactionStatement.java index 4fcd300fb1..57ff385c92 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGCommitStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGStartTransactionStatement.java @@ -20,11 +20,8 @@ import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.JdbcConstants; -// 暂时不支持END命令 -public class PGCommitStatement extends SQLStatementImpl implements PGSQLStatement { - - // COMMIT - public PGCommitStatement() { +public class PGStartTransactionStatement extends SQLStatementImpl implements PGSQLStatement { + public PGStartTransactionStatement() { super(JdbcConstants.POSTGRESQL); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 6b0bdb7441..f59780a76b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -39,14 +39,12 @@ import com.alibaba.druid.sql.parser.Token; import java.util.ArrayList; import java.util.List; -import java.util.Objects; public class PGSQLStatementParser extends SQLStatementParser { public static final String TIME_ZONE = "TIME ZONE"; public static final String TIME = "TIME"; public static final String LOCAL = "LOCAL"; - public static final String TRANSACTION = "TRANSACTION"; - + public PGSQLStatementParser(PGExprParser parser) { super(parser); } @@ -222,11 +220,14 @@ public class PGSQLStatementParser extends SQLStatementParser { public boolean parseStatementListDialect(List statementList) { switch (lexer.token()) { - case BEGIN: - statementList.add(handleBegin()); + case START: { + lexer.nextToken(); + acceptIdentifier("TRANSACTION"); + PGStartTransactionStatement stmt = new PGStartTransactionStatement(); + statementList.add(stmt); + lexer.nextToken(); return true; - case START: - return handleStart(statementList); + } case WITH: statementList.add(parseWith()); return true; @@ -235,21 +236,7 @@ public class PGSQLStatementParser extends SQLStatementParser { } } - private SQLStatement handleBegin() { - SQLStatement statement = new PGBeginStatement(true); - lexer.nextToken(); - return statement; - } - private boolean handleStart(List statementList) { - lexer.nextToken(); - if (lexer.token() == Token.IDENTIFIER && TRANSACTION.equalsIgnoreCase(lexer.stringVal())) { - statementList.add(new PGBeginStatement(false)); - lexer.nextToken(); - return true; - } - return false; - } public PGWithClause parseWithClause() { lexer.nextToken(); @@ -417,9 +404,10 @@ public class PGSQLStatementParser extends SQLStatementParser { @Override public SQLStatement parseCommit() { - SQLStatement statment = new PGCommitStatement(); + SQLCommitStatement stmt = new SQLCommitStatement(); + stmt.setDbType(this.dbType); lexer.nextToken(); - return statment; + return stmt; } private SQLStatement handleTimeZoneSet(String range) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java index edb6836172..78d4b689a2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java @@ -119,13 +119,9 @@ public interface PGASTVisitor extends SQLASTVisitor { boolean visit(PGShowStatement x); - void endVisit(PGBeginStatement x); + void endVisit(PGStartTransactionStatement x); - boolean visit(PGBeginStatement x); - - void endVisit(PGCommitStatement x); - - boolean visit(PGCommitStatement x); + boolean visit(PGStartTransactionStatement x); void endVisit(PGSetStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java index 8cba7ad432..e6e761c9f4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java @@ -282,22 +282,12 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi } @Override - public void endVisit(PGBeginStatement x) { + public void endVisit(PGStartTransactionStatement x) { } @Override - public boolean visit(PGBeginStatement x) { - return true; - } - - @Override - public void endVisit(PGCommitStatement x) { - - } - - @Override - public boolean visit(PGCommitStatement x) { + public boolean visit(PGStartTransactionStatement x) { return true; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index ed15b5214c..a364519d3b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -637,24 +637,13 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor } @Override - public void endVisit(PGBeginStatement x) { + public void endVisit(PGStartTransactionStatement x) { } @Override - public boolean visit(PGBeginStatement x) { - print0(x.isBegin ? "BEGIN" : "START TRANSACTION"); - return false; - } - - @Override - public void endVisit(PGCommitStatement x) { - - } - - @Override - public boolean visit(PGCommitStatement x) { - print0(ucase ? "COMMIT" : "commit"); + public boolean visit(PGStartTransactionStatement x) { + print0(ucase ? "START TRANSACTION" : "start transaction"); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index 449954ae7f..9ad1a46267 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -396,22 +396,12 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit } @Override - public void endVisit(PGBeginStatement x) { + public void endVisit(PGStartTransactionStatement x) { } @Override - public boolean visit(PGBeginStatement x) { - return false; - } - - @Override - public void endVisit(PGCommitStatement x) { - - } - - @Override - public boolean visit(PGCommitStatement x) { + public boolean visit(PGStartTransactionStatement x) { return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java deleted file mode 100644 index a48695e5fa..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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.sqlserver.ast.stmt; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerStatement; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerStatementImpl; -import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; - -public class SQLServerCommitStatement extends SQLServerStatementImpl implements SQLServerStatement { - - private boolean work = false; - - private SQLExpr transactionName; - - private SQLExpr delayedDurability; - - public boolean isWork() { - return work; - } - - public void setWork(boolean work) { - this.work = work; - } - - @Override - public void accept0(SQLServerASTVisitor visitor) { - visitor.visit(this); - - visitor.endVisit(this); - - } - - public SQLExpr getTransactionName() { - return transactionName; - } - - public void setTransactionName(SQLExpr transactionName) { - this.transactionName = transactionName; - } - - public SQLExpr getDelayedDurability() { - return delayedDurability; - } - - public void setDelayedDurability(SQLExpr delayedDurability) { - this.delayedDurability = delayedDurability; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java index 4ce3fc2526..a7cc38e92b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -28,7 +28,6 @@ import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; -import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement.SQLServerParameter; @@ -483,10 +482,10 @@ public class SQLServerStatementParser extends SQLStatementParser { return block; } - public SQLServerCommitStatement parseCommit() { + public SQLStatement parseCommit() { acceptIdentifier("COMMIT"); - SQLServerCommitStatement stmt = new SQLServerCommitStatement(); + SQLCommitStatement stmt = new SQLCommitStatement(); if (identifierEquals("WORK")) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java index ea15382749..38d0380c3c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java @@ -20,7 +20,6 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; -import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement.SQLServerParameter; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; @@ -72,11 +71,7 @@ public interface SQLServerASTVisitor extends SQLASTVisitor { boolean visit(SQLServerSelect x); void endVisit(SQLServerSelect x); - - boolean visit(SQLServerCommitStatement x); - void endVisit(SQLServerCommitStatement x); - boolean visit(SQLServerRollbackStatement x); void endVisit(SQLServerRollbackStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java index bbf099cf92..4f8f4a5231 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java @@ -20,7 +20,6 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; -import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement.SQLServerParameter; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; @@ -133,16 +132,6 @@ public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements } - @Override - public boolean visit(SQLServerCommitStatement x) { - return true; - } - - @Override - public void endVisit(SQLServerCommitStatement x) { - - } - @Override public boolean visit(SQLServerRollbackStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index 00325cd300..5bf0449953 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -24,7 +24,6 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; -import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement.SQLServerParameter; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; @@ -464,7 +463,7 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe } @Override - public boolean visit(SQLServerCommitStatement x) { + public boolean visit(SQLCommitStatement x) { print0(ucase ? "COMMIT" : "commit"); if (x.isWork()) { @@ -485,11 +484,6 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe return false; } - @Override - public void endVisit(SQLServerCommitStatement x) { - - } - @Override public boolean visit(SQLServerRollbackStatement x) { print0(ucase ? "ROLLBACK" : "rollback"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index d864f1ac19..4a598943c3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -24,7 +24,6 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; -import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement.SQLServerParameter; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; @@ -160,16 +159,6 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL } - @Override - public boolean visit(SQLServerCommitStatement x) { - return true; - } - - @Override - public void endVisit(SQLServerCommitStatement x) { - - } - @Override public boolean visit(SQLServerRollbackStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 540aff4328..9d2b5366f2 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -2097,6 +2097,10 @@ public class SQLExprParser extends SQLParser { item.setTarget(var); if (lexer.token() == Token.COLONEQ) { lexer.nextToken(); + } else if (lexer.token() == Token.TRUE || identifierEquals("TRUE")) { + lexer.nextToken(); + item.setValue(new SQLBooleanExpr(true)); + return item; } else { accept(Token.EQ); } 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 1064a0f3dc..1e16ad0ab2 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -4289,4 +4289,62 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } } } + + @Override + public boolean visit(SQLArgument x) { + SQLParameter.ParameterType type = x.getType(); + if (type != null) { + print0(type.name()); + print(' '); + } + + x.getExpr().accept(this); + return false; + } + + @Override + public boolean visit(SQLCommitStatement x) { + print0(ucase ? "COMMIT" : "commit"); + + if (x.isWrite()) { + print0(ucase ? " WRITE" : " write"); + if (x.getWait() != null) { + if (x.getWait().booleanValue()) { + print0(ucase ? " WAIT" : " wait"); + } else { + print0(ucase ? " NOWAIT" : " nowait"); + } + } + + if (x.getImmediate() != null) { + if (x.getImmediate().booleanValue()) { + print0(ucase ? " IMMEDIATE" : " immediate"); + } else { + print0(ucase ? " BATCH" : " batch"); + } + } + } + + if (x.isWork()) { + print0(ucase ? " WORK" : " work"); + } + + if (x.getChain() != null) { + if (x.getChain().booleanValue()) { + print0(ucase ? " AND CHAIN" : " and chain"); + } else { + print0(ucase ? " AND NO CHAIN" : " and no chain"); + } + } + + if (x.getRelease() != null) { + if (x.getRelease().booleanValue()) { + print0(ucase ? " AND RELEASE" : " and release"); + } else { + print0(ucase ? " AND NO RELEASE" : " and no release"); + } + } + + 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 07a9d8e3be..39820fc3b4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLWhileStatement; import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement; +import com.alibaba.druid.sql.ast.statement.SQLCommitStatement; public interface SQLASTVisitor { @@ -717,4 +718,12 @@ public interface SQLASTVisitor { boolean visit(SQLReturnStatement x); void endVisit(SQLReturnStatement x); + + boolean visit(SQLArgument x); + + void endVisit(SQLArgument x); + + boolean visit(SQLCommitStatement x); + + void endVisit(SQLCommitStatement 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 8747432f1a..ff312d5ed9 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause; import com.alibaba.druid.sql.ast.statement.SQLWhileStatement; import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement; +import com.alibaba.druid.sql.ast.statement.SQLCommitStatement; public class SQLASTVisitorAdapter implements SQLASTVisitor { @@ -1631,4 +1632,25 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLReturnStatement x) { } + + @Override + public boolean visit(SQLArgument x) { + return true; + } + + @Override + public void endVisit(SQLArgument x) { + + } + + + @Override + public boolean visit(SQLCommitStatement x) { + return true; + } + + @Override + public void endVisit(SQLCommitStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index fa8b31f772..e66f0dd2f7 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -24,20 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.alibaba.druid.sql.ast.SQLDeclareItem; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.SQLOrderingSpecification; -import com.alibaba.druid.sql.ast.SQLParameter; -import com.alibaba.druid.sql.ast.SQLPartition; -import com.alibaba.druid.sql.ast.SQLPartitionByHash; -import com.alibaba.druid.sql.ast.SQLPartitionByList; -import com.alibaba.druid.sql.ast.SQLPartitionByRange; -import com.alibaba.druid.sql.ast.SQLPartitionValue; -import com.alibaba.druid.sql.ast.SQLSubPartition; -import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; @@ -445,8 +432,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLBinaryOpExpr x) { - x.getLeft().setParent(x); - x.getRight().setParent(x); + SQLObject parent = x.getParent(); + + if (parent instanceof SQLIfStatement) { + return true; + } switch (x.getOperator()) { case Equality: @@ -1750,8 +1740,20 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { SQLExpr name = param.getName(); this.variants.put(name.toString(), name); + + param.accept(this); } - return true; + + for (SQLStatement stmt : x.getStatementList()) { + stmt.accept(this); + } + + SQLStatement exception = x.getException(); + if (exception != null) { + exception.accept(this); + } + + return false; } @Override diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index c8efd63b94..4342961819 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -52,7 +52,6 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; @@ -68,7 +67,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; -import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerSetStatement; @@ -2477,7 +2475,7 @@ public class WallVisitorUtils { allow = config.isShowAllow(); denyMessage = "show not allow"; errorCode = ErrorCode.SHOW_NOT_ALLOW; - } else if (x instanceof MySqlCommitStatement || x instanceof SQLServerCommitStatement) { + } else if (x instanceof SQLCommitStatement) { allow = config.isCommitAllow(); denyMessage = "commit not allow"; errorCode = ErrorCode.COMMIT_NOT_ALLOW; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest11.java index 2da1968594..2f744b2736 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest11.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest11.java @@ -72,7 +72,7 @@ public class MySqlCreateProcedureTest11 extends MysqlTest { assertEquals(3, visitor.getTables().size()); assertEquals(3, visitor.getColumns().size()); - assertEquals(2, visitor.getConditions().size()); + assertEquals(0, visitor.getConditions().size()); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_10.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_10.java index 602d2ba2a3..eca33122eb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_10.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_10.java @@ -52,8 +52,8 @@ public class MySqlParameterizedOutputVisitorTest_10 extends TestCase { stmt.accept(visitor); } System.out.println(visitor.getParameters()); - /* Assert.assertEquals(2, visitor.getParameters().size()); - Assert.assertEquals(3, visitor.getParameters().get(0)); - Assert.assertEquals(4, visitor.getParameters().get(1));*/ + /* Assert.assertEquals(2, visitor.getArguments().size()); + Assert.assertEquals(3, visitor.getArguments().get(0)); + Assert.assertEquals(4, visitor.getArguments().get(1));*/ } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java index 16139a46d1..e258c13577 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java @@ -90,7 +90,7 @@ public class OracleBlockTest18 extends OracleTest { assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); assertEquals(5, visitor.getColumns().size()); - assertEquals(3, visitor.getConditions().size()); + assertEquals(2, visitor.getConditions().size()); assertEquals(1, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest19.java index 21bd4929d2..cf498622a1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest19.java @@ -67,8 +67,8 @@ public class OracleBlockTest19 extends OracleTest { // assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); -// assertEquals(5, visitor.getColumns().size()); -// assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest20.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest20.java new file mode 100644 index 0000000000..0c894196d7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest20.java @@ -0,0 +1,107 @@ +/* + * 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.block; + +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.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleBlockTest20 extends OracleTest { + + public void test_0() throws Exception { + String sql = "DECLARE\n" + + " sql_stmt VARCHAR2(200);\n" + + " plsql_block VARCHAR2(500);\n" + + " emp_id NUMBER(4) := 7566;\n" + + " salary NUMBER(7,2);\n" + + " dept_id NUMBER(2) := 50;\n" + + " dept_name VARCHAR2(14) := 'PERSONNEL';\n" + + " location VARCHAR2(13) := 'DALLAS';\n" + + " emp_rec emp%ROWTYPE;\n" + + "BEGIN\n" + + " EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)';\n" + + " sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)';\n" + + " EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;\n" + + " sql_stmt := 'SELECT * FROM emp WHERE empno = :id';\n" + + " EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;\n" + + " plsql_block := 'BEGIN emp_pkg.raise_salary(:id, :amt); END;';\n" + + " EXECUTE IMMEDIATE plsql_block USING 7788, 500;\n" + + " sql_stmt := 'UPDATE emp SET sal = 2000 WHERE empno = :1\n" + + " RETURNING sal INTO :2';\n" + + " EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary;\n" + + " EXECUTE IMMEDIATE 'DELETE FROM dept WHERE deptno = :num'\n" + + " USING dept_id;\n" + + " EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';\n" + + "END;"; // + + List stmtList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + assertEquals(1, stmtList.size()); + + String result = SQLUtils.toOracleString(stmtList.get(0)); + System.out.println(result); + assertEquals("DECLARE\n" + + "\tsql_stmt VARCHAR2(200);\n" + + "\tplsql_block VARCHAR2(500);\n" + + "\temp_id NUMBER(4) := 7566;\n" + + "\tsalary NUMBER(7, 2);\n" + + "\tdept_id NUMBER(2) := 50;\n" + + "\tdept_name VARCHAR2(14) := 'PERSONNEL';\n" + + "\tlocation VARCHAR2(13) := 'DALLAS';\n" + + "\temp_rec emp%ROWTYPE;\n" + + "BEGIN\n" + + "\tEXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)';\n" + + "\tsql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)';\n" + + "\tEXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;\n" + + "\tsql_stmt := 'SELECT * FROM emp WHERE empno = :id';\n" + + "\tEXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;\n" + + "\tplsql_block := 'BEGIN emp_pkg.raise_salary(:id, :amt); END;';\n" + + "\tEXECUTE IMMEDIATE plsql_block USING 7788, 500;\n" + + "\tsql_stmt := 'UPDATE emp SET sal = 2000 WHERE empno = :1\n" + + " RETURNING sal INTO :2';\n" + + "\tEXECUTE IMMEDIATE sql_stmt USING emp_id RETURNNING INTO salary;\n" + + "\tEXECUTE IMMEDIATE 'DELETE FROM dept WHERE deptno = :num' USING dept_id;\n" + + "\tEXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';\n" + + "END;", result); + + assertEquals(1, stmtList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + for (SQLStatement statement : stmtList) { + 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(3, visitor.getTables().size()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("bonus"))); + + assertEquals(6, visitor.getColumns().size()); + assertEquals(2, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + + assertTrue(visitor.getColumns().contains(new TableStat.Column("bonus", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java index 387d2c9c10..193905e1b1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest5.java @@ -69,7 +69,7 @@ public class OracleBlockTest5 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tab_ipay_out_order_ids"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ipay_contract"))); - Assert.assertEquals(7, visitor.getColumns().size()); + Assert.assertEquals(6, visitor.getColumns().size()); Assert.assertEquals(3, visitor.getConditions().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java new file mode 100644 index 0000000000..b66af9060a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java @@ -0,0 +1,99 @@ +/* + * 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.select; + +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 org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest62 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT channel_desc, calendar_month_desc, co.country_id,\n" + + " TO_CHAR(sum(amount_sold) , '9,999,999,999') SALES$\n" + + " FROM sales, customers, times, channels, countries co\n" + + " WHERE sales.time_id=times.time_id \n" + + " AND sales.cust_id=customers.cust_id \n" + + " AND sales.channel_id= channels.channel_id \n" + + " AND customers.country_id = co.country_id\n" + + " AND channels.channel_desc IN ('Direct Sales', 'Internet') \n" + + " AND times.calendar_month_desc IN ('2000-09', '2000-10')\n" + + " AND co.country_iso_code IN ('UK', 'US')\n" + + " GROUP BY GROUPING SETS( \n" + + " (channel_desc, calendar_month_desc, co.country_id), \n" + + " (channel_desc, co.country_id), \n" + + " (calendar_month_desc, co.country_id) );"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + 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()); + + Assert.assertEquals(5, visitor.getTables().size()); + + Assert.assertEquals(14, visitor.getColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT channel_desc, calendar_month_desc, co.country_id, TO_CHAR(SUM(amount_sold), '9,999,999,999') AS SALES$\n" + + "FROM sales, customers, times, channels, countries co\n" + + "WHERE sales.time_id = times.time_id\n" + + "\tAND sales.cust_id = customers.cust_id\n" + + "\tAND sales.channel_id = channels.channel_id\n" + + "\tAND customers.country_id = co.country_id\n" + + "\tAND channels.channel_desc IN ('Direct Sales', 'Internet')\n" + + "\tAND times.calendar_month_desc IN ('2000-09', '2000-10')\n" + + "\tAND co.country_iso_code IN ('UK', 'US')\n" + + "GROUP BY GROUPING SETS ((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), (calendar_month_desc, co.country_id));", text); + } + + { + String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + + Assert.assertEquals("select channel_desc, calendar_month_desc, co.country_id, TO_CHAR(sum(amount_sold), '9,999,999,999') as SALES$\n" + + "from sales, customers, times, channels, countries co\n" + + "where sales.time_id = times.time_id\n" + + "\tand sales.cust_id = customers.cust_id\n" + + "\tand sales.channel_id = channels.channel_id\n" + + "\tand customers.country_id = co.country_id\n" + + "\tand channels.channel_desc in ('Direct Sales', 'Internet')\n" + + "\tand times.calendar_month_desc in ('2000-09', '2000-10')\n" + + "\tand co.country_iso_code in ('UK', 'US')\n" + + "group by grouping sets ((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), (calendar_month_desc, co.country_id));", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index 97f655dbcb..6503130af2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -54,7 +54,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDat 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.ast.statement.SQLCommitStatement; 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; @@ -185,7 +185,7 @@ public class OracleASTVisitorAdapterTest extends TestCase { new OracleGotoStatement().accept(adapter); new OracleLabelStatement().accept(adapter); new SQLParameter().accept(adapter); - new OracleCommitStatement().accept(adapter); + new SQLCommitStatement().accept(adapter); new OracleAlterTriggerStatement().accept(adapter); new OracleAlterSynonymStatement().accept(adapter); new AsOfSnapshotClause().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java index 8d682252c2..c7ef1667a0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGBeginTest.java @@ -16,17 +16,13 @@ package com.alibaba.druid.bvt.sql.postgresql; import com.alibaba.druid.sql.PGTest; -import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGBeginStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGStartTransactionStatement; public class PGBeginTest extends PGTest { public void testBegin() throws Exception { - String sql = "begin;"; - String expected = "BEGIN"; - testParseSql(sql, expected, expected, PGBeginStatement.class); - - sql = "start transaction;"; - expected = "START TRANSACTION"; - testParseSql(sql, expected, expected, PGBeginStatement.class); + String sql = "start transaction;"; + String expected = "START TRANSACTION"; + testParseSql(sql, expected, expected, PGStartTransactionStatement.class); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCommitTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCommitTest.java index 30b773856d..85d00b7d1b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCommitTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCommitTest.java @@ -16,12 +16,12 @@ package com.alibaba.druid.bvt.sql.postgresql; import com.alibaba.druid.sql.PGTest; -import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGCommitStatement; +import com.alibaba.druid.sql.ast.statement.SQLCommitStatement; public class PGCommitTest extends PGTest { public void testCommit() throws Exception { String sql = "commit;"; String expected = "COMMIT"; - testParseSql(sql, expected, expected, PGCommitStatement.class); + testParseSql(sql, expected, expected, SQLCommitStatement.class); } }