diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index edc39ceb25..8246a29411 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -810,5 +810,54 @@ public class SQLUtils { return false; } + + public static SQLCaseExpr decodeToCase(SQLMethodInvokeExpr x) { + if (x == null) { + return null; + } + + if (!"decode".equalsIgnoreCase(x.getMethodName())) { + throw new IllegalArgumentException(x.getMethodName()); + } + + List parameters = x.getParameters(); + SQLCaseExpr caseExpr = new SQLCaseExpr(); + + caseExpr.setValueExpr(parameters.get(0)); + + for (int i = 1; i + 1 < parameters.size(); i += 2) { + SQLCaseExpr.Item item = new SQLCaseExpr.Item(); + SQLExpr conditionExpr = parameters.get(i); + + item.setConditionExpr(conditionExpr); + + SQLExpr valueExpr = parameters.get(i + 1); + + if (valueExpr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) valueExpr; + if ("decode".equalsIgnoreCase(methodInvokeExpr.getMethodName())) { + valueExpr = decodeToCase(methodInvokeExpr); + } + } + + item.setValueExpr(valueExpr); + caseExpr.addItem(item); + } + + if (parameters.size() % 2 == 0) { + SQLExpr defaultExpr = parameters.get(parameters.size() - 1); + + if (defaultExpr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) defaultExpr; + if ("decode".equalsIgnoreCase(methodInvokeExpr.getMethodName())) { + defaultExpr = decodeToCase(methodInvokeExpr); + } + } + + caseExpr.setElseExpr(defaultExpr); + } + + return caseExpr; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java index c6761c4a45..62fb086a3c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java @@ -289,4 +289,12 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { return new SQLBinaryOpExpr(a, SQLBinaryOperator.BooleanAnd, b); } + + public static SQLBinaryOpExpr isNotNull(SQLExpr expr) { + return new SQLBinaryOpExpr(expr, SQLBinaryOperator.IsNot, new SQLNullExpr()); + } + + public static SQLBinaryOpExpr isNull(SQLExpr expr) { + return new SQLBinaryOpExpr(expr, SQLBinaryOperator.Is, new SQLNullExpr()); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQuery.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQuery.java index 22ee17c52a..9ebca55ed1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQuery.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQuery.java @@ -18,5 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLObject; public interface SQLSelectQuery extends SQLObject { + boolean isBracket(); + void setBracket(boolean bracket); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index c453e227b5..765cfc0076 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -25,7 +25,7 @@ import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery { - + private boolean bracket = false; protected int distionOption; protected final List selectList = new ArrayList(); @@ -376,4 +376,14 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery x.setLimit(limit.clone()); } } + + @Override + public boolean isBracket() { + return bracket; + } + + @Override + public void setBracket(boolean bracket) { + this.bracket = bracket; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java index f09b44a2c8..de985fe116 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java @@ -22,6 +22,8 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLUnionQuery extends SQLObjectImpl implements SQLSelectQuery { + private boolean bracket = false; + private SQLSelectQuery left; private SQLSelectQuery right; private SQLUnionOperator operator = SQLUnionOperator.UNION; @@ -96,4 +98,12 @@ public class SQLUnionQuery extends SQLObjectImpl implements SQLSelectQuery { } this.limit = limit; } + + public boolean isBracket() { + return bracket; + } + + public void setBracket(boolean bracket) { + this.bracket = bracket; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index 3134dad684..09561cca58 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -78,6 +78,7 @@ public class MySqlSelectParser extends SQLSelectParser { lexer.nextToken(); SQLSelectQuery select = query(); + select.setBracket(true); accept(Token.RPAREN); return queryRest(select); @@ -210,9 +211,12 @@ public class MySqlSelectParser extends SQLSelectParser { SQLTableSource tableSource; if (lexer.token() == Token.SELECT || lexer.token() == Token.WITH) { SQLSelect select = select(); + accept(Token.RPAREN); + SQLSelectQuery query = queryRest(select.getQuery()); if (query instanceof SQLUnionQuery) { + select.getQuery().setBracket(true); tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query); } else { tableSource = new SQLSubqueryTableSource(select); 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 55003751a5..ae670dbf7f 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 @@ -193,6 +193,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } public boolean visit(MySqlSelectQueryBlock x) { + final boolean bracket = x.isBracket(); + if (bracket) { + print('('); + } + if ((!isParameterized()) && isPrettyFormat() && x.hasBeforeComment()) { printComment(x.getBeforeCommentsDirect(), "\n"); } @@ -309,6 +314,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print0(ucase ? "LOCK IN SHARE MODE" : "lock in share mode"); } + if (bracket) { + print(')'); + } + return false; } @@ -716,10 +725,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } public boolean visit(SQLMethodInvokeExpr x) { + SQLExpr owner = x.getOwner(); if ("SUBSTRING".equalsIgnoreCase(x.getMethodName())) { - if (x.getOwner() != null) { - x.getOwner().accept(this); - print('.'); + if (owner != null) { + printMethodOwner(owner); } print0(x.getMethodName()); print('('); @@ -741,9 +750,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } if ("TRIM".equalsIgnoreCase(x.getMethodName())) { - if (x.getOwner() != null) { - x.getOwner().accept(this); - print('.'); + if (owner != null) { + printMethodOwner(owner); } print0(x.getMethodName()); print('('); @@ -768,9 +776,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } if (("CONVERT".equalsIgnoreCase(x.getMethodName())) || "CHAR".equalsIgnoreCase(x.getMethodName())) { - if (x.getOwner() != null) { - x.getOwner().accept(this); - print('.'); + if (owner != null) { + printMethodOwner(owner); } print0(x.getMethodName()); print('('); @@ -2569,37 +2576,37 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } - public boolean visit(SQLUnionQuery x) { - print('('); - x.getLeft().accept(this); - print(')'); - println(); - print0(ucase ? x.getOperator().name : x.getOperator().name_lcase); - println(); - - SQLSelectQuery right = x.getRight(); - boolean needParen = ! (right instanceof SQLUnionQuery); - - if (needParen) { - print('('); - right.accept(this); - print(')'); - } else { - right.accept(this); - } - - if (x.getOrderBy() != null) { - println(); - x.getOrderBy().accept(this); - } - - if (x.getLimit() != null) { - println(); - x.getLimit().accept(this); - } - - return false; - } +// public boolean visit(SQLUnionQuery x) { +// print('('); +// x.getLeft().accept(this); +// print(')'); +// println(); +// print0(ucase ? x.getOperator().name : x.getOperator().name_lcase); +// println(); +// +// SQLSelectQuery right = x.getRight(); +// boolean needParen = ! (right instanceof SQLUnionQuery); +// +// if (needParen) { +// print('('); +// right.accept(this); +// print(')'); +// } else { +// right.accept(this); +// } +// +// if (x.getOrderBy() != null) { +// println(); +// x.getOrderBy().accept(this); +// } +// +// if (x.getLimit() != null) { +// println(); +// x.getLimit().accept(this); +// } +// +// return false; +// } @Override public boolean visit(MySqlUseIndexHint x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index e2e4f76f1c..9d9716b612 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -19,11 +19,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import com.alibaba.druid.sql.ast.SQLDataType; -import com.alibaba.druid.sql.ast.SQLHint; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.SQLSetQuantifier; -import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; @@ -242,32 +238,6 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis return false; } - public boolean visit(SQLCaseExpr x) { - incrementIndent(); - print0(ucase ? "CASE " : "case "); - if (x.getValueExpr() != null) { - x.getValueExpr().accept(this); - println(); - } - - for (int i = 0, size = x.getItems().size(); i < size; ++i) { - println(); - x.getItems().get(i).accept(this); - } - - if (x.getElseExpr() != null) { - println(); - print0(ucase ? "ELSE " : "else "); - x.getElseExpr().accept(this); - } - - decrementIndent(); - println(); - print0(ucase ? "END" : "end"); - - return false; - } - protected void printSelectList(List selectList) { incrementIndent(); for (int i = 0, size = selectList.size(); i < size; ++i) { @@ -685,16 +655,9 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis return false; } - public boolean visit(SQLMethodInvokeExpr x) { - if (x.getOwner() != null) { - x.getOwner().accept(this); - print(':'); - } - printFunctionName(x.getMethodName()); - print('('); - printAndAccept(x.getParameters(), ", "); - print(')'); - return false; + protected void printMethodOwner(SQLExpr owner) { + owner.accept(this); + print(':'); } protected void printJoinType(JoinType joinType) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGValuesQuery.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGValuesQuery.java index cde873d33e..d18195a582 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGValuesQuery.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGValuesQuery.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.PGSQLObjectImpl; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; public class PGValuesQuery extends PGSQLObjectImpl implements SQLSelectQuery { + private boolean bracket = false; private List values = new ArrayList(); @@ -39,4 +40,13 @@ public class PGValuesQuery extends PGSQLObjectImpl implements SQLSelectQuery { visitor.endVisit(this); } + @Override + public boolean isBracket() { + return bracket; + } + + @Override + public void setBracket(boolean bracket) { + this.bracket = bracket; + } } 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 a3610938d0..87c745c241 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -256,8 +256,17 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet SQLSelectItem selectItem = selectList.get(i); SQLExpr selectItemExpr = selectItem.getExpr(); if (i != 0) { - if (lineItemCount == selectListNumberOfLine - || selectItemExpr instanceof SQLQueryExpr) { + if (selectItemExpr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) selectItemExpr; + int paramCount = methodInvokeExpr.getParameters().size(); + lineItemCount += paramCount; + if (lineItemCount >= selectListNumberOfLine) { + lineItemCount = paramCount; + println(); + } + } else if (lineItemCount >= selectListNumberOfLine + || selectItemExpr instanceof SQLQueryExpr + || selectItemExpr instanceof SQLCaseExpr) { lineItemCount = 0; println(); } @@ -498,28 +507,53 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } public boolean visit(SQLCaseExpr x) { + incrementIndent(); print0(ucase ? "CASE " : "case "); if (x.getValueExpr() != null) { x.getValueExpr().accept(this); - print0(" "); } - printAndAccept(x.getItems(), " "); - - if (x.getElseExpr() != null) { - print0(ucase ? " ELSE " : " else "); - x.getElseExpr().accept(this); + for (int i = 0, size = x.getItems().size(); i < size; ++i) { + println(); + x.getItems().get(i).accept(this); } - print0(ucase ? " END" : " end"); + SQLExpr elExpr = x.getElseExpr(); + if (elExpr != null) { + println(); + print0(ucase ? "ELSE " : "else "); + if (elExpr instanceof SQLCaseExpr) { + incrementIndent(); + println(); + elExpr.accept(this); + decrementIndent(); + } else { + elExpr.accept(this); + } + } + + decrementIndent(); + println(); + print0(ucase ? "END" : "end"); + return false; } public boolean visit(SQLCaseExpr.Item x) { print0(ucase ? "WHEN " : "when "); - x.getConditionExpr().accept(this); + SQLExpr expr = x.getConditionExpr(); + expr.accept(this); print0(ucase ? " THEN " : " then "); - x.getValueExpr().accept(this); + SQLExpr valueExpr = x.getValueExpr(); + if (valueExpr instanceof SQLCaseExpr) { + incrementIndent(); + println(); + valueExpr.accept(this); + decrementIndent(); + } else { + valueExpr.accept(this); + } + return false; } @@ -861,13 +895,22 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } public boolean visit(SQLMethodInvokeExpr x) { - if (x.getOwner() != null) { - x.getOwner().accept(this); - print('.'); + SQLExpr owner = x.getOwner(); + if (owner != null) { + printMethodOwner(owner); } + printFunctionName(x.getMethodName()); print('('); - printAndAccept(x.getParameters(), ", "); + + List parameters = x.getParameters(); + for (int i = 0, size = parameters.size(); i < size; ++i) { + if (i != 0) { + print0(", "); + } + SQLExpr param = x.getParameters().get(i); + param.accept(this); + } SQLExpr from = x.getFrom(); if (from != null) { @@ -879,6 +922,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return false; } + protected void printMethodOwner(SQLExpr owner) { + owner.accept(this); + print('.'); + } + protected void printFunctionName(String name) { print0(name); } @@ -1859,28 +1907,26 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLUnionQuery x) { SQLUnionOperator operator = x.getOperator(); - boolean mysqlUnion = (JdbcConstants.MYSQL.equals(dbType) // - && (operator == SQLUnionOperator.UNION || operator == SQLUnionOperator.UNION_ALL)); + boolean bracket = x.isBracket(); - if (mysqlUnion) { + if (bracket) { print('('); } x.getLeft().accept(this); - if (mysqlUnion) { - print(')'); - } + println(); print0(ucase ? operator.name : operator.name_lcase); println(); - boolean needParen = x.getOrderBy() != null || mysqlUnion; + SQLSelectQuery right = x.getRight(); + boolean needParen = x.getOrderBy() != null && !right.isBracket(); if (needParen) { print('('); - x.getRight().accept(this); + right.accept(this); print(')'); } else { - x.getRight().accept(this); + right.accept(this); } if (x.getOrderBy() != null) { @@ -1888,6 +1934,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet x.getOrderBy().accept(this); } + if (bracket) { + print(')'); + } + return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java index c9268d275d..1dc307b2d9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java @@ -60,11 +60,11 @@ public class PagerUtilsTest_Count_MySql_0 extends TestCase { String result = PagerUtils.count(sql, JdbcConstants.MYSQL); Assert.assertEquals("SELECT COUNT(*)\n" + "FROM (\n" + - "\t(SELECT id, name\n" + - "\tFROM t1)\n" + + "\tSELECT id, name\n" + + "\tFROM t1\n" + "\tUNION\n" + - "\t(SELECT id, name\n" + - "\tFROM t2)\n" + + "\tSELECT id, name\n" + + "\tFROM t2\n" + ") ALIAS_COUNT", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java index d9e5330624..c7eb16e634 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java @@ -31,16 +31,15 @@ public class DMLSelectParserTest extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("(SELECT id\n" + // - "FROM t1)\n" + // - "UNION ALL\n" + // - "(SELECT id\n" + // - "FROM t2)\n" + // - "UNION ALL\n" + // - "(SELECT id\n" + // - "FROM t3)\n" + // - "ORDER BY d DESC\n" + // - "LIMIT ?, 1", output); + Assert.assertEquals("(SELECT id\n" + + "FROM t1)\n" + + "UNION ALL\n" + + "(SELECT id\n" + + "FROM t2)\n" + + "UNION ALL\n" + + "(SELECT id\n" + + "FROM t3)\n" + + "ORDER BY d DESC", output); } public void test_union_1() throws Exception { @@ -49,16 +48,16 @@ public class DMLSelectParserTest extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("(SELECT id\n" + // - "FROM t1)\n" + // - "UNION\n" + // - "(SELECT id\n" + // - "FROM t2\n" + // - "ORDER BY id)\n" + // - "UNION ALL\n" + // - "(SELECT id\n" + // - "FROM t3)\n" + // - "ORDER BY d ASC", output); + assertEquals("(SELECT id\n" + + "FROM t1)\n" + + "UNION\n" + + "SELECT id\n" + + "FROM t2\n" + + "ORDER BY id\n" + + "UNION ALL\n" + + "(SELECT id\n" + + "FROM t3)\n" + + "ORDER BY d ASC", output); } public void test_union_2() throws Exception { @@ -67,7 +66,14 @@ public class DMLSelectParserTest extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("(SELECT id\nFROM t1)\nUNION DISTINCT\n(SELECT id\nFROM t2)\nUNION\n(SELECT id\nFROM t3)", output); + Assert.assertEquals("(SELECT id\n" + + "FROM t1)\n" + + "UNION DISTINCT\n" + + "(SELECT id\n" + + "FROM t2)\n" + + "UNION\n" + + "SELECT id\n" + + "FROM t3", output); } public void test_select_0() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/BitFunctionsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/BitFunctionsTest.java index 359a068f6d..b0fdc3ac16 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/BitFunctionsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/BitFunctionsTest.java @@ -134,7 +134,9 @@ public class BitFunctionsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT b + 0, BIN(b + 0), OCT(b + 0), HEX(b + 0)\nFROM t;", text); + Assert.assertEquals("SELECT b + 0, BIN(b + 0), OCT(b + 0)\n" + + "\t, HEX(b + 0)\n" + + "FROM t;", text); } private String output(List stmtList) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/ControlFlowFunctionsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/ControlFlowFunctionsTest.java index 334fabc742..811c4d784b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/ControlFlowFunctionsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/ControlFlowFunctionsTest.java @@ -35,7 +35,11 @@ public class ControlFlowFunctionsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;", text); + Assert.assertEquals("SELECT CASE 1\n" + + "\t\tWHEN 1 THEN 'one'\n" + + "\t\tWHEN 2 THEN 'two'\n" + + "\t\tELSE 'more'\n" + + "\tEND;", text); } public void test_1() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java index 952a663ba4..f49222cce7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java @@ -50,14 +50,14 @@ public class MySqlDeleteTest_3 extends MysqlTest { "\t\t\tSELECT *\n" + "\t\t\tFROM t3\n" + "\t\t\tWHERE ROW(5 * t2.s1, 77) = (\n" + - "\t\t\t\t(SELECT 50, 11 * s1\n" + - "\t\t\t\tFROM t4)\n" + + "\t\t\t\tSELECT 50, 11 * s1\n" + + "\t\t\t\tFROM t4\n" + "\t\t\t\tUNION\n" + - "\t\t\t\t(SELECT 50, 77\n" + + "\t\t\t\tSELECT 50, 77\n" + "\t\t\t\tFROM (\n" + "\t\t\t\t\tSELECT *\n" + "\t\t\t\t\tFROM t5\n" + - "\t\t\t\t) t5)\n" + + "\t\t\t\t) t5\n" + "\t\t\t)\n" + "\t\t)\n" + "\t)", SQLUtils.toMySqlString(stmt)); @@ -69,14 +69,14 @@ public class MySqlDeleteTest_3 extends MysqlTest { "\t\t\tselect *\n" + "\t\t\tfrom t3\n" + "\t\t\twhere ROW(5 * t2.s1, 77) = (\n" + - "\t\t\t\t(select 50, 11 * s1\n" + - "\t\t\t\tfrom t4)\n" + + "\t\t\t\tselect 50, 11 * s1\n" + + "\t\t\t\tfrom t4\n" + "\t\t\t\tunion\n" + - "\t\t\t\t(select 50, 77\n" + + "\t\t\t\tselect 50, 77\n" + "\t\t\t\tfrom (\n" + "\t\t\t\t\tselect *\n" + "\t\t\t\t\tfrom t5\n" + - "\t\t\t\t) t5)\n" + + "\t\t\t\t) t5\n" + "\t\t\t)\n" + "\t\t)\n" + "\t)", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java index 4ae2a72e33..d9f104dcd5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java @@ -40,13 +40,13 @@ public class SQLUtilsTest extends TestCase { public void test_format_3() throws Exception { String sql = "select lottery_notice_issue,lottery_notice_date,lottery_notice_result from tb_lottery_notice where lottery_type_id=8 and lottery_notice_issue<=2014066 UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, NULL# and lottery_notice_issue>=2014062 order by lottery_notice_issue desc"; String formattedSql = SQLUtils.formatMySql(sql); - String expected = "(SELECT lottery_notice_issue, lottery_notice_date, lottery_notice_result" - + "\nFROM tb_lottery_notice" - + "\nWHERE lottery_type_id = 8" - + "\n\tAND lottery_notice_issue <= 2014066)" - + "\nUNION ALL" - + "\n(SELECT NULL, NULL, NULL, NULL, NULL" // - + "\n\t, NULL)# and lottery_notice_issue>=2014062 order by lottery_notice_issue desc"; + String expected = "SELECT lottery_notice_issue, lottery_notice_date, lottery_notice_result\n" + + "FROM tb_lottery_notice\n" + + "WHERE lottery_type_id = 8\n" + + "\tAND lottery_notice_issue <= 2014066\n" + + "UNION ALL\n" + + "SELECT NULL, NULL, NULL, NULL, NULL\n" + + "\t, NULL# and lottery_notice_issue>=2014062 order by lottery_notice_issue desc"; Assert.assertEquals(expected, formattedSql); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateViewTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateViewTest1.java index b1ac818e88..f889979be0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateViewTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateViewTest1.java @@ -43,27 +43,39 @@ public class MySqlCreateViewTest1 extends MysqlTest { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); - Assert.assertEquals("CREATE ALGORITHM = UNDEFINED\n" + + assertEquals("CREATE ALGORITHM = UNDEFINED\n" + "\tDEFINER = root\n" + "\tSQL SECURITY = DEFINER\n" + "\tVIEW view_audit_enroll\n" + "AS\n" + - "SELECT a.enroll_id AS 'enrollId', CASE WHEN (\n" + - "\t\tSELECT audit\n" + - "\t\tFROM actvty_audit\n" + - "\t\tWHERE enroll_id = a.enroll_id\n" + - "\t\t\tAND rankjurisdiction = 1\n" + - "\t) > 0 THEN '县站已审核' ELSE NULL END AS 'countyAudit', CASE WHEN (\n" + - "\t\tSELECT audit\n" + - "\t\tFROM actvty_audit\n" + - "\t\tWHERE enroll_id = a.enroll_id\n" + - "\t\t\tAND rankjurisdiction = 2\n" + - "\t) > 0 THEN '市馆已审核' ELSE NULL END AS 'cityAudit', CASE WHEN (\n" + - "\t\tSELECT audit\n" + - "\t\tFROM actvty_audit\n" + - "\t\tWHERE enroll_id = a.enroll_id\n" + - "\t\t\tAND rankjurisdiction = 3\n" + - "\t) > 0 THEN '省馆已审核' ELSE NULL END AS 'provinceAudit'\n" + + "SELECT a.enroll_id AS 'enrollId'\n" + + "\t, CASE \n" + + "\t\tWHEN (\n" + + "\t\t\tSELECT audit\n" + + "\t\t\tFROM actvty_audit\n" + + "\t\t\tWHERE enroll_id = a.enroll_id\n" + + "\t\t\t\tAND rankjurisdiction = 1\n" + + "\t\t) > 0 THEN '县站已审核'\n" + + "\t\tELSE NULL\n" + + "\tEND AS 'countyAudit'\n" + + "\t, CASE \n" + + "\t\tWHEN (\n" + + "\t\t\tSELECT audit\n" + + "\t\t\tFROM actvty_audit\n" + + "\t\t\tWHERE enroll_id = a.enroll_id\n" + + "\t\t\t\tAND rankjurisdiction = 2\n" + + "\t\t) > 0 THEN '市馆已审核'\n" + + "\t\tELSE NULL\n" + + "\tEND AS 'cityAudit'\n" + + "\t, CASE \n" + + "\t\tWHEN (\n" + + "\t\t\tSELECT audit\n" + + "\t\t\tFROM actvty_audit\n" + + "\t\t\tWHERE enroll_id = a.enroll_id\n" + + "\t\t\t\tAND rankjurisdiction = 3\n" + + "\t\t) > 0 THEN '省馆已审核'\n" + + "\t\tELSE NULL\n" + + "\tEND AS 'provinceAudit'\n" + "FROM actvty_audit a\n" + "GROUP BY a.enroll_id", // SQLUtils.toMySqlString(stmt)); @@ -73,22 +85,34 @@ public class MySqlCreateViewTest1 extends MysqlTest { "\tsql security = DEFINER\n" + "\tview view_audit_enroll\n" + "as\n" + - "select a.enroll_id as 'enrollId', case when (\n" + - "\t\tselect audit\n" + - "\t\tfrom actvty_audit\n" + - "\t\twhere enroll_id = a.enroll_id\n" + - "\t\t\tand rankjurisdiction = 1\n" + - "\t) > 0 then '县站已审核' else null end as 'countyAudit', case when (\n" + - "\t\tselect audit\n" + - "\t\tfrom actvty_audit\n" + - "\t\twhere enroll_id = a.enroll_id\n" + - "\t\t\tand rankjurisdiction = 2\n" + - "\t) > 0 then '市馆已审核' else null end as 'cityAudit', case when (\n" + - "\t\tselect audit\n" + - "\t\tfrom actvty_audit\n" + - "\t\twhere enroll_id = a.enroll_id\n" + - "\t\t\tand rankjurisdiction = 3\n" + - "\t) > 0 then '省馆已审核' else null end as 'provinceAudit'\n" + + "select a.enroll_id as 'enrollId'\n" + + "\t, case \n" + + "\t\twhen (\n" + + "\t\t\tselect audit\n" + + "\t\t\tfrom actvty_audit\n" + + "\t\t\twhere enroll_id = a.enroll_id\n" + + "\t\t\t\tand rankjurisdiction = 1\n" + + "\t\t) > 0 then '县站已审核'\n" + + "\t\telse null\n" + + "\tend as 'countyAudit'\n" + + "\t, case \n" + + "\t\twhen (\n" + + "\t\t\tselect audit\n" + + "\t\t\tfrom actvty_audit\n" + + "\t\t\twhere enroll_id = a.enroll_id\n" + + "\t\t\t\tand rankjurisdiction = 2\n" + + "\t\t) > 0 then '市馆已审核'\n" + + "\t\telse null\n" + + "\tend as 'cityAudit'\n" + + "\t, case \n" + + "\t\twhen (\n" + + "\t\t\tselect audit\n" + + "\t\t\tfrom actvty_audit\n" + + "\t\t\twhere enroll_id = a.enroll_id\n" + + "\t\t\t\tand rankjurisdiction = 3\n" + + "\t\t) > 0 then '省馆已审核'\n" + + "\t\telse null\n" + + "\tend as 'provinceAudit'\n" + "from actvty_audit a\n" + "group by a.enroll_id", // SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFlashbackQueryTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFlashbackQueryTest3.java index ab95032e56..5f4e982dd2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFlashbackQueryTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleFlashbackQueryTest3.java @@ -30,11 +30,12 @@ public class OracleFlashbackQueryTest3 extends TestCase { + "FROM employees e, departments d\n" + "WHERE d.department_id = e.department_id\n" + "GROUP BY ROLLUP (department_name, job_id);\n"; - String expect = "SELECT DECODE(GROUPING(department_name), 1, 'All Departments', department_name) AS department, " - + "DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job, COUNT(*) AS \"Total Empl\", AVG(salary) * 12 AS \"Average Sal\"\n" - + "FROM employees e, departments d\n" - + "WHERE d.department_id = e.department_id\n" - + "GROUP BY ROLLUP(department_name, job_id);"; + String expect = "SELECT DECODE(GROUPING(department_name), 1, 'All Departments', department_name) AS department\n" + + "\t, DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job\n" + + "\t, COUNT(*) AS \"Total Empl\", AVG(salary) * 12 AS \"Average Sal\"\n" + + "FROM employees e, departments d\n" + + "WHERE d.department_id = e.department_id\n" + + "GROUP BY ROLLUP(department_name, job_id);"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java index 5e78938092..7bbcba5345 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java @@ -35,18 +35,17 @@ public class OracleGroupingSetTest extends TestCase { + "GROUP BY GROUPING SETS((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), " + "( calendar_month_desc, co.country_id) );\n"; - String expected = "SELECT channel_desc, calendar_month_desc, co.country_id, " // - + "TO_CHAR(SUM(amount_sold), '9,999,999,999') AS SALES$\n" // - + "FROM sales, customers, times, channels, countries co\n" // - + "WHERE sales.time_id = times.time_id" // - + "\n\tAND sales.cust_id = customers.cust_id" // - + "\n\tAND sales.channel_id = channels.channel_id" // - + "\n\tAND customers.country_id = co.country_id" // - + "\n\tAND channels.channel_desc IN ('Direct Sales', 'Internet')" // - + "\n\tAND times.calendar_month_desc IN ('2000-09', '2000-10')" - + "\n\tAND co.country_id IN ('UK', 'US')\n" - + "GROUP BY GROUPING SETS ((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), " - + "(calendar_month_desc, co.country_id));"; + String expected = "SELECT channel_desc, calendar_month_desc, co.country_id\n" + + "\t, TO_CHAR(SUM(amount_sold), '9,999,999,999') AS SALES$\n" + + "FROM sales, customers, times, channels, countries co\n" + + "WHERE sales.time_id = times.time_id\n" + + "\tAND sales.cust_id = customers.cust_id\n" + + "\tAND sales.channel_id = channels.channel_id\n" + + "\tAND customers.country_id = co.country_id\n" + + "\tAND channels.channel_desc IN ('Direct Sales', 'Internet')\n" + + "\tAND times.calendar_month_desc IN ('2000-09', '2000-10')\n" + + "\tAND co.country_id IN ('UK', 'US')\n" + + "GROUP BY GROUPING SETS ((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), (calendar_month_desc, co.country_id));"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest2.java index dc3ba15fe7..5b6d787dd7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest2.java @@ -89,8 +89,11 @@ public class OracleCreateViewTest2 extends OracleTest { "AS\n" + "SELECT db.db_key, db.db_id, bs.bs_key, bs.bs_recid AS recid, bs.bs_stamp AS stamp\n" + "\t, bs.set_stamp, bs.set_count, bs.bck_type AS backup_type, bs.incr_level AS incremental_level, bs.pieces\n" + - "\t, bs.start_time, bs.completion_time, abs((bs.completion_time - bs.start_time) * 86400) AS elapsed_seconds, bs.status, bs.controlfile_included\n" + - "\t, bs.input_file_scan_only, decode(keep_options, 0, 'NO', 'YES') AS keep, keep_until, decode(keep_options, 256, 'LOGS', 512, 'NOLOGS', 1024, 'CONSISTENT', NULL) AS keep_options\n" + + "\t, bs.start_time, bs.completion_time, abs((bs.completion_time - bs.start_time) * 86400) AS elapsed_seconds, bs.status\n" + + "\t, bs.controlfile_included, bs.input_file_scan_only\n" + + "\t, decode(keep_options, 0, 'NO', 'YES') AS keep\n" + + "\t, keep_until\n" + + "\t, decode(keep_options, 256, 'LOGS', 512, 'NOLOGS', 1024, 'CONSISTENT', NULL) AS keep_options\n" + "FROM db, bs\n" + "WHERE db.db_key = bs.db_key",// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java index 264a94d815..4dd229510c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest4.java @@ -71,8 +71,10 @@ public class OracleCreateViewTest4 extends OracleTest { "\t\"ROW_WAIT_ROW#\"\n" + ")\n" + "AS\n" + - "SELECT owner AS obj_owner, object_name AS obj_name, object_type AS obj_type, dbms_rowid.rowid_create(1, row_wait_obj#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#) AS obj_rowid, a.username AS db_user\n" + - "\t, a.SID AS SID, a.TYPE AS lock_type, a.row_wait_file#, a.row_wait_block#, a.row_wait_row#\n" + + "SELECT owner AS obj_owner, object_name AS obj_name, object_type AS obj_type\n" + + "\t, dbms_rowid.rowid_create(1, row_wait_obj#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#) AS obj_rowid\n" + + "\t, a.username AS db_user, a.SID AS SID, a.TYPE AS lock_type, a.row_wait_file#, a.row_wait_block#\n" + + "\t, a.row_wait_row#\n" + "FROM TB_001, (\n" + "\tSELECT /*+ no_merge(a) no_merge(b) */ a.username, a.SID, a.row_wait_obj#, a.ROW_WAIT_FILE#, a.ROW_WAIT_BLOCK#\n" + "\t\t, a.ROW_WAIT_ROW#, b.TYPE\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest5.java index a27b881c2f..39e3dae6bc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest5.java @@ -62,7 +62,8 @@ public class OracleCreateViewTest5 extends OracleTest { "\t\"LOCK_MODE\"\n" + ")\n" + "AS\n" + - "SELECT /*+ no_merge(lo) */ DO.object_name, lo.SESSION_ID, lo.oracle_username, lo.OS_USER_NAME, DECODE(locked_mode, 1, 'SELECT', 2, 'SELECT FOR UPDATE / LOCK ROW SHARE', 3, 'INSERT/UPDATE/DELETE/LOCK ROW EXCLUSIVE', 4, 'CREATE INDEX/LOCK SHARE', 5, 'LOCK SHARE ROW EXCLUSIVE', 6, 'ALTER TABLE/DROP TABLE/DROP INDEX/TRUNCATE TABLE/LOCK EXCLUSIVE') AS sql_actions\n" + + "SELECT /*+ no_merge(lo) */ DO.object_name, lo.SESSION_ID, lo.oracle_username, lo.OS_USER_NAME\n" + + "\t, DECODE(locked_mode, 1, 'SELECT', 2, 'SELECT FOR UPDATE / LOCK ROW SHARE', 3, 'INSERT/UPDATE/DELETE/LOCK ROW EXCLUSIVE', 4, 'CREATE INDEX/LOCK SHARE', 5, 'LOCK SHARE ROW EXCLUSIVE', 6, 'ALTER TABLE/DROP TABLE/DROP INDEX/TRUNCATE TABLE/LOCK EXCLUSIVE') AS sql_actions\n" + "\t, DECODE(locked_mode, 1, 'NULL', 2, 'SS - SUB SHARE', 3, 'SX - SUB EXCLUSIVE', 4, 'S - SHARE', 5, 'SSX - SHARE/SUB EXCLUSIVE', 6, 'X - EXCLUSIVE') AS Lock_mode\n" + "FROM sys.V_$LOCKED_OBJECT lo, TB_002 DO\n" + "WHERE DO.object_id = lo.object_id",// diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest6.java index 28fc11edda..d391552cfd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest6.java @@ -119,13 +119,16 @@ public class OracleCreateViewTest6 extends OracleTest { "\t\"IS_MERGED\"\n" + ")\n" + "AS\n" + - "SELECT ID, GMT_CREATE, utl_raw.cast_to_raw(CREATOR) AS CREATOR, GMT_MODIFIED, utl_raw.cast_to_raw(MODIFIER) AS MODIFIER\n" + - "\t, IS_DELETED, utl_raw.cast_to_raw(CONTRACT_PARTY) AS CONTRACT_PARTY, utl_raw.cast_to_raw(COMPANY_NAME) AS COMPANY_NAME, utl_raw.cast_to_raw(PRODUCT_TYPE) AS PRODUCT_TYPE, utl_raw.cast_to_raw(PERIOD) AS PERIOD\n" + - "\t, JOIN, OVER, CONTRACT_TERM, CONTRACT_CASH, EXEC_CASH\n" + - "\t, CANCELED_CASH, RECEIVERD_CASH, O_S_CASH, utl_raw.cast_to_raw(REMARK) AS REMARK, FENTAN_CHECK\n" + - "\t, TOTAL_CASH, NOT_CONFIRMED, PRE_RECEIVED, NOT_RECEIVED, CONTRACT_DATE\n" + - "\t, utl_raw.cast_to_raw(OWNER_1) AS OWNER_1, AREA_ID_1, utl_raw.cast_to_raw(FIRST_OWNER) AS FIRST_OWNER, FIRST_AREA_ID, utl_raw.cast_to_raw(CONTRACT_ID) AS CONTRACT_ID\n" + - "\t, utl_raw.cast_to_raw(IS_RENEW_UPGRADE) AS IS_RENEW_UPGRADE, CATEGORY_ID_1, CATEGORY_ID_2, FIRST_RECEIPT_DATE, utl_raw.cast_to_raw(RECEIPT_REMARK) AS RECEIPT_REMARK\n" + + "SELECT ID, GMT_CREATE, utl_raw.cast_to_raw(CREATOR) AS CREATOR, GMT_MODIFIED\n" + + "\t, utl_raw.cast_to_raw(MODIFIER) AS MODIFIER, IS_DELETED, utl_raw.cast_to_raw(CONTRACT_PARTY) AS CONTRACT_PARTY\n" + + "\t, utl_raw.cast_to_raw(COMPANY_NAME) AS COMPANY_NAME, utl_raw.cast_to_raw(PRODUCT_TYPE) AS PRODUCT_TYPE\n" + + "\t, utl_raw.cast_to_raw(PERIOD) AS PERIOD, JOIN, OVER, CONTRACT_TERM\n" + + "\t, CONTRACT_CASH, EXEC_CASH, CANCELED_CASH, RECEIVERD_CASH, O_S_CASH\n" + + "\t, utl_raw.cast_to_raw(REMARK) AS REMARK, FENTAN_CHECK, TOTAL_CASH, NOT_CONFIRMED\n" + + "\t, PRE_RECEIVED, NOT_RECEIVED, CONTRACT_DATE, utl_raw.cast_to_raw(OWNER_1) AS OWNER_1\n" + + "\t, AREA_ID_1, utl_raw.cast_to_raw(FIRST_OWNER) AS FIRST_OWNER, FIRST_AREA_ID\n" + + "\t, utl_raw.cast_to_raw(CONTRACT_ID) AS CONTRACT_ID, utl_raw.cast_to_raw(IS_RENEW_UPGRADE) AS IS_RENEW_UPGRADE, CATEGORY_ID_1\n" + + "\t, CATEGORY_ID_2, FIRST_RECEIPT_DATE, utl_raw.cast_to_raw(RECEIPT_REMARK) AS RECEIPT_REMARK\n" + "\t, utl_raw.cast_to_raw(CONTRACT_SERIAL) AS CONTRACT_SERIAL, IS_MERGED\n" + "FROM TB_002",// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java index ac8a5cc171..0a6d8e7fff 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest38.java @@ -62,7 +62,13 @@ public class OracleSelectTest38 extends OracleTest { "\t\t(\n" + "\t\t\tSELECT substr(xzqh, 1, 6) AS xzqh, swrslx, SUM(swrs_count) AS acd_totle\n" + "\t\t\tFROM (\n" + - "\t\t\t\tSELECT xzqh, sglx, CASE WHEN swrs7 < 3 THEN '1' WHEN swrs7 < 5 THEN '2' WHEN swrs7 <= 9 THEN '3' ELSE '4' END AS swrslx, 1 AS swrs_count\n" + + "\t\t\t\tSELECT xzqh, sglx\n" + + "\t\t\t\t\t, CASE \n" + + "\t\t\t\t\t\tWHEN swrs7 < 3 THEN '1'\n" + + "\t\t\t\t\t\tWHEN swrs7 < 5 THEN '2'\n" + + "\t\t\t\t\t\tWHEN swrs7 <= 9 THEN '3'\n" + + "\t\t\t\t\t\tELSE '4'\n" + + "\t\t\t\t\tEND AS swrslx, 1 AS swrs_count\n" + "\t\t\t\tFROM acduser.vw_acd_info\n" + "\t\t\t\tWHERE sglx = '1'\n" + "\t\t\t\t\tAND sgfssj >= ?\n" + @@ -73,7 +79,10 @@ public class OracleSelectTest38 extends OracleTest { "\t\t, kreis_code, kreis_name, px1, py1, px2\n" + "\t\t, py2\n" + "\tFROM (\n" + - "\t\tSELECT xzqh, nvl(MAX(decode(swrslx, '1', acd_totle)), 0) AS less3, nvl(MAX(decode(swrslx, '2', acd_totle)), 0) AS f3to5, nvl(MAX(decode(swrslx, '3', acd_totle)), 0) AS f5to9, nvl(MAX(decode(swrslx, '4', acd_totle)), 0) AS more9\n" + + "\t\tSELECT xzqh, nvl(MAX(decode(swrslx, '1', acd_totle)), 0) AS less3\n" + + "\t\t\t, nvl(MAX(decode(swrslx, '2', acd_totle)), 0) AS f3to5\n" + + "\t\t\t, nvl(MAX(decode(swrslx, '3', acd_totle)), 0) AS f5to9\n" + + "\t\t\t, nvl(MAX(decode(swrslx, '4', acd_totle)), 0) AS more9\n" + "\t\tFROM (\n" + "\t\t\tSELECT *\n" + "\t\t\tFROM acduser.vw_kreis_statics_t\n" + @@ -103,7 +112,13 @@ public class OracleSelectTest38 extends OracleTest { "\t\t(\n" + "\t\t\tselect substr(xzqh, 1, 6) as xzqh, swrslx, sum(swrs_count) as acd_totle\n" + "\t\t\tfrom (\n" + - "\t\t\t\tselect xzqh, sglx, case when swrs7 < 3 then '1' when swrs7 < 5 then '2' when swrs7 <= 9 then '3' else '4' end as swrslx, 1 as swrs_count\n" + + "\t\t\t\tselect xzqh, sglx\n" + + "\t\t\t\t\t, case \n" + + "\t\t\t\t\t\twhen swrs7 < 3 then '1'\n" + + "\t\t\t\t\t\twhen swrs7 < 5 then '2'\n" + + "\t\t\t\t\t\twhen swrs7 <= 9 then '3'\n" + + "\t\t\t\t\t\telse '4'\n" + + "\t\t\t\t\tend as swrslx, 1 as swrs_count\n" + "\t\t\t\tfrom acduser.vw_acd_info\n" + "\t\t\t\twhere sglx = '1'\n" + "\t\t\t\t\tand sgfssj >= ?\n" + @@ -114,7 +129,10 @@ public class OracleSelectTest38 extends OracleTest { "\t\t, kreis_code, kreis_name, px1, py1, px2\n" + "\t\t, py2\n" + "\tfrom (\n" + - "\t\tselect xzqh, nvl(max(decode(swrslx, '1', acd_totle)), 0) as less3, nvl(max(decode(swrslx, '2', acd_totle)), 0) as f3to5, nvl(max(decode(swrslx, '3', acd_totle)), 0) as f5to9, nvl(max(decode(swrslx, '4', acd_totle)), 0) as more9\n" + + "\t\tselect xzqh, nvl(max(decode(swrslx, '1', acd_totle)), 0) as less3\n" + + "\t\t\t, nvl(max(decode(swrslx, '2', acd_totle)), 0) as f3to5\n" + + "\t\t\t, nvl(max(decode(swrslx, '3', acd_totle)), 0) as f5to9\n" + + "\t\t\t, nvl(max(decode(swrslx, '4', acd_totle)), 0) as more9\n" + "\t\tfrom (\n" + "\t\t\tselect *\n" + "\t\t\tfrom acduser.vw_kreis_statics_t\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java index b66af9060a..e2edb0fcb5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest62.java @@ -66,7 +66,8 @@ public class OracleSelectTest62 extends OracleTest { { String text = SQLUtils.toOracleString(stmt); - assertEquals("SELECT channel_desc, calendar_month_desc, co.country_id, TO_CHAR(SUM(amount_sold), '9,999,999,999') AS SALES$\n" + + assertEquals("SELECT channel_desc, calendar_month_desc, co.country_id\n" + + "\t, TO_CHAR(SUM(amount_sold), '9,999,999,999') AS SALES$\n" + "FROM sales, customers, times, channels, countries co\n" + "WHERE sales.time_id = times.time_id\n" + "\tAND sales.cust_id = customers.cust_id\n" + @@ -81,7 +82,8 @@ public class OracleSelectTest62 extends OracleTest { { String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); - Assert.assertEquals("select channel_desc, calendar_month_desc, co.country_id, TO_CHAR(sum(amount_sold), '9,999,999,999') as SALES$\n" + + Assert.assertEquals("select channel_desc, calendar_month_desc, co.country_id\n" + + "\t, TO_CHAR(sum(amount_sold), '9,999,999,999') as SALES$\n" + "from sales, customers, times, channels, countries co\n" + "where sales.time_id = times.time_id\n" + "\tand sales.cust_id = customers.cust_id\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java index 3695e582bb..6c173c58f0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java @@ -80,7 +80,11 @@ public class SQLServerSelectTest7 extends TestCase { "\t\tFROM sec_portal_menu t, menu_view x\n" + "\t\tWHERE t.parent_id = x.menu_id\n" + "\t)\n" + - "SELECT t.menu_id AS \"id\", t.menu_name AS \"name\", t.parent_id AS \"pId\", CASE t.level WHEN 1 THEN 'true' ELSE 'false' END AS \"open\", t.link_type AS \"linkType\"\n" + + "SELECT t.menu_id AS \"id\", t.menu_name AS \"name\", t.parent_id AS \"pId\"\n" + + "\t, CASE t.level\n" + + "\t\tWHEN 1 THEN 'true'\n" + + "\t\tELSE 'false'\n" + + "\tEND AS \"open\", t.link_type AS \"linkType\"\n" + "FROM menu_view t\n" + "WHERE 1 = 1\n" + "\tAND t.deleted = 0\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java index 1ce5069c13..8841a995ca 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java @@ -40,24 +40,28 @@ public class SQLServerUpdateTest extends TestCase { " ) b " + // "where a.FId = b.FId and a.FId = ?"; - String expect = "UPDATE reg_student_charge_item\n" + - "SET FAmountReceived = b.amount\n" + - "FROM reg_student_charge_item a, (\n" + - "\t\tSELECT a.FId, CASE WHEN SUM(b.FChargeAmount) IS NULL THEN 0 ELSE SUM(b.FChargeAmount) END AS amount\n" + - "\t\tFROM reg_student_charge_item a\n" + - "\t\t\tLEFT JOIN reg_student_charge_daybook b ON a.FId = b.FChargeItemId\n" + - "\t\tWHERE a.FId = ?\n" + - "\t\tGROUP BY a.FId\n" + - "\t) b\n" + - "WHERE a.FId = b.FId\n" + - "\tAND a.FId = ?"; + SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); String text = TestUtils.outputSqlServer(stmt); - Assert.assertEquals(expect, text); + assertEquals("UPDATE reg_student_charge_item\n" + + "SET FAmountReceived = b.amount\n" + + "FROM reg_student_charge_item a, (\n" + + "\t\tSELECT a.FId\n" + + "\t\t\t, CASE \n" + + "\t\t\t\tWHEN SUM(b.FChargeAmount) IS NULL THEN 0\n" + + "\t\t\t\tELSE SUM(b.FChargeAmount)\n" + + "\t\t\tEND AS amount\n" + + "\t\tFROM reg_student_charge_item a\n" + + "\t\t\tLEFT JOIN reg_student_charge_daybook b ON a.FId = b.FChargeItemId\n" + + "\t\tWHERE a.FId = ?\n" + + "\t\tGROUP BY a.FId\n" + + "\t) b\n" + + "WHERE a.FId = b.FId\n" + + "\tAND a.FId = ?", text); // System.out.println(text); } diff --git a/src/test/resources/bvt/parser/mysql-8.txt b/src/test/resources/bvt/parser/mysql-8.txt index 86185787f5..cee2fd465d 100644 --- a/src/test/resources/bvt/parser/mysql-8.txt +++ b/src/test/resources/bvt/parser/mysql-8.txt @@ -8,12 +8,12 @@ WHERE a.examine_id = b.examine_id --------------------------- SELECT a.examine_id AS examineId, a.examine_name AS examineName, a.level_limit AS levelLimit FROM c_examinepaper a, ( - (SELECT examine_id + SELECT examine_id FROM c_examinepaper WHERE level_limit = ? - AND status = 1) + AND status = 1 MINUS - (SELECT DISTINCT examine_id - FROM course) + SELECT DISTINCT examine_id + FROM course ) b WHERE a.examine_id = b.examine_id