diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index fc05fb4596..f426034917 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -51,6 +51,7 @@ public class OracleLexer extends Lexer { map.put("EXTRACT", Token.EXTRACT); map.put("GOTO", Token.GOTO); map.put("IF", Token.IF); + map.put("ELSIF", Token.ELSIF); map.put("LIMIT", Token.LIMIT); map.put("LOOP", Token.LOOP); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 9b0a3c432a..3bc78381ca 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -148,7 +148,7 @@ public class OracleSelectParser extends SQLSelectParser { select.setRestriction(checkOption); } else { - throw new ParserException("syntax error"); + throw new ParserException("syntax error. " + lexer.info()); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index b9ffec7633..a5e0efaf8d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -104,7 +104,7 @@ public class OracleStatementParser extends SQLStatementParser { } } - public void parseStatementList(List statementList, int max) { + public void parseStatementList(List statementList, int max, SQLStatement parent) { for (;;) { if (max != -1) { if (statementList.size() >= max) { @@ -459,6 +459,10 @@ public class OracleStatementParser extends SQLStatementParser { continue; } + if (lexer.token() == Token.ELSIF && parent instanceof SQLIfStatement) { + break; + } + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } } @@ -472,7 +476,20 @@ public class OracleStatementParser extends SQLStatementParser { accept(Token.THEN); - this.parseStatementList(stmt.getStatements()); + this.parseStatementList(stmt.getStatements(), -1, stmt); + + while (lexer.token() == Token.ELSIF) { + lexer.nextToken(); + + SQLIfStatement.ElseIf elseIf = new SQLIfStatement.ElseIf(); + + elseIf.setCondition(this.exprParser.expr()); + + accept(Token.THEN); + this.parseStatementList(elseIf.getStatements(), -1, stmt); + + stmt.getElseIfList().add(elseIf); + } while (lexer.token() == Token.ELSE) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index a17a961e63..0b428fd7d6 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -80,6 +80,10 @@ public class SQLStatementParser extends SQLParser { } public void parseStatementList(List statementList, int max) { + parseStatementList(statementList, max, null); + } + + public void parseStatementList(List statementList, int max, SQLStatement parent) { for (;;) { if (max != -1) { if (statementList.size() >= max) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 1f63761589..4cabeddadf 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -95,7 +95,8 @@ public enum Token { CASE("CASE"), WHEN("WHEN"), THEN("THEN"), - ELSE("ELSE"), + ELSE("ELSE"), + ELSIF("ELSIF"), END("END"), EXISTS("EXISTS"), IN("IN"),