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 41e7106161..74b0d1a856 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 @@ -8,11 +8,11 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; - /** - * MySql procedure case statement - * @author zz - * + * + * @Description: MySql procedure Case statement + * @author zz email:455910092@qq.com + * @version V1.0 */ public class MySqlCaseStatement extends MySqlStatementImpl{ 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 c65126b962..f0c3c4a4f1 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 @@ -9,9 +9,10 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; /** - * MySql create procedure statement - * @author zz - * + * + * @Description: MySql create procedure statement + * @author zz email:455910092@qq.com + * @version V1.0 */ public class MySqlCreateProcedureStatement extends MySqlStatementImpl { private boolean orReplace; 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 3e752f5fe7..7240729209 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 @@ -5,13 +5,14 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; /** - * MySql declare statement - * @author sei.zz - * + * + * @Description: MySql declare statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlDeclareStatement extends MySqlStatementImpl{ 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 341483c293..4109b0e6a1 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 @@ -8,9 +8,11 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; /** - * MySql procedure else statement - * @author zz - * + * + * @Description: MySql procedure else statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlElseStatement extends MySqlObjectImpl { 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 8e79c133a2..444f0e8ee5 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 @@ -10,9 +10,11 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; /** - * MySql procedure if statement - * @author sei.zz - * + * + * @Description: MySql procedure if statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlIfStatement extends MySqlStatementImpl{ private SQLExpr condition; @@ -55,9 +57,11 @@ public class MySqlIfStatement extends MySqlStatementImpl{ this.elseItem = elseItem; } /** - * comment: else if语句 - * @author sei.zz - * + * + * @Description: MySql procedure else if statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public static class MySqlElseIfStatement extends MySqlObjectImpl { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlParameter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlParameter.java index 544f1f9938..a2e88da6d7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlParameter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlParameter.java @@ -21,9 +21,11 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; /** - * MySql procedure parameter - * @author sei.zz - * + * + * @Description: MySql procedure parameter + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlParameter extends MySqlObjectImpl { 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 9bc58a7444..af1f725052 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 @@ -4,14 +4,15 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.ast.SQLExpr; /** - * MySql procedure select into statement - * @author sei.zz - * + * + * @Description: MySql procedure select into statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlSelectIntoStatement extends MySqlStatementImpl{ 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 eeabac07bd..8bc54d0170 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 @@ -8,9 +8,11 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; /** - * MySql procedure statement type - * @author zz - * + * + * @Description: MySql procedure statement type + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public enum MySqlStatementType { //select statement 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 338cf19919..5709f0b14b 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 @@ -9,13 +9,15 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; /** - * comment: 存储过程中while循环语句 - * @author 小竹zz - * + * + * @Description: MySql procedure while statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlWhileStatement extends MySqlStatementImpl { - //while循环的表达式 + //while expr private SQLExpr condition; private List statements = new ArrayList(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/executor/MySqlProcedureExecutor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/executor/MySqlProcedureExecutor.java index 5eae64458d..0ba72f4d6e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/executor/MySqlProcedureExecutor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/executor/MySqlProcedureExecutor.java @@ -5,9 +5,11 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLStatement; /** - * comment: mysql存储过程执行器 - * @author sei.zz - * + * + * @Description: MySql procedure executor + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlProcedureExecutor { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectIntoParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectIntoParser.java index 02caf172bd..bbe3d072db 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectIntoParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectIntoParser.java @@ -46,9 +46,11 @@ import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; /** - * parse select into statement - * @author sei.zz - * + * + * @Description: parse select into statement + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 */ public class MySqlSelectIntoParser extends SQLSelectParser { private List argsList; @@ -187,7 +189,10 @@ public class MySqlSelectIntoParser extends SQLSelectParser { return queryRest(queryBlock); } - + /** + * parser the select into arguments + * @return + */ protected List parseIntoArgs() { List args=new ArrayList(); 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 bcdadb57a9..5e00b26bd0 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 @@ -714,8 +714,6 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlBlockStatement block = new MySqlBlockStatement(); accept(Token.BEGIN); - - //parseStatementList(block.getStatementList()); parseProcedureStatementList(block.getStatementList()); accept(Token.END); @@ -2806,7 +2804,7 @@ public class MySqlStatementParser extends SQLStatementParser { } /** - * parse procedure statement block + * parse procedure statement block,not support begin-end block * @param statementList */ private void parseProcedureStatementList(List statementList) @@ -2948,8 +2946,8 @@ public class MySqlStatementParser extends SQLStatementParser { if (lexer.token() == Token.DECLARE) { statementList.add(this.parseDeclare()); continue; - } - + } + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -2995,6 +2993,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.END); accept(Token.IF); + accept(Token.SEMI); return stmt; } @@ -3016,6 +3015,8 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.END); accept(Token.WHILE); + + accept(Token.SEMI); return stmt; @@ -3082,7 +3083,7 @@ public class MySqlStatementParser extends SQLStatementParser { } accept(Token.END); accept(Token.CASE); - + accept(Token.SEMI); return stmt; } 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 d070428cd2..f9594b7aa0 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 @@ -3212,12 +3212,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV /** - * comment: visit procedure node - * author С��zz + * visit procedure create node */ @Override public boolean visit(MySqlCreateProcedureStatement x) { - // TODO Auto-generated method stub if (x.isOrReplace()) { print("CREATE OR REPLACE PROCEDURE "); } else { @@ -3254,13 +3252,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlCreateProcedureStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlParameter x) { - // TODO Auto-generated method stub if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) { print("CURSOR "); x.getName().accept(this); @@ -3288,14 +3284,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlParameter x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlWhileStatement x) { - // TODO Auto-generated method stub - print("WHILE "); x.getCondition().accept(this); print(" DO"); @@ -3315,13 +3308,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlWhileStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlIfStatement x) { - // TODO Auto-generated method stub print("IF "); x.getCondition().accept(this); print(" THEN"); @@ -3348,14 +3339,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlIfStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlElseIfStatement x) { - // TODO Auto-generated method stub - print("ELSE IF "); x.getCondition().accept(this); print(" THEN"); @@ -3374,13 +3362,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlElseIfStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlElseStatement x) { - // TODO Auto-generated method stub print("ELSE "); println(); for (int i = 0, size = x.getStatements().size(); i < size; ++i) { @@ -3397,22 +3383,17 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlElseStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlCaseStatement x) { - // TODO Auto-generated method stub print("CASE "); x.getCondition().accept(this); println(); for (int i = 0; i < x.getWhenList().size(); i++) { x.getWhenList().get(i).accept(this); -// if (i != x.getWhenList().size() - 1) { -// println(); -// } } if(x.getElseItem()!=null) x.getElseItem().accept(this); @@ -3422,16 +3403,12 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlCaseStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlDeclareStatement x) { - // TODO Auto-generated method stub - print("DECLARE "); - for (int i = 0; i < x.getVarList().size(); i++) { x.getVarList().get(i).accept(this); if(i!=x.getVarList().size()-1) @@ -3439,39 +3416,33 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } print(" "); x.getType().accept(this); - return false; } @Override public void endVisit(MySqlDeclareStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlSelectIntoStatement x) { - // TODO Auto-generated method stub x.getSelect().accept(this); print(" INTO "); for (int i = 0; i < x.getVarList().size(); i++) { x.getVarList().get(i).accept(this); if(i!=x.getVarList().size()-1) print(","); - //println(x.getVarList().get(i).toString()); } return false; } @Override public void endVisit(MySqlSelectIntoStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlWhenfStatement x) { - // TODO Auto-generated method stub print("WHEN "); x.getCondition().accept(this); println(" THEN"); @@ -3487,7 +3458,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlWhenfStatement x) { - // TODO Auto-generated method stub } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest1.java new file mode 100644 index 0000000000..92ce4b1470 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateProcedureTest1.java @@ -0,0 +1,70 @@ +/* + * 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: begin-end within begin-end + * @author zz email:455910092@qq.com + * @date 2015-9-14 + * @version V1.0 + */ +public class MySqlCreateProcedureTest1 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;"+ + " begin"+ + " insert into test values(id,age);"+ + " end"+ + " 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"))); + } +}