修复#4027 testcase不通过

This commit is contained in:
raysonfang
2020-11-10 17:45:15 +08:00
parent 91490f2e7c
commit 1fbae5f3ab
15 changed files with 224 additions and 155 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);
@@ -9103,6 +9099,8 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlLeaveStatement leaveStmt = new MySqlLeaveStatement();
leaveStmt.setLabelName(exprParser.name().getSimpleName());
accept(Token.SEMI);
leaveStmt.setAfterSemi(true);
return leaveStmt;
}
@@ -9172,7 +9170,8 @@ public class MySqlStatementParser extends SQLStatementParser {
stmt.setSelect(select);
accept(Token.SEMI);
stmt.setAfterSemi(true);
return stmt;
}
@@ -9308,7 +9307,8 @@ public class MySqlStatementParser extends SQLStatementParser {
if (!(stmt.getSpStatement() instanceof SQLBlockStatement)) {
accept(Token.SEMI);
}
stmt.setAfterSemi(true);
return stmt;
}
@@ -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++;
@@ -26,6 +26,8 @@ import java.util.List;
public class OracleExecuteImmediateStatement extends OracleStatementImpl {
private SQLExpr dynamicSql;
private boolean bulkCollect;
private final List<SQLArgument> arguments = new ArrayList<SQLArgument>();
@@ -86,6 +88,14 @@ public class OracleExecuteImmediateStatement extends OracleStatementImpl {
}
this.dynamicSql = dynamicSql;
}
public boolean isBulkCollect() {
return bulkCollect;
}
public void setBulkCollect(boolean bulkCollect) {
this.bulkCollect = bulkCollect;
}
public void setDynamicSql(String dynamicSql) {
this.setDynamicSql(new SQLCharExpr(dynamicSql));
@@ -49,7 +49,8 @@ public class OracleLexer extends Lexer {
map.put("GOTO", Token.GOTO);
map.put("IF", Token.IF);
map.put("ELSIF", Token.ELSIF);
map.put("RECORD", Token.RECORD);
map.put("LIMIT", Token.LIMIT);
map.put("LOOP", Token.LOOP);
map.put("MATCHED", Token.MATCHED);
@@ -168,6 +168,9 @@ public class OracleStatementParser extends SQLStatementParser {
SQLStatement stmt = parseBlock();
stmt.setParent(parent);
statementList.add(stmt);
if(parent instanceof SQLCreateTriggerStatement) {
return;
}
continue;
}
@@ -785,10 +788,13 @@ public class OracleStatementParser extends SQLStatementParser {
lexer.nextToken();
OracleExecuteImmediateStatement stmt = new OracleExecuteImmediateStatement();
SQLExpr dyanmiacSql = this.exprParser.primary();
SQLExpr dyanmiacSql = this.exprParser.expr();
stmt.setDynamicSql(dyanmiacSql);
if (lexer.identifierEquals("BULK")) {
lexer.nextToken();
acceptIdentifier("COLLECT");
stmt.setBulkCollect(true);
}
if (lexer.token() == Token.INTO) {
lexer.nextToken();
@@ -898,7 +904,7 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.END);
accept(Token.LOOP);
accept(Token.SEMI);
stmt.setAfterSemi(true);
return stmt;
}
@@ -1900,6 +1906,7 @@ public class OracleStatementParser extends SQLStatementParser {
|| lexer.token() == Token.TABLE) {
break;
} else if (lexer.identifierEquals(FnvHash.Constants.TYPE)) {
lexer.nextToken();
name = this.exprParser.name();
accept(Token.IS);
@@ -1914,7 +1921,7 @@ public class OracleStatementParser extends SQLStatementParser {
lexer.nextToken();
accept(Token.OF);
name = this.exprParser.name();
SQLName tname = this.exprParser.name();
if (lexer.token() == Token.PERCENT) {
lexer.nextToken();
@@ -1922,10 +1929,15 @@ public class OracleStatementParser extends SQLStatementParser {
String typeName;
if (lexer.identifierEquals(FnvHash.Constants.ROWTYPE)) {
lexer.nextToken();
typeName = "TABLE OF " + name.toString() + "%ROWTYPE";
typeName = "TABLE OF " + tname.toString() + "%ROWTYPE";
} else if (lexer.token() == Token.LPAREN && lexer.stringVal().equalsIgnoreCase("Varchar2")) {
accept(Token.LPAREN);
int len = this.exprParser.acceptInteger();
accept(Token.RPAREN);
typeName = "TABLE OF " + tname.toString() + "(" + len + ")";
} else {
acceptIdentifier("TYPE");
typeName = "TABLE OF " + name.toString() + "%TYPE";
typeName = "TABLE OF " + tname.toString() + "%TYPE";
}
dataType = new SQLDataTypeImpl(typeName);
@@ -1944,6 +1956,8 @@ public class OracleStatementParser extends SQLStatementParser {
SQLExpr indexBy = this.exprParser.primary();
((SQLDataTypeImpl) dataType).setIndexBy(indexBy);
}
}else if (lexer.token() == Token.SEMI) {
dataType = new SQLDataTypeImpl("TABLE OF " + tname.toString());
}
dataType.setDbType(dbType);
} else if (lexer.identifierEquals("VARRAY")) {
@@ -1979,6 +1993,18 @@ public class OracleStatementParser extends SQLStatementParser {
} else {
throw new ParserException("TODO : " + lexer.info());
}
} else if (lexer.token() == Token.RECORD) {
lexer.nextToken();
String typeName = "RECORD";
SQLRecordDataType sqlRecordDataType = new SQLRecordDataType();
sqlRecordDataType.setDbType(dbType);
sqlRecordDataType.setName(typeName);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
this.parseColumnsList(sqlRecordDataType.getColumns(), sqlRecordDataType);
accept(Token.RPAREN);
}
dataType = sqlRecordDataType;
} else {
throw new ParserException("TODO : " + lexer.info());
}
@@ -2104,7 +2130,19 @@ public class OracleStatementParser extends SQLStatementParser {
break;
}
}
private void parseColumnsList(List<SQLColumnDefinition> columns, SQLObject parent) {
for ( ; ; ) {
SQLColumnDefinition columnDefinition = this.exprParser.parseColumn();
columns.add(columnDefinition);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
}
public OracleSelectParser createSQLSelectParser() {
return new OracleSelectParser(this.exprParser, selectListCache);
}
@@ -2781,7 +2819,7 @@ public class OracleStatementParser extends SQLStatementParser {
if (type) {
accept(Token.IS);
if (lexer.identifierEquals(FnvHash.Constants.RECORD)) {
if (lexer.token() == Token.RECORD) {
lexer.nextToken();
SQLRecordDataType recordDataType = new SQLRecordDataType();
@@ -1523,7 +1523,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
@Override
public boolean visit(SQLIfStatement.ElseIf x) {
print0(ucase ? "ELSE IF " : "else if ");
print0(ucase ? "ELSIF " : "elsif ");
x.getCondition().accept(this);
print0(ucase ? " THEN" : " then");
this.indentCount++;
@@ -2612,7 +2612,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public boolean visit(OracleExecuteImmediateStatement x) {
print0(ucase ? "EXECUTE IMMEDIATE " : "execute immediate ");
x.getDynamicSql().accept(this);
if (x.isBulkCollect()) {
print0(ucase ? " BULK COLLECT " : " bulk collect ");
}
List<SQLExpr> into = x.getInto();
if (into.size() > 0) {
print0(ucase ? " INTO " : " into ");
@@ -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) {
@@ -590,6 +595,9 @@ public class SQLStatementParser extends SQLParser {
SQLStatement dialectStmt = statementList.get(j);
dialectStmt.setParent(parent);
}
if (parent instanceof SQLCreateTriggerStatement) {
return;
}
}
continue;
@@ -3843,7 +3851,7 @@ public class SQLStatementParser extends SQLParser {
stmt.setWhen(condition);
}
List<SQLStatement> body = this.parseStatementList();
List<SQLStatement> body = this.parseStatementList(stmt);
if (body == null || body.isEmpty()) {
throw new ParserException("syntax error");
}
@@ -16,56 +16,56 @@
package com.alibaba.druid.sql.parser;
/**
*
* SQL Token
*
* SQL Token
* @author wenshao [szujobs@hotmail.com]
*/
public enum Token {
SELECT("SELECT"),
DELETE("DELETE"),
INSERT("INSERT"),
UPDATE("UPDATE"),
SELECT("SELECT"),
DELETE("DELETE"),
INSERT("INSERT"),
UPDATE("UPDATE"),
FROM("FROM"),
HAVING("HAVING"),
WHERE("WHERE"),
ORDER("ORDER"),
FROM("FROM"),
HAVING("HAVING"),
WHERE("WHERE"),
ORDER("ORDER"),
BY("BY"),
GROUP("GROUP"),
INTO("INTO"),
AS("AS"),
GROUP("GROUP"),
INTO("INTO"),
AS("AS"),
CREATE("CREATE"),
ALTER("ALTER"),
DROP("DROP"),
SET("SET"),
ALTER("ALTER"),
DROP("DROP"),
SET("SET"),
NULL("NULL"),
NOT("NOT"),
NULL("NULL"),
NOT("NOT"),
DISTINCT("DISTINCT"),
TABLE("TABLE"),
TABLESPACE("TABLESPACE"),
VIEW("VIEW"),
SEQUENCE("SEQUENCE"),
TRIGGER("TRIGGER"),
USER("USER"),
INDEX("INDEX"),
TABLE("TABLE"),
TABLESPACE("TABLESPACE"),
VIEW("VIEW"),
SEQUENCE("SEQUENCE"),
TRIGGER("TRIGGER"),
USER("USER"),
INDEX("INDEX"),
SESSION("SESSION"),
PROCEDURE("PROCEDURE"),
FUNCTION("FUNCTION"),
PRIMARY("PRIMARY"),
KEY("KEY"),
DEFAULT("DEFAULT"),
CONSTRAINT("CONSTRAINT"),
CHECK("CHECK"),
UNIQUE("UNIQUE"),
FOREIGN("FOREIGN"),
REFERENCES("REFERENCES"),
PRIMARY("PRIMARY"),
KEY("KEY"),
DEFAULT("DEFAULT"),
CONSTRAINT("CONSTRAINT"),
CHECK("CHECK"),
UNIQUE("UNIQUE"),
FOREIGN("FOREIGN"),
REFERENCES("REFERENCES"),
EXPLAIN("EXPLAIN"),
FOR("FOR"),
EXPLAIN("EXPLAIN"),
FOR("FOR"),
IF("IF"),
@@ -73,55 +73,55 @@ public enum Token {
GLOBAL("GLOBAL"),
ALL("ALL"),
UNION("UNION"),
EXCEPT("EXCEPT"),
INTERSECT("INTERSECT"),
EXCEPT("EXCEPT"),
INTERSECT("INTERSECT"),
MINUS("MINUS"),
INNER("INNER"),
LEFT("LEFT"),
RIGHT("RIGHT"),
FULL("FULL"),
OUTER("OUTER"),
INNER("INNER"),
LEFT("LEFT"),
RIGHT("RIGHT"),
FULL("FULL"),
OUTER("OUTER"),
JOIN("JOIN"),
STRAIGHT_JOIN("STRAIGHT_JOIN"),
ON("ON"),
SCHEMA("SCHEMA"),
SCHEMA("SCHEMA"),
CAST("CAST"),
COLUMN("COLUMN"),
USE("USE"),
DATABASE("DATABASE"),
TO("TO"),
AND("AND"),
OR("OR"),
XOR("XOR"),
CASE("CASE"),
WHEN("WHEN"),
THEN("THEN"),
AND("AND"),
OR("OR"),
XOR("XOR"),
CASE("CASE"),
WHEN("WHEN"),
THEN("THEN"),
ELSE("ELSE"),
ELSIF("ELSIF"),
END("END"),
EXISTS("EXISTS"),
END("END"),
EXISTS("EXISTS"),
IN("IN"),
NEW("NEW"),
ASC("ASC"),
DESC("DESC"),
IS("IS"),
LIKE("LIKE"),
ESCAPE("ESCAPE"),
BETWEEN("BETWEEN"),
VALUES("VALUES"),
NEW("NEW"),
ASC("ASC"),
DESC("DESC"),
IS("IS"),
LIKE("LIKE"),
ESCAPE("ESCAPE"),
BETWEEN("BETWEEN"),
VALUES("VALUES"),
INTERVAL("INTERVAL"),
LOCK("LOCK"),
SOME("SOME"),
LOCK("LOCK"),
SOME("SOME"),
ANY("ANY"),
TRUNCATE("TRUNCATE"),
RETURN("RETURN"),
// mysql
TRUE("TRUE"),
TRUE("TRUE"),
FALSE("FALSE"),
LIMIT("LIMIT"),
KILL("KILL"),
@@ -132,7 +132,7 @@ public enum Token {
SHOW("SHOW"),
REPLACE("REPLACE"),
PERIOD("PERIOD"),
ELSEIF("ELSEIF"),
BITS,
// MySql procedure add by zz
@@ -211,6 +211,7 @@ public enum Token {
COMMIT("COMMIT"),
SAVEPOINT("SAVEPOINT"),
CROSS("CROSS"),
RECORD("RECORD"),
PCTFREE("PCTFREE"),
INITRANS("INITRANS"),
@@ -253,7 +254,7 @@ public enum Token {
// hive
EOF,
EOF,
ERROR,
IDENTIFIER,
HINT,
@@ -298,19 +299,19 @@ public enum Token {
UPSERT("UPSERT"), // Phoenix
LPAREN("("),
RPAREN(")"),
LBRACE("{"),
RBRACE("}"),
LBRACKET("["),
RBRACKET("]"),
SEMI(";"),
COMMA(","),
DOT("."),
DOTDOT(".."),
DOTDOTDOT("..,"),
EQ("="),
GT(">"),
LPAREN("("),
RPAREN(")"),
LBRACE("{"),
RBRACE("}"),
LBRACKET("["),
RBRACKET("]"),
SEMI(";"),
COMMA(","),
DOT("."),
DOTDOT(".."),
DOTDOTDOT("..,"),
EQ("="),
GT(">"),
LT("<"),
LT_SUB_GT("<->"),
BANG("!"),
@@ -324,34 +325,34 @@ public enum Token {
QUESQUES("??"),
QUESBAR("?|"),
QUESAMP("?&"),
COLON(":"),
COLONCOLON("::"),
COLONEQ(":="),
COLON(":"),
COLONCOLON("::"),
COLONEQ(":="),
EQEQ("=="),
EQGT("=>"),
LTEQ("<="),
LTEQGT("<=>"),
LTGT("<>"),
GTEQ(">="),
BANGEQ("!="),
BANGGT("!>"),
LTEQ("<="),
LTEQGT("<=>"),
LTGT("<>"),
GTEQ(">="),
BANGEQ("!="),
BANGGT("!>"),
BANGLT("!<"),
AMPAMP("&&"),
BARBAR("||"),
BARBARSLASH("||/"),
BARSLASH("|/"),
PLUS("+"),
SUB("-"),
SUBGT("->"),
SUBGTGT("->>"),
STAR("*"),
SLASH("/"),
AMP("&"),
BAR("|"),
AMPAMP("&&"),
BARBAR("||"),
BARBARSLASH("||/"),
BARSLASH("|/"),
PLUS("+"),
SUB("-"),
SUBGT("->"),
SUBGTGT("->>"),
STAR("*"),
SLASH("/"),
AMP("&"),
BAR("|"),
CARET("^"),
CARETEQ("^="),
PERCENT("%"),
LTLT("<<"),
PERCENT("%"),
LTLT("<<"),
GTGT(">>"),
MONKEYS_AT("@"),
MONKEYS_AT_AT("@@"),
@@ -2890,6 +2890,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
} else if (expr instanceof SQLMethodInvokeExpr) {
visit((SQLMethodInvokeExpr) expr);
} else if (expr instanceof SQLListExpr
&& expr.getParent().getParent() instanceof SQLCreateTriggerStatement) {
printAndAccept(((SQLListExpr) expr).getItems(), ", ");
} else {
expr.accept(this);
}
@@ -4385,19 +4390,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
if (x.isDropStorage()) {
print0(ucase ? " DROP STORAGE" : " drop storage");
print0(ucase ? " DROP STORAGE" : " drop storage");
}
if (x.isReuseStorage()) {
print0(ucase ? " REUSE STORAGE" : " reuse storage");
print0(ucase ? " REUSE STORAGE" : " reuse storage");
}
if (x.isIgnoreDeleteTriggers()) {
print0(ucase ? " IGNORE DELETE TRIGGERS" : " ignore delete triggers");
print0(ucase ? " IGNORE DELETE TRIGGERS" : " ignore delete triggers");
}
if (x.isRestrictWhenDeleteTriggers()) {
print0(ucase ? " RESTRICT WHEN DELETE TRIGGERS" : " restrict when delete triggers");
print0(ucase ? " RESTRICT WHEN DELETE TRIGGERS" : " restrict when delete triggers");
}
if (x.isContinueIdentity()) {
@@ -4405,7 +4410,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
}
if (x.isImmediate()) {
print0(ucase ? " IMMEDIATE" : " immediate");
print0(ucase ? " IMMEDIATE" : " immediate");
}
return false;
@@ -5098,7 +5103,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
@Override
public boolean visit(SQLKeep x) {
if (x.getDenseRank() == SQLKeep.DenseRank.FIRST) {
print0(ucase ? "KEEP (DENSE_RANK FIRST " : "keep (dense_rank first ");
print0(ucase ? "KEEP (DENSE_RANK FIRST " : "keep (dense_rank first ");
} else {
print0(ucase ? "KEEP (DENSE_RANK LAST " : "keep (dense_rank last ");
}
@@ -6825,7 +6830,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
String dataTypeName = dataType.getName();
boolean printType = (dataTypeName.startsWith("TABLE OF") && x.getDefaultValue() == null)
|| dataTypeName.equalsIgnoreCase("REF CURSOR")
|| dataTypeName.startsWith("VARRAY(");
|| dataTypeName.startsWith("VARRAY(")
|| dataTypeName.startsWith("RECORD");
if (printType) {
print0(ucase ? "TYPE " : "type ");
}
@@ -7470,7 +7476,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
protected void printPartitions(List<SQLName> partitions) {
if (partitions.size() == 1 && "ALL".equalsIgnoreCase(partitions.get(0).getSimpleName())) {
print0(ucase ? "ALL" : "all");
print0(ucase ? "ALL" : "all");
} else {
printAndAccept(partitions, ", ");
}
@@ -40,7 +40,7 @@ public class MySqlCreateProcedureTest extends MysqlTest {
" if x then"+
" insert into test values(id,age);"+
" insert into test values(id,age);"+
" else if y then"+
" elseif y then"+
" insert into test values(id,age);"+
" while x do"+
" insert into test values(id,age);"+
@@ -83,7 +83,7 @@ public class OracleCreateFunctionTest_4 extends OracleTest {
"BEGIN\n" +
"\tIF I = 0 THEN\n" +
"\t\tT_STR := STR;\n" +
"\tELSE IF INSTR(STR, SEP) = 0 THEN\n" +
"\tELSIF INSTR(STR, SEP) = 0 THEN\n" +
"\t\tT_STR := SEP;\n" +
"\tELSE\n" +
"\t\tSELECT COUNT(*)\n" +
@@ -99,7 +99,7 @@ public class OracleCreateTypeTest10 extends OracleTest {
"\tBEGIN\n" +
"\t\tIF ctx2.currentstr IS NULL THEN\n" +
"\t\t\tself.currentstr := self.currentstr;\n" +
"\t\tELSE IF self.currentstr IS NULL THEN\n" +
"\t\tELSIF self.currentstr IS NULL THEN\n" +
"\t\t\tself.currentstr := ctx2.currentstr;\n" +
"\t\tELSE\n" +
"\t\t\tself.currentstr := self.currentstr || currentseprator || ctx2.currentstr;\n" +
@@ -81,8 +81,8 @@ public class Oracle_pl_for_1 extends OracleTest {
System.out.println(output);
assertEquals("DECLARE\n" +
"\tTYPE empcurtyp IS REF CURSOR;\n" +
"\tTYPE employees.last_name IS TABLE OF employees.last_name%TYPE;\n" +
"\tTYPE employees.salary IS TABLE OF employees.salary%TYPE;\n" +
"\tTYPE namelist IS TABLE OF employees.last_name%TYPE;\n" +
"\tTYPE sallist IS TABLE OF employees.salary%TYPE;\n" +
"\temp_cv empcurtyp;\n" +
"\tnames namelist;\n" +
"\tsals sallist;\n" +
@@ -105,8 +105,8 @@ public class Oracle_pl_for_1 extends OracleTest {
String output = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("declare\n" +
"\ttype empcurtyp is REF CURSOR;\n" +
"\ttype employees.last_name is TABLE OF employees.last_name%TYPE;\n" +
"\ttype employees.salary is TABLE OF employees.salary%TYPE;\n" +
"\ttype namelist is TABLE OF employees.last_name%TYPE;\n" +
"\ttype sallist is TABLE OF employees.salary%TYPE;\n" +
"\temp_cv empcurtyp;\n" +
"\tnames namelist;\n" +
"\tsals sallist;\n" +
@@ -67,7 +67,7 @@ public class Oracle_pl_if_3 extends OracleTest {
String output = SQLUtils.toOracleString(stmt);
assertEquals("IF l_salary BETWEEN 10000 AND 20000 THEN\n" +
"\tgive_bonus(l_employee_id, 1000);\n" +
"ELSE IF l_salary > 20000 THEN\n" +
"ELSIF l_salary > 20000 THEN\n" +
"\tgive_bonus(l_employee_id, 500);\n" +
"ELSE\n" +
"\tgive_bonus(l_employee_id, 0);\n" +
@@ -78,7 +78,7 @@ public class Oracle_pl_if_3 extends OracleTest {
String output = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("if l_salary between 10000 and 20000 then\n" +
"\tgive_bonus(l_employee_id, 1000);\n" +
"else if l_salary > 20000 then\n" +
"elsif l_salary > 20000 then\n" +
"\tgive_bonus(l_employee_id, 500);\n" +
"else\n" +
"\tgive_bonus(l_employee_id, 0);\n" +