diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java index 74b0d1a856..37ab19f73f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; @@ -19,7 +34,7 @@ public class MySqlCaseStatement extends MySqlStatementImpl{ //case expr private SQLExpr condition; //when statement list - private List whenList=new ArrayList(); + private List whenList=new ArrayList(); //else statement private MySqlElseStatement elseItem; @@ -31,15 +46,15 @@ public class MySqlCaseStatement extends MySqlStatementImpl{ this.condition = condition; } - public List getWhenList() { + public List getWhenList() { return whenList; } - public void setWhenList(List whenList) { + public void setWhenList(List whenList) { this.whenList = whenList; } - public void addWhenStatement(MySqlWhenfStatement stmt) + public void addWhenStatement(MySqlWhenStatement stmt) { this.whenList.add(stmt); } @@ -68,7 +83,7 @@ public class MySqlCaseStatement extends MySqlStatementImpl{ * @author zz * */ - public static class MySqlWhenfStatement extends MySqlObjectImpl { + public static class MySqlWhenStatement extends MySqlObjectImpl { private SQLExpr condition; private List statements = new ArrayList(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCreateProcedureStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCreateProcedureStatement.java index f0c3c4a4f1..43e78f6713 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCreateProcedureStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCreateProcedureStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java index 7240729209..2c0ceffde6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlElseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlElseStatement.java index 4109b0e6a1..bd12372ac1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlElseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlElseStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIfStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIfStatement.java index 444f0e8ee5..5c1050e133 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIfStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIfStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIterateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIterateStatement.java new file mode 100644 index 0000000000..55d2d223df --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlIterateStatement.java @@ -0,0 +1,46 @@ +/* + * Copyright 1999-2101 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.clause; + +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +/** + * + * @Description: MySql procedure iterate statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlIterateStatement extends MySqlStatementImpl { + + private String labelName; + + @Override + public void accept0(MySqlASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + public String getLabelName() { + return labelName; + } + + public void setLabelName(String labelName) { + this.labelName = labelName; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java new file mode 100644 index 0000000000..2ead056a38 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java @@ -0,0 +1,46 @@ +/* + * Copyright 1999-2101 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.clause; + +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +/** + * + * @Description: MySql procedure leave statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlLeaveStatement extends MySqlStatementImpl { + + private String labelName; + + @Override + public void accept0(MySqlASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + public String getLabelName() { + return labelName; + } + + public void setLabelName(String labelName) { + this.labelName = labelName; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLoopStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLoopStatement.java new file mode 100644 index 0000000000..aa98e7a607 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLoopStatement.java @@ -0,0 +1,62 @@ +/* + * Copyright 1999-2101 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.clause; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +/** + * + * @Description: MySql procedure loop statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlLoopStatement extends MySqlStatementImpl { + + private String labelName; + + private List statements = new ArrayList(); + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, statements); + } + visitor.endVisit(this); + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + public String getLabelName() { + return labelName; + } + + public void setLabelName(String labelName) { + this.labelName = labelName; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlRepeatStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlRepeatStatement.java new file mode 100644 index 0000000000..5052d77292 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlRepeatStatement.java @@ -0,0 +1,73 @@ +/* + * Copyright 1999-2101 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.clause; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +/** + * + * @Description: MySql procedure repeat statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlRepeatStatement extends MySqlStatementImpl { + + private String labelName; + + private List statements = new ArrayList(); + + private SQLExpr condition; + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, statements); + acceptChild(visitor, condition); + } + visitor.endVisit(this); + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + public String getLabelName() { + return labelName; + } + + public void setLabelName(String labelName) { + this.labelName = labelName; + } + + public SQLExpr getCondition() { + return condition; + } + + public void setCondition(SQLExpr condition) { + this.condition = condition; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlSelectIntoStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlSelectIntoStatement.java index af1f725052..a0956b5bf4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlSelectIntoStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlSelectIntoStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlStatementType.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlStatementType.java index 8bc54d0170..2790e2dcb5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlStatementType.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlStatementType.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import com.alibaba.druid.sql.ast.SQLStatement; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlWhileStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlWhileStatement.java index 5709f0b14b..854c2814de 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlWhileStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlWhileStatement.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2101 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.clause; import java.util.ArrayList; @@ -20,8 +35,18 @@ public class MySqlWhileStatement extends MySqlStatementImpl { //while expr private SQLExpr condition; private List statements = new ArrayList(); + //while label name + private String labelName; + public String getLabelName() { + return labelName; + } + + public void setLabelName(String labelName) { + this.labelName = labelName; + } + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBlockStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBlockStatement.java index 2cd26ed9e7..08e4afd4aa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBlockStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBlockStatement.java @@ -23,7 +23,13 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; public class MySqlBlockStatement extends MySqlStatementImpl { - private List statementList = new ArrayList(); + /** + * begin-end block label name + * @author zz + */ + private String labelName; + + private List statementList = new ArrayList(); public List getStatementList() { return statementList; @@ -33,6 +39,14 @@ public class MySqlBlockStatement extends MySqlStatementImpl { this.statementList = statementList; } + public String getLabelName() { + return labelName; + } + + public void setLabelName(String labelName) { + this.labelName = labelName; + } + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(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 aa59a4a461..12dfb1d95f 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 @@ -62,13 +62,17 @@ 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.MySqlCaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenfStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement; +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.MySqlLoopStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlParameter; +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.dialect.mysql.ast.clause.MySqlWhileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; @@ -2840,6 +2844,9 @@ public class MySqlStatementParser extends SQLStatementParser { if (lexer.token() == Token.WHEN) { return; } + if (lexer.token() == Token.UNTIL) { + return; + } // select into if (lexer.token() == (Token.SELECT)) { statementList.add(this.parseSelectInto()); @@ -2930,6 +2937,12 @@ public class MySqlStatementParser extends SQLStatementParser { continue; } + // loop statement + if (lexer.token() == Token.LOOP) { + statementList.add(this.parseLoop()); + continue; + } + // if statement if (lexer.token() == Token.IF) { statementList.add(this.parseIf()); @@ -2948,6 +2961,61 @@ public class MySqlStatementParser extends SQLStatementParser { continue; } + // leave statement + if (lexer.token() == Token.LEAVE) { + statementList.add(this.parseLeave()); + continue; + } + + // iterate statement + if (lexer.token() == Token.ITERATE) { + statementList.add(this.parseIterate()); + continue; + } + + // repeat statement + if (lexer.token() == Token.REPEAT) { + statementList.add(this.parseRepeat()); + continue; + } + + if(lexer.token() == Token.IDENTIFIER) + { + String label=lexer.stringVal(); + char ch = lexer.current(); + int bp = lexer.bp(); + lexer.nextToken(); + if(lexer.token()==Token.VARIANT&&lexer.stringVal().equals(":")) + { + lexer.nextToken(); + if(lexer.token()==Token.LOOP) + { + //parse loop statement + statementList.add(this.parseLoop(label)); + } + else if(lexer.token()==Token.WHILE) + { + //parse while statement with label + statementList.add(this.parseWhile(label)); + } + else if(lexer.token()==Token.BEGIN) + { + //parse begin-end statement with label + statementList.add(this.parseBlock(label)); + } + else if(lexer.token()==Token.REPEAT) + { + //parse repeat statement with label + statementList.add(this.parseRepeat(label)); + } + continue; + } + else + { + lexer.reset(bp, ch, Token.IDENTIFIER); + } + + } throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -3022,6 +3090,35 @@ public class MySqlStatementParser extends SQLStatementParser { } + /** + * parse while statement with label + * @return MySqlWhileStatement + */ + public MySqlWhileStatement parseWhile(String label) { + accept(Token.WHILE); + + MySqlWhileStatement stmt = new MySqlWhileStatement(); + + stmt.setLabelName(label); + + stmt.setCondition(this.exprParser.expr()); + + accept(Token.DO); + + this.parseProcedureStatementList(stmt.getStatements()); + + accept(Token.END); + + accept(Token.WHILE); + + acceptIdentifier(label); + + accept(Token.SEMI); + + return stmt; + + } + /** * parse case statement * @return MySqlCaseStatement @@ -3035,7 +3132,7 @@ public class MySqlStatementParser extends SQLStatementParser { { while (lexer.token() == Token.WHEN) { - MySqlWhenfStatement when=new MySqlWhenfStatement(); + MySqlWhenStatement when=new MySqlWhenStatement(); //when expr when.setCondition(exprParser.expr()); @@ -3061,7 +3158,7 @@ public class MySqlStatementParser extends SQLStatementParser { while (lexer.token() == Token.WHEN) { accept(Token.WHEN); - MySqlWhenfStatement when=new MySqlWhenfStatement(); + MySqlWhenStatement when=new MySqlWhenStatement(); //when expr when.setCondition(exprParser.expr()); @@ -3141,4 +3238,108 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlSelectIntoParser parse=new MySqlSelectIntoParser(this.exprParser); return parse.parseSelectInto(); } + + /** + * parse loop statement + */ + public MySqlLoopStatement parseLoop() + { + MySqlLoopStatement loopStmt=new MySqlLoopStatement(); + accept(Token.LOOP); + parseProcedureStatementList(loopStmt.getStatements()); + accept(Token.END); + accept(Token.LOOP); + accept(Token.SEMI); + return loopStmt; + } + + /** + * parse loop statement with label + */ + public MySqlLoopStatement parseLoop(String label) + { + MySqlLoopStatement loopStmt=new MySqlLoopStatement(); + loopStmt.setLabelName(label); + accept(Token.LOOP); + parseProcedureStatementList(loopStmt.getStatements()); + accept(Token.END); + accept(Token.LOOP); + acceptIdentifier(label); + accept(Token.SEMI); + return loopStmt; + } + + /** + * parse loop statement with label + */ + public MySqlBlockStatement parseBlock(String label) { + MySqlBlockStatement block = new MySqlBlockStatement(); + block.setLabelName(label); + accept(Token.BEGIN); + parseProcedureStatementList(block.getStatementList()); + accept(Token.END); + acceptIdentifier(label); + return block; + } + + /** + * parse leave statement + */ + public MySqlLeaveStatement parseLeave() + { + accept(Token.LEAVE); + MySqlLeaveStatement leaveStmt=new MySqlLeaveStatement(); + leaveStmt.setLabelName(exprParser.name().getSimpleName()); + accept(Token.SEMI); + return leaveStmt; + } + + /** + * parse iterate statement + */ + public MySqlIterateStatement parseIterate() + { + accept(Token.ITERATE); + MySqlIterateStatement iterateStmt=new MySqlIterateStatement(); + iterateStmt.setLabelName(exprParser.name().getSimpleName()); + accept(Token.SEMI); + return iterateStmt; + } + + /** + * parse repeat statement + * @return + */ + public MySqlRepeatStatement parseRepeat() + { + MySqlRepeatStatement repeatStmt=new MySqlRepeatStatement(); + accept(Token.REPEAT); + parseProcedureStatementList(repeatStmt.getStatements()); + accept(Token.UNTIL); + repeatStmt.setCondition(exprParser.expr()); + accept(Token.END); + accept(Token.REPEAT); + accept(Token.SEMI); + return repeatStmt; + } + + /** + * parse repeat statement with label + * @param label + * @return + */ + public MySqlRepeatStatement parseRepeat(String label) + { + MySqlRepeatStatement repeatStmt=new MySqlRepeatStatement(); + repeatStmt.setLabelName(label); + accept(Token.REPEAT); + parseProcedureStatementList(repeatStmt.getStatements()); + accept(Token.UNTIL); + repeatStmt.setCondition(exprParser.expr()); + accept(Token.END); + accept(Token.REPEAT); + acceptIdentifier(label); + accept(Token.SEMI); + return repeatStmt; + } } 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 28346ca040..4e1508a3e5 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 @@ -23,13 +23,17 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenfStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement; +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.MySqlLoopStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlParameter; +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.dialect.mysql.ast.clause.MySqlWhileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; @@ -622,7 +626,23 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlSelectIntoStatement x); - boolean visit(MySqlWhenfStatement x); + boolean visit(MySqlWhenStatement x); - void endVisit(MySqlWhenfStatement x); + void endVisit(MySqlWhenStatement x); + + boolean visit(MySqlLoopStatement x); + + void endVisit(MySqlLoopStatement x); + + boolean visit(MySqlLeaveStatement x); + + void endVisit(MySqlLeaveStatement x); + + boolean visit(MySqlIterateStatement x); + + void endVisit(MySqlIterateStatement x); + + boolean visit(MySqlRepeatStatement x); + + void endVisit(MySqlRepeatStatement 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 5036505063..2fa046b353 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 @@ -23,13 +23,17 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenfStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement; +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.MySqlLoopStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlParameter; +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.dialect.mysql.ast.clause.MySqlWhileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; @@ -1390,16 +1394,64 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } @Override - public boolean visit(MySqlWhenfStatement x) { + public boolean visit(MySqlWhenStatement x) { // TODO Auto-generated method stub return true; } @Override - public void endVisit(MySqlWhenfStatement x) { + public void endVisit(MySqlWhenStatement x) { // TODO Auto-generated method stub } //add:end + @Override + public boolean visit(MySqlLoopStatement x) { + // TODO Auto-generated method stub + return true; + } + + @Override + public void endVisit(MySqlLoopStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlLeaveStatement x) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void endVisit(MySqlLeaveStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlIterateStatement x) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void endVisit(MySqlIterateStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlRepeatStatement x) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void endVisit(MySqlRepeatStatement x) { + // TODO Auto-generated method stub + + } + } // 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 f9594b7aa0..d8b0df99d8 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 @@ -45,13 +45,17 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenfStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement; +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.MySqlLoopStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlParameter; +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.dialect.mysql.ast.clause.MySqlWhileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; @@ -3187,6 +3191,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public boolean visit(MySqlBlockStatement x) { + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(x.getLabelName()+": "); print("BEGIN"); incrementIndent(); println(); @@ -3202,6 +3208,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV decrementIndent(); println(); print("END"); + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(" "+x.getLabelName()); return false; } @@ -3289,6 +3297,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public boolean visit(MySqlWhileStatement x) { + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(x.getLabelName()+": "); print("WHILE "); x.getCondition().accept(this); print(" DO"); @@ -3303,6 +3313,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } println(); print("END WHILE"); + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(" "+x.getLabelName()); return false; } @@ -3442,7 +3454,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } @Override - public boolean visit(MySqlWhenfStatement x) { + public boolean visit(MySqlWhenStatement x) { print("WHEN "); x.getCondition().accept(this); println(" THEN"); @@ -3457,7 +3469,89 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } @Override - public void endVisit(MySqlWhenfStatement x) { + public void endVisit(MySqlWhenStatement x) { + + } + + @Override + public boolean visit(MySqlLoopStatement x) { + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(x.getLabelName()+": "); + print("LOOP "); + println(); + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + println(); + print("END LOOP"); + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(" "+x.getLabelName()); + return false; + } + + @Override + public void endVisit(MySqlLoopStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlLeaveStatement x) { + print("LEAVE "+x.getLabelName()); + return false; + } + + @Override + public void endVisit(MySqlLeaveStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlIterateStatement x) { + print("ITERATE "+x.getLabelName()); + return false; + } + + @Override + public void endVisit(MySqlIterateStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlRepeatStatement x) { + // TODO Auto-generated method stub + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(x.getLabelName()+": "); + print("REPEAT "); + println(); + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + println(); + print("UNTIL "); + x.getCondition().accept(this); + println(); + print("END REPEAT"); + if(x.getLabelName()!=null&&!x.getLabelName().equals("")) + print(" "+x.getLabelName()); + return false; + } + + @Override + public void endVisit(MySqlRepeatStatement x) { + // TODO Auto-generated method stub } 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 f6a2ce4c01..dcc761ad26 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 @@ -38,13 +38,17 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenfStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement; +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.MySqlLoopStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlParameter; +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.dialect.mysql.ast.clause.MySqlWhileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; @@ -1409,7 +1413,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlWhileStatement x) { - // TODO Auto-generated method stub + accept(x.getStatements()); return false; } @@ -1421,7 +1425,9 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlIfStatement x) { - // TODO Auto-generated method stub + accept(x.getStatements()); + accept(x.getElseIfList()); + accept(x.getElseItem()); return false; } @@ -1433,7 +1439,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlElseIfStatement x) { - // TODO Auto-generated method stub + accept(x.getStatements()); return false; } @@ -1445,7 +1451,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlElseStatement x) { - // TODO Auto-generated method stub + accept(x.getStatements()); return false; } @@ -1457,7 +1463,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlCaseStatement x) { - // TODO Auto-generated method stub + accept(x.getWhenList()); return false; } @@ -1492,13 +1498,62 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } @Override - public boolean visit(MySqlWhenfStatement x) { + public boolean visit(MySqlWhenStatement x) { + accept(x.getStatements()); + return false; + } + + @Override + public void endVisit(MySqlWhenStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlLoopStatement x) { + accept(x.getStatements()); + return false; + } + + @Override + public void endVisit(MySqlLoopStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlLeaveStatement x) { // TODO Auto-generated method stub return false; } @Override - public void endVisit(MySqlWhenfStatement x) { + public void endVisit(MySqlLeaveStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlIterateStatement x) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void endVisit(MySqlIterateStatement x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(MySqlRepeatStatement x) { + // TODO Auto-generated method stub + accept(x.getStatements()); + return false; + } + + @Override + public void endVisit(MySqlRepeatStatement x) { // TODO Auto-generated method stub } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Keywords.java b/src/main/java/com/alibaba/druid/sql/parser/Keywords.java index 7234cb247c..ca4b1d9a97 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Keywords.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Keywords.java @@ -139,7 +139,12 @@ public class Keywords { map.put("WHILE", Token.WHILE); map.put("DO", Token.DO); map.put("DECLARE", Token.DECLARE); - + map.put("LOOP", Token.LOOP); + map.put("LEAVE", Token.LEAVE); + map.put("ITERATE", Token.ITERATE); + map.put("REPEAT", Token.REPEAT); + map.put("UNTIL", Token.UNTIL); + DEFAULT_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 53e1a5ca44..5a6bb8c067 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -131,6 +131,10 @@ public enum Token { // MySql procedure by:zz WHILE("WHILE"), DO("DO"), + LEAVE("LEAVE"), + ITERATE("ITERATE"), + REPEAT("REPEAT"), + UNTIL("UNTIL"), //postgresql WINDOW("WINDOW"), diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest2.java new file mode 100644 index 0000000000..96bd4bd9ef --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest2.java @@ -0,0 +1,135 @@ +/* + * Copyright 1999-2101 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.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +/** + * + * @Description: procedure begin-end, loop, while use label + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlCreateProcedureTest2 extends MysqlTest { + + public void test_0() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: while x do"+ + " insert into test values(id,age);"+ + " end while lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } + public void test_1() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: begin"+ + " insert into test values(id,age);"+ + " end lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } + + public void test_2() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: loop"+ + " insert into test values(id,age);"+ + " end loop lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest3.java new file mode 100644 index 0000000000..df524220a5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest3.java @@ -0,0 +1,138 @@ +/* + * Copyright 1999-2101 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.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +/** + * + * @Description: procedure begin-end, loop, while use label + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlCreateProcedureTest3 extends MysqlTest { + + public void test_0() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: while x do"+ + " insert into test values(id,age);"+ + " leave lable_1;"+ + " end while lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } + public void test_1() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: begin"+ + " insert into test values(id,age);"+ + " leave lable_1;"+ + " end lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } + + public void test_2() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: loop"+ + " insert into test values(id,age);"+ + " leave lable_1;"+ + " end loop lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest4.java new file mode 100644 index 0000000000..7ab96ea29c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest4.java @@ -0,0 +1,105 @@ +/* + * Copyright 1999-2101 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.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +/** + * + * @Description: procedure begin-end, loop, while use label + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlCreateProcedureTest4 extends MysqlTest { + + public void test_0() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " repeat"+ + " insert into test values(id,age);"+ + " until x>10"+ + " end repeat;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } + public void test_1() throws Exception { + String sql="create or replace procedure sp_name(level int,age int)"+ + " begin"+ + " declare x,y,z int;"+ + " lable_1: repeat"+ + " insert into test values(id,age);"+ + " until x>10"+ + " end repeat lable_1;"+ + " end"; + + MySqlStatementParser parser=new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "age"))); + } + +}