mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -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" +
|
||||
|
||||
+113
@@ -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")));
|
||||
}
|
||||
}
|
||||
+114
@@ -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" +
|
||||
|
||||
Reference in New Issue
Block a user