mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Merge pull request #958 from zhujunxxxxx/master
修复MySql存储过程中IF,CASE,WHILE语句结尾需要分号
This commit is contained in:
+9
-9
@@ -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>();
|
||||
|
||||
+4
-3
@@ -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;
|
||||
|
||||
+5
-4
@@ -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{
|
||||
|
||||
|
||||
+5
-3
@@ -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 {
|
||||
|
||||
|
||||
+46
@@ -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 {
|
||||
|
||||
|
||||
+73
@@ -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;
|
||||
}
|
||||
}
|
||||
+5
-3
@@ -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{
|
||||
|
||||
|
||||
+5
-3
@@ -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
|
||||
|
||||
+16
-4
@@ -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)) {
|
||||
|
||||
+15
-1
@@ -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)) {
|
||||
|
||||
+5
-3
@@ -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>();
|
||||
|
||||
+210
-8
@@ -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);
|
||||
} //
|
||||
|
||||
+55
-3
@@ -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
|
||||
|
||||
}
|
||||
|
||||
+63
-8
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user