improved sql parser.

This commit is contained in:
wenshao
2017-06-10 21:16:44 +08:00
parent f1532e9555
commit d66a4e2097
33 changed files with 419 additions and 253 deletions
@@ -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 ");
@@ -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<SQLSelectItem> 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<SQLSelectItem> 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());
}
}
@@ -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) {
@@ -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();
@@ -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();
@@ -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<String> comments, String seperator) {
protected void printlnComment(List<String> 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);
}
}
@@ -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);
}
}
@@ -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);
}
@@ -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);
}
@@ -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));
}
}
@@ -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));
}
}
@@ -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));
}
}
@@ -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));
}
}
@@ -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<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
SQLStatement stmt = statementList.get(0);
@@ -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));
@@ -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" +
@@ -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" +
@@ -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));
}
@@ -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));
}
@@ -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<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -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" +
@@ -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" +
@@ -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<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -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<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -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<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -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);
@@ -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);
@@ -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" +
@@ -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" +
@@ -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<SQLStatement> 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")));
}
}
@@ -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<SQLStatement> 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);
}
}
}
@@ -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);
}
@@ -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" +