bug: mysql支持解析if...elseif...elseif...end

This commit is contained in:
fanglei
2020-11-03 13:26:17 +08:00
parent 323fbff638
commit 4b3ed4c714
6 changed files with 58 additions and 24 deletions
@@ -39,6 +39,7 @@ public class MySqlLexer extends Lexer {
map.put("DUAL", Token.DUAL);
map.put("FALSE", Token.FALSE);
map.put("IF", Token.IF);
map.put("ELSEIF", Token.ELSEIF);
map.put("KILL", Token.KILL);
map.put("LIMIT", Token.LIMIT);
@@ -8818,28 +8818,24 @@ public class MySqlStatementParser extends SQLStatementParser {
this.parseStatementList(stmt.getStatements(), -1, stmt);
while (lexer.token() == Token.ELSE) {
while (lexer.token() == Token.ELSEIF) {
lexer.nextToken();
if (lexer.token() == Token.IF) {
lexer.nextToken();
SQLIfStatement.ElseIf elseIf = new SQLIfStatement.ElseIf();
elseIf.setCondition(this.exprParser.expr());
elseIf.setParent(stmt);
accept(Token.THEN);
this.parseStatementList(elseIf.getStatements(), -1, elseIf);
stmt.getElseIfList().add(elseIf);
} else {
SQLIfStatement.Else elseItem = new SQLIfStatement.Else();
this.parseStatementList(elseItem.getStatements(), -1, elseItem);
stmt.setElseItem(elseItem);
break;
}
SQLIfStatement.ElseIf elseIf = new SQLIfStatement.ElseIf();
elseIf.setCondition(this.exprParser.expr());
elseIf.setParent(stmt);
accept(Token.THEN);
this.parseStatementList(elseIf.getStatements(), -1, stmt);
stmt.getElseIfList().add(elseIf);
}
if(lexer.token() == Token.ELSE) {
lexer.nextToken();
SQLIfStatement.Else elseItem = new SQLIfStatement.Else();
this.parseStatementList(elseItem.getStatements(), -1, elseItem);
stmt.setElseItem(elseItem);
}
accept(Token.END);
@@ -4261,7 +4261,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public boolean visit(SQLIfStatement.ElseIf x) {
print0(ucase ? "ELSE IF " : "else if ");
print0(ucase ? "ELSEIF " : "elseif ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
this.indentCount++;
@@ -582,7 +582,12 @@ public class SQLStatementParser extends SQLParser {
stmt.setParent(parent);
continue;
}
if (lexer.token() == Token.ELSEIF
&& parent instanceof SQLIfStatement) {
break;
}
int size = statementList.size();
if (parseStatementListDialect(statementList)) {
if (parent != null) {
@@ -132,7 +132,7 @@ public enum Token {
SHOW("SHOW"),
REPLACE("REPLACE"),
PERIOD("PERIOD"),
ELSEIF("ELSEIF"),
BITS,
// MySql procedure add by zz
@@ -0,0 +1,32 @@
package com.alibaba.druid.sql.parser;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.List;
public class MySQL_IF_ELSEIF_Test extends TestCase {
public void test_IF_ELSEIF(){
String sql = "CREATE TRIGGER trg_test1 BEFORE INSERT ON test_table_name FOR EACH ROW\n" +
"begin\n" +
"\tIF new.BSRQ IS NOT NULL THEN\n" +
"\t\tset new.SJRQ1 = new.BSRQ;\n" +
"\tELSEIF new.SJRQ1 IS NOT NULL THEN\n" +
"\t\tset new.BSRQ = new.SJRQ1;\n" +
"\t\tset new.SJRQ2 =new.SJRQ1;\n" +
" ELSEIF new.SJRQ2 IS NOT NULL THEN\n" +
"\t\tset new.SJRQ1 =new.SJRQ2;\n" +
"\tEND IF;\n" +
"end;";
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
StringBuilder out = new StringBuilder();
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmtList.get(0).accept(visitor);
System.out.println(stmtList.get(0).toString());
}
}