diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index f1b8b0fb83..f9fc40f61b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 7c8f9ee353..bd1eaa38f5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index fba5a274f6..b95d4ba101 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -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++; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java index dafb4e0459..3706ac730f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java @@ -26,6 +26,8 @@ import java.util.List; public class OracleExecuteImmediateStatement extends OracleStatementImpl { private SQLExpr dynamicSql; + + private boolean bulkCollect; private final List arguments = new ArrayList(); @@ -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)); 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 5650b2d68d..39a91143b3 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 @@ -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); 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 c55565a992..3a061140b7 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 @@ -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 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(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 9b8669bce4..bf4b6cc459 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -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 into = x.getInto(); if (into.size() > 0) { print0(ucase ? " INTO " : " into "); 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 7907eff5c1..f7f871c18c 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -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 body = this.parseStatementList(); + List body = this.parseStatementList(stmt); if (body == null || body.isEmpty()) { throw new ParserException("syntax error"); } 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 a03b208b0b..e44914e303 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -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("@@"), diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 25be7f23d6..be99fd01b5 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -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 partitions) { if (partitions.size() == 1 && "ALL".equalsIgnoreCase(partitions.get(0).getSimpleName())) { - print0(ucase ? "ALL" : "all"); + print0(ucase ? "ALL" : "all"); } else { printAndAccept(partitions, ", "); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java index a690ead775..4a978096c2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest.java @@ -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);"+ diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_4.java index 08df71aece..3fa7337936 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_4.java @@ -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" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTypeTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTypeTest10.java index 6a4b73ee90..c87df14a6b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTypeTest10.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTypeTest10.java @@ -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" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_for_1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_for_1.java index 06f51d8997..fb1fa40bc5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_for_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_for_1.java @@ -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" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_if_3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_if_3.java index cde9c8e277..fcaf97a914 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_if_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_if_3.java @@ -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" +