From d66a4e2097edb2879047d93151abe7b435500021 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 10 Jun 2017 21:16:44 +0800 Subject: [PATCH] improved sql parser. --- .../mysql/visitor/MySqlOutputVisitor.java | 2 +- .../odps/visitor/OdpsOutputVisitor.java | 66 +++++----- .../dialect/oracle/parser/OracleLexer.java | 4 +- .../oracle/parser/OracleSelectParser.java | 4 + .../oracle/visitor/OracleOutputVisitor.java | 14 ++- .../sql/visitor/SQLASTOutputVisitor.java | 39 +++--- .../druid/sql/visitor/SchemaStatVisitor.java | 17 +-- .../sql/mysql/select/MySqlSelectTest_40.java | 5 +- .../sql/mysql/select/MySqlSelectTest_41.java | 5 +- .../bvt/sql/odps/OdpsFormatCommentTest28.java | 7 +- .../bvt/sql/odps/OdpsFormatCommentTest4.java | 28 ++--- .../druid/bvt/sql/odps/OdpsInsertTest3.java | 3 +- .../bvt/sql/odps/OdpsMultiInsertTest2.java | 8 +- .../druid/bvt/sql/odps/OdpsSelectTest10.java | 18 ++- .../druid/bvt/sql/odps/OdpsSelectTest12.java | 10 +- .../druid/bvt/sql/odps/OdpsSelectTest17.java | 14 +-- .../druid/bvt/sql/odps/OdpsSelectTest18.java | 8 +- .../druid/bvt/sql/odps/OdpsSelectTest2.java | 16 +-- .../bvt/sql/odps/OdpsSelectTest_mapjoin.java | 12 +- .../sql/odps/OdpsSelectTest_over_rows.java | 6 +- .../sql/odps/OdpsSelectTest_over_rows_1.java | 12 +- .../sql/odps/OdpsSelectTest_over_rows_2.java | 12 +- .../sql/odps/OdpsSelectTest_over_rows_3.java | 6 +- .../sql/odps/OdpsSelectTest_over_rows_4.java | 6 +- .../sql/odps/OdpsSelectTest_over_rows_5.java | 6 +- .../oracle/OracleSubqueryFactoringTest.java | 39 +++--- .../oracle/OracleSubqueryFactoringTest2.java | 32 ++--- .../sql/oracle/pl/Oracle_pl_exception_0.java | 8 ++ .../sql/oracle/select/OracleSelectTest38.java | 10 +- .../OracleSelectTest63_with_recursive.java | 113 +++++++++++++++++ .../OracleSelectTest64_with_recursive.java | 114 ++++++++++++++++++ .../sql/sqlserver/SQLServerSelectTest6.java | 23 ++-- .../sql/sqlserver/SQLServerSelectTest7.java | 5 +- 33 files changed, 419 insertions(+), 253 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest63_with_recursive.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java 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 5501482ce9..2b86302cb6 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 @@ -199,7 +199,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } if ((!isParameterized()) && isPrettyFormat() && x.hasBeforeComment()) { - printComment(x.getBeforeCommentsDirect(), "\n"); + printlnComments(x.getBeforeCommentsDirect()); } print0(ucase ? "SELECT " : "select "); 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 9d9716b612..eaec1e3df9 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 @@ -20,9 +20,7 @@ import java.util.List; import java.util.Set; 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; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.dialect.odps.ast.*; @@ -74,7 +72,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis if (this.isPrettyFormat() && x.hasBodyBeforeComment()) { print(' '); - printComment(x.getBodyBeforeCommentsDirect(), ""); + printlnComment(x.getBodyBeforeCommentsDirect()); } incrementIndent(); @@ -88,7 +86,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis } if (this.isPrettyFormat() && element.hasAfterComment()) { print(' '); - printComment(element.getAfterCommentsDirect(), "\n"); + printlnComment(element.getAfterCommentsDirect()); } if (i != size - 1) { @@ -121,7 +119,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis } if (this.isPrettyFormat() && column.hasAfterComment()) { print(' '); - printComment(column.getAfterCommentsDirect(), "\n"); + printlnComment(column.getAfterCommentsDirect()); } if (i != partitionSize - 1) { @@ -204,8 +202,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis @Override public boolean visit(OdpsInsert x) { if (x.hasBeforeComment()) { - printComment(x.getBeforeCommentsDirect(), "\n"); - println(); + printlnComments(x.getBeforeCommentsDirect()); } if (x.isOverwrite()) { print0(ucase ? "INSERT OVERWRITE TABLE " : "insert overwrite table "); @@ -238,31 +235,31 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis return false; } - protected void printSelectList(List selectList) { - incrementIndent(); - for (int i = 0, size = selectList.size(); i < size; ++i) { - SQLSelectItem selectItem = selectList.get(i); - - if (i != 0) { - SQLSelectItem preSelectItem = selectList.get(i - 1); - if (preSelectItem.hasAfterComment()) { - print(' '); - printComment(preSelectItem.getAfterCommentsDirect(), "\n"); - } - - println(); - print0(", "); - } - - selectItem.accept(this); - - if (i == selectList.size() - 1 && selectItem.hasAfterComment()) { - print(' '); - printComment(selectItem.getAfterCommentsDirect(), "\n"); - } - } - decrementIndent(); - } +// protected void printSelectList(List selectList) { +// incrementIndent(); +// for (int i = 0, size = selectList.size(); i < size; ++i) { +// SQLSelectItem selectItem = selectList.get(i); +// +// if (i != 0) { +// SQLSelectItem preSelectItem = selectList.get(i - 1); +// if (preSelectItem.hasAfterComment()) { +// print(' '); +// printlnComment(preSelectItem.getAfterCommentsDirect()); +// } +// +// println(); +// print0(", "); +// } +// +// selectItem.accept(this); +// +// if (i == selectList.size() - 1 && selectItem.hasAfterComment()) { +// print(' '); +// printlnComments(selectItem.getAfterCommentsDirect()); +// } +// } +// decrementIndent(); +// } @Override public boolean visit(SQLSubqueryTableSource x) { @@ -414,8 +411,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis @Override public boolean visit(OdpsSelectQueryBlock x) { if (isPrettyFormat() && x.hasBeforeComment()) { - printComment(x.getBeforeCommentsDirect(), "\n"); - println(); + printlnComments(x.getBeforeCommentsDirect()); } print0(ucase ? "SELECT " : "select "); @@ -453,7 +449,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis x.getWhere().accept(this); if (x.getWhere().hasAfterComment() && isPrettyFormat()) { print(' '); - printComment(x.getWhere().getAfterCommentsDirect(), "\n"); + printlnComment(x.getWhere().getAfterCommentsDirect()); } } 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 aa617722e3..a4a35a437a 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 @@ -125,6 +125,8 @@ public class OracleLexer extends Lexer { public OracleLexer(String input){ super(input); + this.skipComment = true; + this.keepComments = true; super.keywods = DEFAULT_ORACLE_KEYWORDS; } @@ -280,7 +282,7 @@ public class OracleLexer extends Lexer { bufPos++; } - stringVal = subString(mark + 1, bufPos); + stringVal = subString(mark, ch != EOI ? bufPos : bufPos + 1); token = Token.LINE_COMMENT; commentCount++; if (keepComments) { 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 4b823c7dc6..ff3cea98ef 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 @@ -247,6 +247,10 @@ public class OracleSelectParser extends SQLSelectParser { } OracleSelectQueryBlock queryBlock = new OracleSelectQueryBlock(); + if (lexer.hasComment() && lexer.isKeepComments()) { + queryBlock.addBeforeComment(lexer.readAndResetComments()); + } + if (lexer.token() == Token.SELECT) { lexer.nextToken(); 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 32ebc58d5c..9ee4376f82 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 @@ -243,8 +243,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } public boolean visit(SQLSelect x) { - if (x.getWithSubQuery() != null) { - x.getWithSubQuery().accept(this); + SQLWithSubqueryClause with = x.getWithSubQuery(); + if (with != null) { + with.accept(this); println(); } @@ -381,6 +382,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } public boolean visit(OracleSelectQueryBlock x) { + if (isPrettyFormat() && x.hasBeforeComment()) { + printlnComments(x.getBeforeCommentsDirect()); + } + print0(ucase ? "SELECT " : "select "); if (x.getHintsSize() > 0) { @@ -803,9 +808,8 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS printAndAccept(x.getColumns(), ", "); print(')'); } - println(); - print0(ucase ? "AS" : "as"); - println(); + + print0(ucase ? " AS " : " as "); print('('); incrementIndent(); println(); 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 a4dc28e4b1..e52532519a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -257,7 +257,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet SQLSelectItem selectItem = selectList.get(i); SQLExpr selectItemExpr = selectItem.getExpr(); if (i != 0) { - if (selectItemExpr instanceof SQLMethodInvokeExpr) { + SQLSelectItem preSelectItem = selectList.get(i - 1); + if (preSelectItem.getAfterCommentsDirect() != null) { + lineItemCount = 0; + println(); + } else if (selectItemExpr instanceof SQLMethodInvokeExpr) { SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) selectItemExpr; int paramCount = methodInvokeExpr.getParameters().size(); lineItemCount += paramCount; @@ -280,6 +284,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } else { selectItem.accept(this); } + + if (selectItem.hasAfterComment()) { + print(' '); + printlnComment(selectItem.getAfterCommentsDirect()); + } } decrementIndent(); } @@ -405,12 +414,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (isPrettyFormat() && item.hasAfterComment()) { print(' '); - printComment(item.getAfterCommentsDirect(), "\n"); + printlnComment(item.getAfterCommentsDirect()); } if (i != groupList.size() - 1 && isPrettyFormat() && item.getParent().hasAfterComment()) { print(' '); - printComment(item.getParent().getAfterCommentsDirect(), "\n"); + printlnComment(item.getParent().getAfterCommentsDirect()); } boolean printOpSpace = true; @@ -478,7 +487,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (x.getRight().hasAfterComment() && isPrettyFormat()) { print(' '); - printlnComments(x.getRight().getAfterCommentsDirect()); + printlnComment(x.getRight().getAfterCommentsDirect()); } } @@ -1240,7 +1249,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLSelectQueryBlock x) { if (isPrettyFormat() && x.hasBeforeComment()) { - printComment(x.getBeforeCommentsDirect(), "\n"); + printlnComments(x.getBeforeCommentsDirect()); } print0(ucase ? "SELECT " : "select "); @@ -1461,7 +1470,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (isPrettyFormat() && x.hasAfterComment()) { print(' '); - printComment(x.getAfterCommentsDirect(), "\n"); + printlnComment(x.getAfterCommentsDirect()); } return false; @@ -2620,12 +2629,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLWithSubqueryClause x) { - print0(ucase ? "WITH" : "with"); + print0(ucase ? "WITH " : "with "); if (x.getRecursive() == Boolean.TRUE) { - print0(ucase ? " RECURSIVE" : " recursive"); + print0(ucase ? "RECURSIVE " : " recursive "); } incrementIndent(); - println(); printlnAndAccept(x.getEntries(), ", "); decrementIndent(); return false; @@ -2640,9 +2648,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet printAndAccept(x.getColumns(), ", "); print(')'); } - println(); - print0(ucase ? "AS" : "as"); - println(); + print(' '); + print0(ucase ? "AS " : "as "); print('('); incrementIndent(); println(); @@ -3267,13 +3274,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return false; } - protected void printComment(List comments, String seperator) { + protected void printlnComment(List comments) { if (comments != null) { for (int i = 0; i < comments.size(); ++i) { - if (i != 0) { - print0(seperator); - } String comment = comments.get(i); + if (i != 0 && comment.startsWith("--")) { + println(); + } print0(comment); } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 45fc94a138..e9fee8a17a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -25,19 +25,7 @@ import java.util.Map; import java.util.Set; import com.alibaba.druid.sql.ast.*; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLCastExpr; -import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLInListExpr; -import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; @@ -516,6 +504,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { continue; } Object value = SQLEvalVisitorUtils.eval(getDbType(), item, parameters, false); + if (value == SQLEvalVisitor.EVAL_VALUE_NULL) { + value = null; + } condition.getValues().add(value); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_40.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_40.java index 2fe9aba49a..4ae2433c98 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_40.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_40.java @@ -50,13 +50,14 @@ public class MySqlSelectTest_40 extends MysqlTest { { String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("/*0abcde*/SELECT MAX(id)\n" + + Assert.assertEquals("/*0abcde*/\n" + + "SELECT MAX(id)\n" + "FROM base_request_log", // output); } { String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); - Assert.assertEquals("/*0abcde*/select max(id)\n" + + Assert.assertEquals("/*0abcde*/\nselect max(id)\n" + "from base_request_log", // output); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_41.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_41.java index 97873f838e..32f9b10376 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_41.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_41.java @@ -50,13 +50,14 @@ public class MySqlSelectTest_41 extends MysqlTest { { String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("/*0abcde*/SELECT MAX(id)\n" + + Assert.assertEquals("/*0abcde*/\nSELECT MAX(id)\n" + "FROM base_request_log", // output); } { String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); - Assert.assertEquals("/*0abcde*/select max(id)\n" + + Assert.assertEquals("/*0abcde*/\n" + + "select max(id)\n" + "from base_request_log", // output); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest28.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest28.java index 3f40047d64..0798c8b522 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest28.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest28.java @@ -9,9 +9,8 @@ import junit.framework.TestCase; public class OdpsFormatCommentTest28 extends TestCase { public void test_drop_function() throws Exception { String sql = "SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;"; - Assert.assertEquals("SELECT pageid" - + "\n\t, adid" - + "\nFROM pageAds" - + "\n\tLATERAL VIEW EXPLODE(adid_list) adTable AS adid;", SQLUtils.formatOdps(sql)); + Assert.assertEquals("SELECT pageid, adid\n" + + "FROM pageAds\n" + + "\tLATERAL VIEW EXPLODE(adid_list) adTable AS adid;", SQLUtils.formatOdps(sql)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest4.java index 0a46050fe4..00e44def35 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest4.java @@ -18,22 +18,18 @@ public class OdpsFormatCommentTest4 extends TestCase { + "\nselect f0, f1, f2" // + "\nwhere name rlike 'kk';" ;// - Assert.assertEquals("FROM (" // - + "\n\tSELECT *"// - + "\n\tFROM xxx"// - + "\n) a" // - + "\n-- comment_0"// - + "\nINSERT OVERWRITE TABLE b PARTITION (ds='20150711')"// - + "\nSELECT f0"// - + "\n\t, f1"// - + "\n\t, f2"// - + "\nWHERE name RLIKE 'xxxx'" // - + "\n-- comment_1"// - + "\nINSERT OVERWRITE TABLE c PARTITION (ds='20150711')"// - + "\nSELECT f0"// - + "\n\t, f1"// - + "\n\t, f2"// - + "\nWHERE name RLIKE 'kk';", SQLUtils.formatOdps(sql)); + Assert.assertEquals("FROM (\n" + + "\tSELECT *\n" + + "\tFROM xxx\n" + + ") a\n" + + "-- comment_0\n" + + "INSERT OVERWRITE TABLE b PARTITION (ds='20150711')\n" + + "SELECT f0, f1, f2\n" + + "WHERE name RLIKE 'xxxx'\n" + + "-- comment_1\n" + + "INSERT OVERWRITE TABLE c PARTITION (ds='20150711')\n" + + "SELECT f0, f1, f2\n" + + "WHERE name RLIKE 'kk';", SQLUtils.formatOdps(sql)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsInsertTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsInsertTest3.java index ec2ff3386e..7dc48418c0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsInsertTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsInsertTest3.java @@ -10,8 +10,7 @@ public class OdpsInsertTest3 extends TestCase { public void test_for_insert_select_limit() throws Exception { String sql = "insert overwrite table ff partition (c='c',d='d') select /*+mapjoin(tt)*/ id,name from tt"; assertEquals("INSERT OVERWRITE TABLE ff PARTITION (c='c', d='d')\n" + - "SELECT /*+mapjoin(tt)*/ id\n" + - "\t, name\n" + + "SELECT /*+mapjoin(tt)*/ id, name\n" + "FROM tt", SQLUtils.formatOdps(sql)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsMultiInsertTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsMultiInsertTest2.java index 132ce7fce3..a6dccee317 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsMultiInsertTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsMultiInsertTest2.java @@ -13,12 +13,8 @@ public class OdpsMultiInsertTest2 extends TestCase { "select shop_name, customer_id, total_price;\n"; Assert.assertEquals("FROM sale_detail\n" + "INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2010', region='china')\n" + - "SELECT shop_name\n" + - "\t, customer_id\n" + - "\t, total_price\n" + + "SELECT shop_name, customer_id, total_price\n" + "INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2011', region='china')\n" + - "SELECT shop_name\n" + - "\t, customer_id\n" + - "\t, total_price;", SQLUtils.formatOdps(sql)); + "SELECT shop_name, customer_id, total_price;", SQLUtils.formatOdps(sql)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest10.java index d9c56bf4bb..9c50efb305 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest10.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest10.java @@ -33,16 +33,14 @@ public class OdpsSelectTest10 extends TestCase { String sql = "select /* + mapjoin(a) */ " + " a.name, b.fals" + " from abc a join abc1 b on a.name = b.fals;";// - Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.name" - + "\n\t, b.fals" - + "\nFROM abc a" - + "\nJOIN abc1 b" - + "\nON a.name = b.fals;", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select /*+ mapjoin(a) */ a.name" - + "\n\t, b.fals" - + "\nfrom abc a" - + "\njoin abc1 b" - + "\non a.name = b.fals;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + assertEquals("SELECT /*+ mapjoin(a) */ a.name, b.fals\n" + + "FROM abc a\n" + + "JOIN abc1 b\n" + + "ON a.name = b.fals;", SQLUtils.formatOdps(sql)); + assertEquals("select /*+ mapjoin(a) */ a.name, b.fals\n" + + "from abc a\n" + + "join abc1 b\n" + + "on a.name = b.fals;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); SQLStatement stmt = statementList.get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java index b11b497457..24a8d7c250 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest12.java @@ -31,12 +31,10 @@ public class OdpsSelectTest12 extends TestCase { public void test_select() throws Exception { String sql = "select name, sp from abc lateral view explode(split(concat(',','1','2','3'),',')) t as sp;";// - Assert.assertEquals("SELECT name" - + "\n\t, sp" - + "\nFROM abc" - + "\n\tLATERAL VIEW EXPLODE(SPLIT(concat(',', '1', '2', '3'), ',')) t AS sp;", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select name" - + "\n\t, sp" + Assert.assertEquals("SELECT name, sp\n" + + "FROM abc\n" + + "\tLATERAL VIEW EXPLODE(SPLIT(concat(',', '1', '2', '3'), ',')) t AS sp;", SQLUtils.formatOdps(sql)); + Assert.assertEquals("select name, sp" + "\nfrom abc" + "\n\tlateral view explode(split(concat(',', '1', '2', '3'), ',')) t as sp;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java index 69e1a501b3..a8bc1747cb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest17.java @@ -42,17 +42,14 @@ public class OdpsSelectTest17 extends TestCase { ") top )\n" + "ORDER BY cnt DESC\n" + "LIMIT 800";// - assertEquals("SELECT prov\n" + - "\t, name\n" + - "\t, cnt\n" + + assertEquals("SELECT prov, name, cnt\n" + "FROM mock_app.adl_mock_v_fct\n" + "WHERE ds = 20160920\n" + "\tAND name != 'none'\n" + "\tAND prov IN (\n" + "\t\tSELECT prov\n" + "\t\tFROM (\n" + - "\t\t\tSELECT prov\n" + - "\t\t\t\t, SUM(cnt) AS cnt\n" + + "\t\t\tSELECT prov, SUM(cnt) AS cnt\n" + "\t\t\tFROM mock_app.adl_mock_v_fct\n" + "\t\t\tWHERE ds = 20160920\n" + "\t\t\tGROUP BY prov\n" + @@ -62,17 +59,14 @@ public class OdpsSelectTest17 extends TestCase { "\t)\n" + "ORDER BY cnt DESC\n" + "LIMIT 800", SQLUtils.formatOdps(sql)); - assertEquals("select prov\n" + - "\t, name\n" + - "\t, cnt\n" + + assertEquals("select prov, name, cnt\n" + "from mock_app.adl_mock_v_fct\n" + "where ds = 20160920\n" + "\tand name != 'none'\n" + "\tand prov in (\n" + "\t\tselect prov\n" + "\t\tfrom (\n" + - "\t\t\tselect prov\n" + - "\t\t\t\t, sum(cnt) as cnt\n" + + "\t\t\tselect prov, sum(cnt) as cnt\n" + "\t\t\tfrom mock_app.adl_mock_v_fct\n" + "\t\t\twhere ds = 20160920\n" + "\t\t\tgroup by prov\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest18.java index aa6cf18b3c..c3d9d88edc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest18.java @@ -28,18 +28,14 @@ public class OdpsSelectTest18 extends TestCase { public void test_select() throws Exception { String sql = "select a, b, c from tableA where a in ( select a from tableB limit 10 )";// - assertEquals("SELECT a\n" + - "\t, b\n" + - "\t, c\n" + + assertEquals("SELECT a, b, c\n" + "FROM tableA\n" + "WHERE a IN (\n" + "\tSELECT a\n" + "\tFROM tableB\n" + "\tLIMIT 10\n" + ")", SQLUtils.formatOdps(sql)); - assertEquals("select a\n" + - "\t, b\n" + - "\t, c\n" + + assertEquals("select a, b, c\n" + "from tableA\n" + "where a in (\n" + "\tselect a\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest2.java index 5455f728f5..fb233b08ae 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest2.java @@ -25,17 +25,11 @@ public class OdpsSelectTest2 extends TestCase { public void test_distribute_by() throws Exception { String sql = "SELECT user_id,user_flag,cat1_id,wireless_client_type,alipay_num,last_buy_time,md5,my_udf_001('t_datax_odps2ots_resource_tcif_dmp_user_topup_d',md5) AS datax_pt FROM mytable_001 WHERE ds='20150819' DISTRIBUTE BY cast (datax_pt as BIGINT) SORT BY md5,user_id,user_flag,cat1_id,wireless_client_type";// - Assert.assertEquals("SELECT user_id" - + "\n\t, user_flag" - + "\n\t, cat1_id" - + "\n\t, wireless_client_type" - + "\n\t, alipay_num" - + "\n\t, last_buy_time" - + "\n\t, md5" - + "\n\t, my_udf_001('t_datax_odps2ots_resource_tcif_dmp_user_topup_d', md5) AS datax_pt" - + "\nFROM mytable_001" - + "\nWHERE ds = '20150819'" - + "\nDISTRIBUTE BY CAST(datax_pt AS BIGINT) SORT BY md5, user_id, user_flag, cat1_id, wireless_client_type", SQLUtils.formatOdps(sql)); + Assert.assertEquals("SELECT user_id, user_flag, cat1_id, wireless_client_type, alipay_num\n" + + "\t, last_buy_time, md5, my_udf_001('t_datax_odps2ots_resource_tcif_dmp_user_topup_d', md5) AS datax_pt\n" + + "FROM mytable_001\n" + + "WHERE ds = '20150819'\n" + + "DISTRIBUTE BY CAST(datax_pt AS BIGINT) SORT BY md5, user_id, user_flag, cat1_id, wireless_client_type", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java index 181a885af7..4600cb668f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java @@ -30,13 +30,11 @@ public class OdpsSelectTest_mapjoin extends TestCase { + "\nb.total_price" + "\nfrom shop a join sale_detail b" + "\non a.shop_name = b.shop_name and b.ds = '20150101';"; - Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.shop_name" - + "\n\t, b.customer_id" - + "\n\t, b.total_price" - + "\nFROM shop a" - + "\nJOIN sale_detail b" - + "\nON a.shop_name = b.shop_name" - + "\n\tAND b.ds = '20150101';", SQLUtils.formatOdps(sql)); + Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.shop_name, b.customer_id, b.total_price\n" + + "FROM shop a\n" + + "JOIN sale_detail b\n" + + "ON a.shop_name = b.shop_name\n" + + "\tAND b.ds = '20150101';", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows.java index 84e7b1034e..e17f82a413 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows.java @@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows extends TestCase { public void test_select() throws Exception { String sql = "SELECT sum(c) over(order by ds rows 9999 preceding) s, ds FROM t1";// - Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS 9999 PRECEDING) AS s\n" + - "\t, ds\n" + + assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS 9999 PRECEDING) AS s, ds\n" + "FROM t1", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select sum(c) over (order by ds rows 9999 preceding) as s\n" + - "\t, ds\n" + + Assert.assertEquals("select sum(c) over (order by ds rows 9999 preceding) as s, ds\n" + "from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_1.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_1.java index aa68f9c0fc..ebd0b7109b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_1.java @@ -33,20 +33,12 @@ public class OdpsSelectTest_over_rows_1 extends TestCase { " RANGE BETWEEN 365 PRECEDING AND 365 FOLLOWING) department_total\n" + " from employee\n" + " order by department_id, hire_date;";// - Assert.assertEquals("SELECT last_name\n" + - "\t, first_name\n" + - "\t, department_id\n" + - "\t, hire_date\n" + - "\t, salary\n" + + Assert.assertEquals("SELECT last_name, first_name, department_id, hire_date, salary\n" + "\t, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date RANGE BETWEEN 365 PRECEDING AND 365 FOLLOWING) AS department_total\n" + "FROM employee\n" + "ORDER BY department_id, \n" + "\thire_date;", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select last_name\n" + - "\t, first_name\n" + - "\t, department_id\n" + - "\t, hire_date\n" + - "\t, salary\n" + + Assert.assertEquals("select last_name, first_name, department_id, hire_date, salary\n" + "\t, sum(salary) over (partition by department_id order by hire_date range between 365 preceding and 365 following) as department_total\n" + "from employee\n" + "order by department_id, \n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_2.java index 1090fa5f17..11d0887001 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_2.java @@ -34,21 +34,13 @@ public class OdpsSelectTest_over_rows_2 extends TestCase { " from employee\n" + " order by department_id, hire_date;\n" + "";// - Assert.assertEquals("SELECT last_name\n" + - "\t, first_name\n" + - "\t, department_id\n" + - "\t, hire_date\n" + - "\t, salary\n" + + assertEquals("SELECT last_name, first_name, department_id, hire_date, salary\n" + "\t, SUM(salary) OVER (PARTITION BY department_id ORDER BY last_name, \n" + "\t\tfirst_name RANGE 90 PRECEDING) AS department_total\n" + "FROM employee\n" + "ORDER BY department_id, \n" + "\thire_date;", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select last_name\n" + - "\t, first_name\n" + - "\t, department_id\n" + - "\t, hire_date\n" + - "\t, salary\n" + + Assert.assertEquals("select last_name, first_name, department_id, hire_date, salary\n" + "\t, sum(salary) over (partition by department_id order by last_name, \n" + "\t\tfirst_name range 90 preceding) as department_total\n" + "from employee\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_3.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_3.java index aa5383ad6d..a278f5ab26 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_3.java @@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows_3 extends TestCase { public void test_select() throws Exception { String sql = "SELECT sum(c) over(order by ds rows current row) s, ds FROM t1";// - Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS CURRENT ROW) AS s\n" + - "\t, ds\n" + + Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS CURRENT ROW) AS s, ds\n" + "FROM t1", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select sum(c) over (order by ds rows current row) as s\n" + - "\t, ds\n" + + Assert.assertEquals("select sum(c) over (order by ds rows current row) as s, ds\n" + "from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_4.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_4.java index 9725f41eaa..291018d041 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_4.java @@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows_4 extends TestCase { public void test_select() throws Exception { String sql = "SELECT sum(c) over(order by ds rows UNBOUNDED PRECEDING) s, ds FROM t1";// - Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED PRECEDING) AS s\n" + - "\t, ds\n" + + Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED PRECEDING) AS s, ds\n" + "FROM t1", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select sum(c) over (order by ds rows unbounded preceding) as s\n" + - "\t, ds\n" + + Assert.assertEquals("select sum(c) over (order by ds rows unbounded preceding) as s, ds\n" + "from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_5.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_5.java index de722d1167..07098982c0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_over_rows_5.java @@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows_5 extends TestCase { public void test_select() throws Exception { String sql = "SELECT sum(c) over(order by ds rows UNBOUNDED following) s, ds FROM t1";// - Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED FOLLOWING) AS s\n" + - "\t, ds\n" + + Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED FOLLOWING) AS s, ds\n" + "FROM t1", SQLUtils.formatOdps(sql)); - Assert.assertEquals("select sum(c) over (order by ds rows unbounded following) as s\n" + - "\t, ds\n" + + Assert.assertEquals("select sum(c) over (order by ds rows unbounded following) as s, ds\n" + "from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java index 8e8f774c00..d443e96ed8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java @@ -33,28 +33,23 @@ public class OracleSubqueryFactoringTest extends TestCase { + "avg_cost AS (SELECT SUM(dept_total)/COUNT(*) avg FROM dept_costs)\n" + "SELECT * FROM dept_costs WHERE dept_total > (SELECT avg FROM avg_cost) ORDER BY department_name;"; - String expected = "WITH\n" // - + "\tdept_costs\n" // - + "\tAS\n" // - + "\t(\n"// - + "\t\tSELECT department_name, SUM(salary) AS dept_total\n" // - + "\t\tFROM employees e, departments d\n"// - + "\t\tWHERE e.department_id = d.department_id\n" // - + "\t\tGROUP BY department_name\n" // - + "\t), \n" // - + "\tavg_cost\n" // - + "\tAS\n"// - + "\t(\n" // - + "\t\tSELECT SUM(dept_total) / COUNT(*) AS avg\n" // - + "\t\tFROM dept_costs\n" // - + "\t)\n" // - + "SELECT *\n" // - + "FROM dept_costs\n" // - + "WHERE dept_total > (\n" // - + "\tSELECT avg\n" // - + "\tFROM avg_cost\n" // - + ")\n" // - + "ORDER BY department_name;"; + String expected = "WITH dept_costs AS (\n" + + "\t\tSELECT department_name, SUM(salary) AS dept_total\n" + + "\t\tFROM employees e, departments d\n" + + "\t\tWHERE e.department_id = d.department_id\n" + + "\t\tGROUP BY department_name\n" + + "\t), \n" + + "\tavg_cost AS (\n" + + "\t\tSELECT SUM(dept_total) / COUNT(*) AS avg\n" + + "\t\tFROM dept_costs\n" + + "\t)\n" + + "SELECT *\n" + + "FROM dept_costs\n" + + "WHERE dept_total > (\n" + + "\tSELECT avg\n" + + "\tFROM avg_cost\n" + + ")\n" + + "ORDER BY department_name;"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java index 8c50ab59f5..0dc44a0bc1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest2.java @@ -38,22 +38,22 @@ public class OracleSubqueryFactoringTest2 extends TestCase { + "SELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id, salary, job_id\n" + "FROM org_chart\n" + "ORDER BY order1;\n"; - String expected = "WITH\n" - + "\torg_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id)\n" - + "\tAS\n" - + "\t(\n" - + "\t\tSELECT employee_id, last_name, manager_id, 0 AS reportLevel, salary\n" - + "\t\t\t, job_id\n" - + "\t\tFROM employees\n" - + "\t\tWHERE manager_id IS NULL\n" - + "\t\tUNION ALL\n" - + "\t\tSELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel + 1 AS reportLevel, e.salary\n" - + "\t\t\t, e.job_id\n" + "\t\tFROM org_chart r, employees e\n" - + "\t\tWHERE r.eid = e.manager_id\n" + "\t)\n" - + "\tSEARCH DEPTH FIRST BY emp_last SET order1\n" - + "\tCYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'\n" - + "SELECT lpad(' ', 2 * reportLevel) || emp_last AS emp_name, eid, mgr_id, salary, job_id\n" - + "FROM org_chart\n" + "ORDER BY order1;"; + String expected = "WITH org_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id) AS (\n" + + "\t\tSELECT employee_id, last_name, manager_id, 0 AS reportLevel, salary\n" + + "\t\t\t, job_id\n" + + "\t\tFROM employees\n" + + "\t\tWHERE manager_id IS NULL\n" + + "\t\tUNION ALL\n" + + "\t\tSELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel + 1 AS reportLevel, e.salary\n" + + "\t\t\t, e.job_id\n" + + "\t\tFROM org_chart r, employees e\n" + + "\t\tWHERE r.eid = e.manager_id\n" + + "\t)\n" + + "\tSEARCH DEPTH FIRST BY emp_last SET order1\n" + + "\tCYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'\n" + + "SELECT lpad(' ', 2 * reportLevel) || emp_last AS emp_name, eid, mgr_id, salary, job_id\n" + + "FROM org_chart\n" + + "ORDER BY order1;"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_exception_0.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_exception_0.java index 5d450c5eb2..4a3204903b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_exception_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_exception_0.java @@ -95,12 +95,16 @@ public class Oracle_pl_exception_0 extends OracleTest { "\ttemp VARCHAR2(30);\n" + "BEGIN\n" + "\ttemp := t_column;\n" + + "\t-- For error message if next SELECT fails\n" + + "\t-- Fails if table t_name does not have column t_column:\n" + "\tSELECT COLUMN_NAME\n" + "\tINTO temp\n" + "\tFROM USER_TAB_COLS\n" + "\tWHERE TABLE_NAME = UPPER(t_name)\n" + "\t\tAND COLUMN_NAME = UPPER(t_column);\n" + "\ttemp := t_name;\n" + + "\t-- For error message if next SELECT fails\n" + + "\t-- Fails if there is no table named t_name:\n" + "\tSELECT OBJECT_NAME\n" + "\tINTO temp\n" + "\tFROM USER_OBJECTS\n" + @@ -124,12 +128,16 @@ public class Oracle_pl_exception_0 extends OracleTest { "\ttemp VARCHAR2(30);\n" + "begin\n" + "\ttemp := t_column;\n" + + "\t-- For error message if next SELECT fails\n" + + "\t-- Fails if table t_name does not have column t_column:\n" + "\tselect COLUMN_NAME\n" + "\tinto temp\n" + "\tfrom USER_TAB_COLS\n" + "\twhere TABLE_NAME = UPPER(t_name)\n" + "\t\tand COLUMN_NAME = UPPER(t_column);\n" + "\ttemp := t_name;\n" + + "\t-- For error message if next SELECT fails\n" + + "\t-- Fails if there is no table named t_name:\n" + "\tselect OBJECT_NAME\n" + "\tinto temp\n" + "\tfrom USER_OBJECTS\n" + 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 0a6d8e7fff..356574c055 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 @@ -56,10 +56,7 @@ public class OracleSelectTest38 extends OracleTest { String result = SQLUtils.toOracleString(stmt); Assert.assertEquals("SELECT *\n" + "FROM (\n" + - "\tWITH\n" + - "\t\tvw_kreis_statics_t\n" + - "\t\tAS\n" + - "\t\t(\n" + + "\tWITH vw_kreis_statics_t AS (\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\n" + @@ -106,10 +103,7 @@ public class OracleSelectTest38 extends OracleTest { String result = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); assertEquals("select *\n" + "from (\n" + - "\twith\n" + - "\t\tvw_kreis_statics_t\n" + - "\t\tas\n" + - "\t\t(\n" + + "\twith vw_kreis_statics_t as (\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\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest63_with_recursive.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest63_with_recursive.java new file mode 100644 index 0000000000..e6625a3e73 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest63_with_recursive.java @@ -0,0 +1,113 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest63_with_recursive extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "WITH t1(id, parent_id) AS (\n" + + " -- Anchor member.\n" + + " SELECT id,\n" + + " parent_id\n" + + " FROM tab1\n" + + " WHERE parent_id IS NULL\n" + + " UNION ALL\n" + + " -- Recursive member.\n" + + " SELECT t2.id,\n" + + " t2.parent_id\n" + + " FROM tab1 t2, t1\n" + + " WHERE t2.parent_id = t1.id\n" + + ")\n" + + "SEARCH BREADTH FIRST BY id SET order1\n" + + "SELECT id,\n" + + " parent_id\n" + + "FROM t1\n" + + "ORDER BY order1;"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(2, visitor.getColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("WITH t1 (id, parent_id) AS (\n" + + "\t\t-- Anchor member.\n" + + "\t\tSELECT id, parent_id\n" + + "\t\tFROM tab1\n" + + "\t\tWHERE parent_id IS NULL\n" + + "\t\tUNION ALL\n" + + "\t\t-- Recursive member.\n" + + "\t\tSELECT t2.id, t2.parent_id\n" + + "\t\tFROM tab1 t2, t1\n" + + "\t\tWHERE t2.parent_id = t1.id\n" + + "\t)\n" + + "\tSEARCH BREADTH FIRST BY id SET order1\n" + + "SELECT id, parent_id\n" + + "FROM t1\n" + + "ORDER BY order1;", text); + } + + { + String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + + Assert.assertEquals("with t1 (id, parent_id) as (\n" + + "\t\t-- Anchor member.\n" + + "\t\tselect id, parent_id\n" + + "\t\tfrom tab1\n" + + "\t\twhere parent_id is null\n" + + "\t\tunion all\n" + + "\t\t-- Recursive member.\n" + + "\t\tselect t2.id, t2.parent_id\n" + + "\t\tfrom tab1 t2, t1\n" + + "\t\twhere t2.parent_id = t1.id\n" + + "\t)\n" + + "\tsearch BREADTH first by id set order1\n" + + "select id, parent_id\n" + + "from t1\n" + + "order by order1;", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java new file mode 100644 index 0000000000..f3fc0e9356 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest64_with_recursive.java @@ -0,0 +1,114 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest64_with_recursive extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "WITH t1(id, parent_id, lvl) AS (\n" + + " -- Anchor member.\n" + + " SELECT id,\n" + + " parent_id,\n" + + " 1 AS lvl\n" + + " FROM tab1\n" + + " WHERE parent_id IS NULL\n" + + " UNION ALL\n" + + " -- Recursive member.\n" + + " SELECT t2.id,\n" + + " t2.parent_id,\n" + + " lvl+1\n" + + " FROM tab1 t2, t1\n" + + " WHERE t2.parent_id = t1.id\n" + + ")\n" + + "SEARCH DEPTH FIRST BY id SET order1\n" + + "SELECT id,\n" + + " parent_id,\n" + + " RPAD('.', (lvl-1)*2, '.') || id AS tree,\n" + + " lvl\n" + + "FROM t1\n" + + "ORDER BY order1;"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(2, visitor.getColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("WITH t1 (id, parent_id, lvl) AS (\n" + + "\t\t-- Anchor member.\n" + + "\t\tSELECT id, parent_id, 1 AS lvl\n" + + "\t\tFROM tab1\n" + + "\t\tWHERE parent_id IS NULL\n" + + "\t\tUNION ALL\n" + + "\t\t-- Recursive member.\n" + + "\t\tSELECT t2.id, t2.parent_id, lvl + 1\n" + + "\t\tFROM tab1 t2, t1\n" + + "\t\tWHERE t2.parent_id = t1.id\n" + + "\t)\n" + + "\tSEARCH DEPTH FIRST BY id SET order1\n" + + "SELECT id, parent_id, RPAD('.', (lvl - 1) * 2, '.') || id AS tree, lvl\n" + + "FROM t1\n" + + "ORDER BY order1;", text); + } + + { + String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + + assertEquals("with t1 (id, parent_id, lvl) as (\n" + + "\t\t-- Anchor member.\n" + + "\t\tselect id, parent_id, 1 as lvl\n" + + "\t\tfrom tab1\n" + + "\t\twhere parent_id is null\n" + + "\t\tunion all\n" + + "\t\t-- Recursive member.\n" + + "\t\tselect t2.id, t2.parent_id, lvl + 1\n" + + "\t\tfrom tab1 t2, t1\n" + + "\t\twhere t2.parent_id = t1.id\n" + + "\t)\n" + + "\tsearch DEPTH first by id set order1\n" + + "select id, parent_id, RPAD('.', (lvl - 1) * 2, '.') || id as tree, lvl\n" + + "from t1\n" + + "order by order1;", text); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest6.java index 6925b50d00..5e017e61c6 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest6.java @@ -37,25 +37,20 @@ public class SQLServerSelectTest6 extends TestCase { "FROM DirReps " + // "ORDER BY ManagerID;"; - String expect = "WITH" + - "\n\tDirReps (ManagerID, DirectReports)" + - "\n\tAS" + - "\n\t(" + - "\n\t\tSELECT ManagerID, COUNT(*)" + - "\n\t\tFROM HumanResources.Employee e" + - "\n\t\tWHERE ManagerID IS NOT NULL" + - "\n\t\tGROUP BY ManagerID" + - "\n\t)" + - "\nSELECT ManagerID, DirectReports" + - "\nFROM DirReps" + - "\nORDER BY ManagerID;"; - SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); String text = TestUtils.outputSqlServer(stmt); - Assert.assertEquals(expect, text); + assertEquals("WITH DirReps (ManagerID, DirectReports) AS (\n" + + "\t\tSELECT ManagerID, COUNT(*)\n" + + "\t\tFROM HumanResources.Employee e\n" + + "\t\tWHERE ManagerID IS NOT NULL\n" + + "\t\tGROUP BY ManagerID\n" + + "\t)\n" + + "SELECT ManagerID, DirectReports\n" + + "FROM DirReps\n" + + "ORDER BY ManagerID;", text); // System.out.println(text); } 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 6c173c58f0..2719999ace 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 @@ -68,10 +68,7 @@ public class SQLServerSelectTest7 extends TestCase { String text = TestUtils.outputSqlServer(stmt); - assertEquals("WITH\n" + - "\tmenu_view\n" + - "\tAS\n" + - "\t(\n" + + assertEquals("WITH menu_view AS (\n" + "\t\tSELECT t.*, 1 AS level\n" + "\t\tFROM sec_portal_menu t\n" + "\t\tWHERE t.parent_id = ?\n" +