mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug: mysql支持解析if...elseif...elseif...end
This commit is contained in:
@@ -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);
|
||||
|
||||
+17
-21
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user