Merge pull request #958 from zhujunxxxxx/master

修复MySql存储过程中IF,CASE,WHILE语句结尾需要分号
This commit is contained in:
高铁
2015-09-14 22:25:52 +08:00
28 changed files with 1230 additions and 106 deletions
@@ -23,18 +23,18 @@ 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{
//case expr
private SQLExpr condition;
//when statement list
private List<MySqlWhenfStatement> whenList=new ArrayList<MySqlCaseStatement.MySqlWhenfStatement>();
private List<MySqlWhenStatement> whenList=new ArrayList<MySqlCaseStatement.MySqlWhenStatement>();
//else statement
private MySqlElseStatement elseItem;
@@ -46,15 +46,15 @@ public class MySqlCaseStatement extends MySqlStatementImpl{
this.condition = condition;
}
public List<MySqlWhenfStatement> getWhenList() {
public List<MySqlWhenStatement> getWhenList() {
return whenList;
}
public void setWhenList(List<MySqlWhenfStatement> whenList) {
public void setWhenList(List<MySqlWhenStatement> whenList) {
this.whenList = whenList;
}
public void addWhenStatement(MySqlWhenfStatement stmt)
public void addWhenStatement(MySqlWhenStatement stmt)
{
this.whenList.add(stmt);
}
@@ -83,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<SQLStatement> statements = new ArrayList<SQLStatement>();
@@ -24,9 +24,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;
@@ -20,13 +20,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{
@@ -23,9 +23,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 {
@@ -25,9 +25,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;
@@ -70,9 +72,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 {
@@ -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;
}
}
@@ -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;
}
}
@@ -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<SQLStatement> statements = new ArrayList<SQLStatement>();
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, statements);
}
visitor.endVisit(this);
}
public List<SQLStatement> getStatements() {
return statements;
}
public void setStatements(List<SQLStatement> statements) {
this.statements = statements;
}
public String getLabelName() {
return labelName;
}
public void setLabelName(String labelName) {
this.labelName = labelName;
}
}
@@ -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 {
@@ -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<SQLStatement> statements = new ArrayList<SQLStatement>();
private SQLExpr condition;
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, statements);
acceptChild(visitor, condition);
}
visitor.endVisit(this);
}
public List<SQLStatement> getStatements() {
return statements;
}
public void setStatements(List<SQLStatement> 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;
}
}
@@ -23,9 +23,11 @@ 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{
@@ -23,9 +23,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
@@ -24,17 +24,29 @@ 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<SQLStatement> statements = new ArrayList<SQLStatement>();
//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)) {
@@ -23,7 +23,13 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlBlockStatement extends MySqlStatementImpl {
private List<SQLStatement> statementList = new ArrayList<SQLStatement>();
/**
* begin-end block label name
* @author zz
*/
private String labelName;
private List<SQLStatement> statementList = new ArrayList<SQLStatement>();
public List<SQLStatement> 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)) {
@@ -20,9 +20,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 {
@@ -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<SQLExpr> argsList;
@@ -187,7 +189,10 @@ public class MySqlSelectIntoParser extends SQLSelectParser {
return queryRest(queryBlock);
}
/**
* parser the select into arguments
* @return
*/
protected List<SQLExpr> parseIntoArgs() {
List<SQLExpr> args=new ArrayList<SQLExpr>();
@@ -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;
@@ -714,8 +718,6 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlBlockStatement block = new MySqlBlockStatement();
accept(Token.BEGIN);
//parseStatementList(block.getStatementList());
parseProcedureStatementList(block.getStatementList());
accept(Token.END);
@@ -2842,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());
@@ -2932,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,8 +2959,63 @@ public class MySqlStatementParser extends SQLStatementParser {
if (lexer.token() == Token.DECLARE) {
statementList.add(this.parseDeclare());
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());
}
@@ -2995,6 +3061,7 @@ public class MySqlStatementParser extends SQLStatementParser {
accept(Token.END);
accept(Token.IF);
accept(Token.SEMI);
return stmt;
}
@@ -3016,6 +3083,37 @@ public class MySqlStatementParser extends SQLStatementParser {
accept(Token.END);
accept(Token.WHILE);
accept(Token.SEMI);
return stmt;
}
/**
* 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;
@@ -3034,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());
@@ -3060,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());
@@ -3082,7 +3180,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
accept(Token.END);
accept(Token.CASE);
accept(Token.SEMI);
return stmt;
}
@@ -3140,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;
}
}
@@ -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);
} //
@@ -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
}
} //
@@ -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;
}
@@ -3212,12 +3220,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 +3260,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 +3292,13 @@ 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
if(x.getLabelName()!=null&&!x.getLabelName().equals(""))
print(x.getLabelName()+": ");
print("WHILE ");
x.getCondition().accept(this);
print(" DO");
@@ -3310,18 +3313,18 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
println();
print("END WHILE");
if(x.getLabelName()!=null&&!x.getLabelName().equals(""))
print(" "+x.getLabelName());
return false;
}
@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 +3351,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 +3374,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 +3395,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 +3415,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 +3428,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
public boolean visit(MySqlWhenStatement x) {
print("WHEN ");
x.getCondition().accept(this);
println(" THEN");
@@ -3486,7 +3469,88 @@ 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
}
@@ -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
}
@@ -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);
}
@@ -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"),