diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java index 8b4fa85f72..75dc32df26 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -283,12 +283,30 @@ public class SQLParser { case REPEAT: case USE: case MOD: - case QUALIFY: case OUT: { String strVal = lexer.stringVal(); lexer.nextToken(); return strVal; } + case QUALIFY: { + String strVal = lexer.stringVal(); + Lexer.SavePoint mark = lexer.mark(); + lexer.nextToken(); + if (lexer.token != Token.WHERE + && lexer.token != Token.GROUP + && lexer.token != Token.HAVING + && lexer.token != Token.WINDOW + && lexer.token != Token.ORDER + && lexer.token != Token.LIMIT + && lexer.token != Token.EOF + && lexer.token != Token.COMMA + ) { + lexer.reset(mark); + return null; + } else { + return strVal; + } + } case DISTRIBUTE: { String strVal = lexer.stringVal(); Lexer.SavePoint mark = lexer.mark(); diff --git a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index a6324e343f..2c642af063 100644 --- a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1289,7 +1289,15 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet printExpr(conditionExpr, parameterized); this.indentCount--; - if (lines != this.lines) { + boolean println = lines != this.lines; + if (isPrettyFormat() && !println) { + List afterComments = conditionExpr.getAfterCommentsDirect(); + if (afterComments != null && !afterComments.isEmpty()) { + println = true; + } + } + + if (println) { println(); } else { print(' '); diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsResourceTest.java b/core/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsResourceTest.java index dc67576efb..38bfd1ec02 100644 --- a/core/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsResourceTest.java +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsResourceTest.java @@ -17,7 +17,13 @@ package com.alibaba.druid.bvt.sql.odps; import java.util.List; +import com.alibaba.druid.DbType; import com.alibaba.druid.TestUtil; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.parser.SQLParserFeature; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.VisitorFeature; import junit.framework.TestCase; import org.junit.Assert; @@ -27,6 +33,8 @@ import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser; import com.alibaba.druid.sql.dialect.odps.visitor.OdpsSchemaStatVisitor; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import static org.junit.Assert.assertEquals; + public class OdpsResourceTest extends TestCase { public void test_0() throws Exception { exec_test("bvt/parser/odps-0.txt"); @@ -39,6 +47,10 @@ public class OdpsResourceTest extends TestCase { public void test_10() throws Exception { exec_test("bvt/parser/odps-10.txt"); } +// +// public void test_13() throws Exception { +// exec_test("bvt/parser/odps-13.txt"); +// } public void exec_test(String resource) throws Exception { String input = TestUtil.getResource(resource); @@ -51,6 +63,7 @@ public class OdpsResourceTest extends TestCase { } OdpsStatementParser parser = new OdpsStatementParser(sql); + parser.config(SQLParserFeature.KeepComments, true); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); @@ -60,7 +73,7 @@ public class OdpsResourceTest extends TestCase { stmt.accept(visitor); if (expect != null) { - String result = stmt.toString(); + String result = stmt.toString(VisitorFeature.OutputPrettyFormat); assertEquals(expect, result); } } diff --git a/core/src/test/resources/bvt/parser/odps-11.txt b/core/src/test/resources/bvt/parser/odps-11.txt new file mode 100644 index 0000000000..26a117e216 --- /dev/null +++ b/core/src/test/resources/bvt/parser/odps-11.txt @@ -0,0 +1,9 @@ +--asdasdas \u001Aasdad +select api_name +from t_api +where api_name is not null; +--------------------------- +-- asdasdas \u001Aasdad +SELECT api_name +FROM t_api +WHERE api_name IS NOT NULL; \ No newline at end of file diff --git a/core/src/test/resources/bvt/parser/odps-12.txt b/core/src/test/resources/bvt/parser/odps-12.txt new file mode 100644 index 0000000000..26a117e216 --- /dev/null +++ b/core/src/test/resources/bvt/parser/odps-12.txt @@ -0,0 +1,9 @@ +--asdasdas \u001Aasdad +select api_name +from t_api +where api_name is not null; +--------------------------- +-- asdasdas \u001Aasdad +SELECT api_name +FROM t_api +WHERE api_name IS NOT NULL; \ No newline at end of file diff --git a/core/src/test/resources/bvt/parser/odps-13.txt b/core/src/test/resources/bvt/parser/odps-13.txt new file mode 100644 index 0000000000..de84a7bc4b --- /dev/null +++ b/core/src/test/resources/bvt/parser/odps-13.txt @@ -0,0 +1,23 @@ +select case when t1.type='JP' and t1.value>0 + then (case when t1.category_id =29 --注释1 + then ((0.95*t1.value)*1.04)+0.3 + when t1.category_id =48 --注释2 + then ((0.85*t1.value)*1.04)+0.3 + when t1.category_id in (2,92) --注释3 + then ((0.75*t1.value)*1.04)+0.3 + else ((0.65*t1.value)*1.04)+0.3 + end ) end from t_demo t1 +--------------------------- +SELECT CASE + WHEN t1.type = 'JP' + AND t1.value > 0 + THEN + CASE + WHEN t1.category_id = 29 THEN 0.95 * t1.value * 1.04 + 0.3 + WHEN t1.category_id = 48 THEN 0.85 * t1.value * 1.04 + 0.3 + WHEN t1.category_id IN (2, 92) -- 注释3 + THEN 0.75 * t1.value * 1.04 + 0.3 + ELSE 0.65 * t1.value * 1.04 + 0.3 + END + END +FROM t_demo t1 \ No newline at end of file