From d9144506b2d3d753e1e4a6c0eb410c1c011600a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Mon, 29 Feb 2016 09:42:15 +0800 Subject: [PATCH] change sql parser exists format --- .../sql/visitor/SQLASTOutputVisitor.java | 2 + .../druid/bvt/sql/mysql/MySqlFormatTest2.java | 41 +++++++++++++++++++ .../bvt/sql/mysql/SELECT_Syntax_Test.java | 15 ++++++- .../sql/sqlserver/SQLServerSelectTest7.java | 6 ++- 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlFormatTest2.java diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 1b923c7cea..f993671243 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -564,7 +564,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab print0(ucase ? "EXISTS (" : "exists ("); } incrementIndent(); + println(); x.getSubQuery().accept(this); + println(); decrementIndent(); print(')'); return false; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlFormatTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlFormatTest2.java new file mode 100644 index 0000000000..158adb5795 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlFormatTest2.java @@ -0,0 +1,41 @@ +/* + * Copyright 1999-2101 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.mysql; + +import org.junit.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcUtils; + +public class MySqlFormatTest2 extends TestCase { + + public void test_0() throws Exception { + String text = "SELECT cq.uuid FROM ce_queue cq " + + "WHERE cq.status = ? AND NOT EXISTS (SELECT ? FROM ce_queue cq2 WHERE cq.component_uuid = cq2.component_uuid AND cq2.status <> ?) " + + "ORDER BY cq.created_at ASC, cq.id ASC"; + Assert.assertEquals("SELECT cq.uuid" + + "\nFROM ce_queue cq" + + "\nWHERE cq.status = ?" + + "\n\tAND NOT EXISTS (" + + "\n\t\tSELECT ?" + + "\n\t\tFROM ce_queue cq2" + + "\n\t\tWHERE cq.component_uuid = cq2.component_uuid" + + "\n\t\t\tAND cq2.status <> ?" + + "\n\t\t)" + + "\nORDER BY cq.created_at ASC, cq.id ASC", SQLUtils.format(text, JdbcUtils.MYSQL)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java index 5a54937db6..c94eb42c73 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java @@ -113,7 +113,12 @@ public class SELECT_Syntax_Test extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT column1\nFROM t1\nWHERE EXISTS (SELECT *\n\tFROM t2);", text); + Assert.assertEquals("SELECT column1" // + + "\nFROM t1" // + + "\nWHERE EXISTS (" // + + "\n\tSELECT *" // + + "\n\tFROM t2" + + "\n\t);", text); } public void test_8() throws Exception { @@ -124,7 +129,13 @@ public class SELECT_Syntax_Test extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT DISTINCT store_type\nFROM stores\nWHERE NOT EXISTS (SELECT *\n\tFROM cities_stores\n\tWHERE cities_stores.store_type = stores.store_type);", + Assert.assertEquals("SELECT DISTINCT store_type" // + + "\nFROM stores" // + + "\nWHERE NOT EXISTS (" // + + "\n\tSELECT *" + + "\n\tFROM cities_stores" + + "\n\tWHERE cities_stores.store_type = stores.store_type" + + "\n\t);", text); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java index 02587a1fa3..50e3c37a6c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest7.java @@ -79,7 +79,8 @@ public class SQLServerSelectTest7 extends TestCase { "\nWHERE 1 = 1" + "\n\tAND t.deleted = 0" + "\n\tAND t.link_type IN ('simple', 'link')" + - "\n\tAND (EXISTS (SELECT p.entity_code" + + "\n\tAND (EXISTS (" + + "\n\t\t\tSELECT p.entity_code" + "\n\t\t\tFROM sec_role_auth p" + "\n\t\t\tWHERE p.entity_code = t.menu_id" + "\n\t\t\t\tAND p.entity_type = 'menu'" + @@ -89,7 +90,8 @@ public class SQLServerSelectTest7 extends TestCase { "\n\t\t\t\t\t\tAND entity_code = ?" + "\n\t\t\t\t\t\tAND r.role_id = rm.role_id" + "\n\t\t\t\t\t\tAND r.enabled = 1" + - "\n\t\t\t\t\t\tAND r.deleted = 0))" + + "\n\t\t\t\t\t\tAND r.deleted = 0)"+ + "\n\t\t\t)" + "\n\t\tOR '1' = ?" + "\n\t\tOR t.need_control = 0)" + "\n\tAND (t.enabled = 1" +