diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 6939919eed..af8a46f9f2 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -30,6 +30,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.db2.visitor.DB2OutputVisitor; @@ -267,6 +268,10 @@ public class SQLUtils { } } visitor.println(); + + if (!(stmt instanceof SQLSetStatement)) { + visitor.println(); + } } { List comments = stmt.getBeforeCommentsDirect(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java index 0aaaaea3df..1a91c784dd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java @@ -21,6 +21,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLOrderBy; +import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -34,7 +35,7 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { protected List hints; protected SQLExpr distributeBy; - protected SQLExpr sortBy; + protected SQLSelectOrderByItem sortBy; public OdpsSelectQueryBlock(){ @@ -56,11 +57,11 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { this.distributeBy = distributeBy; } - public SQLExpr getSortBy() { + public SQLSelectOrderByItem getSortBy() { return sortBy; } - public void setSortBy(SQLExpr sortBy) { + public void setSortBy(SQLSelectOrderByItem sortBy) { this.sortBy = sortBy; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java index ca518fd350..55300c506c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java @@ -16,7 +16,9 @@ package com.alibaba.druid.sql.dialect.odps.parser; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLOrderingSpecification; import com.alibaba.druid.sql.ast.SQLSetQuantifier; +import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -88,7 +90,18 @@ public class OdpsSelectParser extends SQLSelectParser { if (identifierEquals("SORT")) { lexer.nextToken(); accept(Token.BY); - SQLExpr sortBy = this.expr(); + SQLExpr expr = this.expr(); + + SQLSelectOrderByItem sortBy = new SQLSelectOrderByItem(expr); + + if (lexer.token() == Token.ASC) { + sortBy.setType(SQLOrderingSpecification.ASC); + lexer.nextToken(); + } else if (lexer.token() == Token.DESC) { + sortBy.setType(SQLOrderingSpecification.DESC); + lexer.nextToken(); + } + queryBlock.setSortBy(sortBy); } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 724cefdc05..ae4437873f 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -79,6 +79,8 @@ public class Lexer { protected boolean keepComments = false; protected int line = 0; + + protected int lines = 0; public Lexer(String input){ this(input, null); @@ -293,10 +295,15 @@ public class Lexer { comments = null; } + this.lines = 0; + int startLine = line; + for (;;) { if (isWhitespace(ch)) { if (ch == '\n') { line++; + + lines = line - startLine; } scanChar(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java index 108ad1db6f..d91ef9ddee 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java @@ -19,6 +19,7 @@ public class OdpsFormatCommentTest2 extends TestCase { + "\n--[Created -2015-06-10 13:19:18]" + "\n--[Update ]" + "\nSET odps.sql.mapper.split.size = 2048;" + + "\n" // + "\nSELECT *" + "\nFROM dual;", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest3.java index 1d1b8e5254..84ab36e775 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest3.java @@ -20,8 +20,10 @@ public class OdpsFormatCommentTest3 extends TestCase { + "\nSET odps.service.mode = all;"// + "\n-- 使用新引擎"// + "\nSET odps.nvm.enabled = true;"// + + "\n" // + "\nSELECT f1 -- aa"// + "\nFROM t0;"// + + "\n" // + "\nSELECT f2 -- aa"// + "\nFROM t1;", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java index 35e3ce13f7..bad8a77e6e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java @@ -15,6 +15,7 @@ public class OdpsFormatCommentTest7 extends TestCase { Assert.assertEquals("--这里是注释" + "\nSELECT *" + "\nFROM table1;" + + "\n" + "\nSELECT *" + "\nFROM table2;", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java index 07acdab887..6d88245c3c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java @@ -15,9 +15,11 @@ public class OdpsFormatCommentTest8 extends TestCase { ;// Assert.assertEquals("SELECT *" + "\nFROM table1;" + + "\n" + "\n--comment1 goes here" + "\nSELECT *" + "\nFROM table2;" + + "\n" + "\nSELECT *" + "\nFROM table3;--comment2 goes here", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatTest.java index 16e43b3081..12f4004b23 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatTest.java @@ -11,6 +11,7 @@ public class OdpsFormatTest extends TestCase { String sql = "select * from t1; ;select * from t2;"; Assert.assertEquals("SELECT *" // + "\nFROM t1;" // + + "\n" + "\nSELECT *" // + "\nFROM t2;", SQLUtils.formatOdps(sql)); } @@ -19,6 +20,7 @@ public class OdpsFormatTest extends TestCase { String sql = "select * from t1; ;select * from t2"; Assert.assertEquals("SELECT *" // + "\nFROM t1;" // + + "\n" + "\nSELECT *" // + "\nFROM t2", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest.java index fc049ba4bf..b6d3493b1c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest.java @@ -36,5 +36,12 @@ public class OdpsSelectTest extends TestCase { + "\nFROM sale_detail" // + "\nDISTRIBUTE BY region SORT BY f1;", SQLUtils.formatOdps(sql)); } + + public void test_distribute_by_2() throws Exception { + String sql = " select region from sale_detail distribute by region sort by f1 asc;";// + Assert.assertEquals("SELECT region" // + + "\nFROM sale_detail" // + + "\nDISTRIBUTE BY region SORT BY f1 ASC;", SQLUtils.formatOdps(sql)); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportColumnsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportColumnsTest.java deleted file mode 100644 index 4b67821a80..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportColumnsTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.alibaba.druid.bvt.sql.odps.udf; - -import com.alibaba.druid.support.opds.udf.ExportColumns; - -import junit.framework.TestCase; - -public class ExportColumnsTest extends TestCase { - - private ExportColumns udf = new ExportColumns(); - - public ExportColumnsTest() { - - } -}