From 511edb5b6307ef843fdd59269e10560229a47259 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 20 May 2011 17:23:04 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=BE=93=E5=87=BA=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@163 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../mysql/visitor/MySqlOutputVisitor.java | 2 +- .../ast/visitor/OracleOutputVisitor.java | 2 +- .../sql/visitor/SQLASTOutputVisitor.java | 27 +++++++++++++++---- .../bvt/parser/MySqlParserResourceTest.java | 1 + src/test/resources/bvt/parser/mysql-1.txt | 3 ++- src/test/resources/bvt/parser/mysql-2.txt | 6 +++-- src/test/resources/bvt/parser/mysql-6.txt | 6 +++-- src/test/resources/bvt/parser/oracle-1.txt | 10 +++++-- src/test/resources/bvt/parser/oracle-15.txt | 5 +++- src/test/resources/bvt/parser/oracle-17.txt | 14 +++++++--- src/test/resources/bvt/parser/oracle-24.txt | 3 ++- src/test/resources/bvt/parser/oracle-25.txt | 9 +++++-- 12 files changed, 66 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index fcd0e37217..a0879a32f7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -120,7 +120,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print("SQL_CALC_FOUND_ROWS "); } - printAndAccept(select.getSelectList(), ", "); + printSelectList(select.getSelectList()); if (select.getOutFile() != null) { println(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java index 3087555737..9eeaa3644f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java @@ -646,7 +646,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("*/ "); } - printAndAccept(select.getSelectList(), ", "); + printSelectList(select.getSelectList()); println(); print("FROM "); 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 105cffe1db..f06bc3f12a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -137,11 +137,28 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { } } + protected void printSelectList(List selectList) { + incrementIndent(); + for (int i = 0, size = selectList.size(); i < size; ++i) { + if (i != 0) { + if (i % 5 == 0) { + println(); + } + + print(", "); + } + + selectList.get(i).accept(this); + } + decrementIndent(); + } + protected void printlnAndAccept(List nodes, String seperator) { for (int i = 0, size = nodes.size(); i < size; ++i) { if (i != 0) { println(seperator); } + ((SQLObject) nodes.get(i)).accept(this); } } @@ -424,7 +441,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { print("UNIQUE "); } - printAndAccept(select.getSelectList(), ", "); + printSelectList(select.getSelectList()); if (select.getFrom() != null) { println(); @@ -806,16 +823,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { return false; } - + @Override public boolean visit(SQLListExpr x) { print("("); printAndAccept(x.getItems(), ", "); print(")"); - + return false; } - + @Override public boolean visit(SQLSubqueryTableSource x) { print("("); @@ -823,7 +840,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { x.getSelect().accept(this); decrementIndent(); print(")"); - + return false; } } diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java index c7ad6f6c40..8435ef9720 100644 --- a/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java @@ -47,6 +47,7 @@ public class MySqlParserResourceTest extends TestCase { String text = output(statementList); System.out.println(text); + System.out.println(); Assert.assertEquals(expect, text.trim()); } diff --git a/src/test/resources/bvt/parser/mysql-1.txt b/src/test/resources/bvt/parser/mysql-1.txt index 58b3f2bbc8..ab06c1582d 100644 --- a/src/test/resources/bvt/parser/mysql-1.txt +++ b/src/test/resources/bvt/parser/mysql-1.txt @@ -7,7 +7,8 @@ ORDER BY sequence desc LIMIT ?, ? --------------------------- -SELECT id, item_type AS 'itemType', item_id AS 'itemId', item_name AS 'itemName', app_id AS 'appId', sequence, refresh_intv AS "refreshIntv" +SELECT id, item_type AS 'itemType', item_id AS 'itemId', item_name AS 'itemName', app_id AS 'appId' + , sequence, refresh_intv AS "refreshIntv" FROM view_portal_info WHERE 1 = 1 AND item_type = ? AND app_id = ? ORDER BY sequence DESC diff --git a/src/test/resources/bvt/parser/mysql-2.txt b/src/test/resources/bvt/parser/mysql-2.txt index c08f69a09a..977427fb52 100644 --- a/src/test/resources/bvt/parser/mysql-2.txt +++ b/src/test/resources/bvt/parser/mysql-2.txt @@ -4,6 +4,8 @@ FROM sys_user LIMIT ?, ? --------------------------- -SELECT id AS "id", username AS "username", password AS "password", name AS "name", staff_num AS "staffNumber", wangwang AS "wangwang", email AS "email", mobile AS "mobile", is_deleted AS "isDeleted", is_admin AS "isAdmin", gmt_create AS "gmtCreate" +SELECT id AS "id", username AS "username", password AS "password", name AS "name", staff_num AS "staffNumber" + , wangwang AS "wangwang", email AS "email", mobile AS "mobile", is_deleted AS "isDeleted", is_admin AS "isAdmin" + , gmt_create AS "gmtCreate" FROM sys_user -LIMIT ?, ? \ No newline at end of file +LIMIT ?, ? diff --git a/src/test/resources/bvt/parser/mysql-6.txt b/src/test/resources/bvt/parser/mysql-6.txt index 8f40785301..09607f80f9 100644 --- a/src/test/resources/bvt/parser/mysql-6.txt +++ b/src/test/resources/bvt/parser/mysql-6.txt @@ -38,6 +38,8 @@ from ( --------------------------- SELECT count(*) -FROM (SELECT a.activity_offer_id AS adResourceId, a.title AS adResourceName, a.b2boffer_url AS adResourceURL, a.custid, b.memberid, c.position_name AS positionName, c.charge_setting AS feeRegulation, a.priority_weight AS priorityWeight, a.audit_state AS adResourceState, 0 AS adResourceType, a.gmt_create, a.refuse_remark +FROM (SELECT a.activity_offer_id AS adResourceId, a.title AS adResourceName, a.b2boffer_url AS adResourceURL, a.custid, b.memberid + , c.position_name AS positionName, c.charge_setting AS feeRegulation, a.priority_weight AS priorityWeight, a.audit_state AS adResourceState, 0 AS adResourceType + , a.gmt_create, a.refuse_remark FROM q_activity_offer_enroll a , q_custinfo b , q_activity_position c - WHERE a.custid = b.custid AND a.activity_position_id = c.activity_position_id AND c.activity_id = ?) \ No newline at end of file + WHERE a.custid = b.custid AND a.activity_position_id = c.activity_position_id AND c.activity_id = ?) diff --git a/src/test/resources/bvt/parser/oracle-1.txt b/src/test/resources/bvt/parser/oracle-1.txt index 1c34682e6a..1067b1a748 100644 --- a/src/test/resources/bvt/parser/oracle-1.txt +++ b/src/test/resources/bvt/parser/oracle-1.txt @@ -58,10 +58,16 @@ INSERT INTO GLOBAL_ACCOUNT_SMD WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1 --------------------------- -INSERT INTO GLOBAL_ACCOUNT_SMD (ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE) (SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE +INSERT INTO GLOBAL_ACCOUNT_SMD (ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE) (SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR + , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND + , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID + , IS_DELETED, CUST_GRADE FROM APOLLO_ZEUS.GLOBAL_ACCOUNT WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1 UNION ALL - SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE + SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR + , DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND + , CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID + , IS_DELETED, CUST_GRADE FROM APOLLO_NIR.GLOBAL_ACCOUNT WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1); \ No newline at end of file diff --git a/src/test/resources/bvt/parser/oracle-15.txt b/src/test/resources/bvt/parser/oracle-15.txt index 919de2e886..06f0ebdaf4 100644 --- a/src/test/resources/bvt/parser/oracle-15.txt +++ b/src/test/resources/bvt/parser/oracle-15.txt @@ -21,7 +21,10 @@ WHERE ROWNUM < ?) WHERE CNT > ? --------------------------- SELECT * FROM (SELECT A.*, rownum AS cnt - FROM (SELECT A.CUSTID, A.PAYCOUNT, A.MEMBERID, A.ACCREDITSTATUS, C.CUSTNAME, C.CONTNAME, C.CONTPHONECITYCODE, C.CONTPHONE, C.CONTMOBPHONE, C.CONTFAXCITYCODE, C.CONTFAX, C.CONTEMAIL, C.CUSTAREA AS AREANAME, C.CUSTADDR, C.ORGINDUSTRY AS ORGINDUSTRYNAME, E.DESCRIPTION AS CUSTSTATNAME, F.DESCRIPTION AS B2BCUSTTYPENAME, NULL AS CUSTSERVICERNAME, G.DESCRIPTION AS B2BVALIDFLAGNAME, A.VALIDFLAG + FROM (SELECT A.CUSTID, A.PAYCOUNT, A.MEMBERID, A.ACCREDITSTATUS, C.CUSTNAME + , C.CONTNAME, C.CONTPHONECITYCODE, C.CONTPHONE, C.CONTMOBPHONE, C.CONTFAXCITYCODE + , C.CONTFAX, C.CONTEMAIL, C.CUSTAREA AS AREANAME, C.CUSTADDR, C.ORGINDUSTRY AS ORGINDUSTRYNAME + , E.DESCRIPTION AS CUSTSTATNAME, F.DESCRIPTION AS B2BCUSTTYPENAME, NULL AS CUSTSERVICERNAME, G.DESCRIPTION AS B2BVALIDFLAGNAME, A.VALIDFLAG FROM Q_CUSTOMERS A , Q_CUSTINFO C , (SELECT * FROM Q_DOMAINCDSTRING WHERE DOMAINCD = 'CUSTOMERS_CUSTSTAT') E , (SELECT * diff --git a/src/test/resources/bvt/parser/oracle-17.txt b/src/test/resources/bvt/parser/oracle-17.txt index 2e9aae6bee..b2f1b3cf18 100644 --- a/src/test/resources/bvt/parser/oracle-17.txt +++ b/src/test/resources/bvt/parser/oracle-17.txt @@ -21,11 +21,17 @@ WHERE k.cnt > ? ORDER BY memberid ASC, createtime DESC --------------------------- -SELECT custid, memberid, to_char(createtime, 'yyyy-mm-dd hh24:mi:ss') AS createtime, planid, auditstate, to_char(modifytime, 'yyyy-mm-dd hh24:mi:ss') AS modifytime, createid, to_char(custappdate, 'yyyy-mm-dd hh24:mi:ss') AS custappdate, executeState, gmtcreate, custname, planbatchid -FROM (SELECT custid, memberid, createtime, planid, auditstate, createid, custappdate, executeState, custname, gmtcreate, cnt, planbatchid, modifytime - FROM (SELECT p.custid, p.memberid, p.createtime, p.planid, p.auditstate, p.createid, p.custappdate, p.modifytime, p.gmtcreate, p.executeState, c.custname, row_number() OVER ( ORDER BY p.memberid ASC, p.createtime DESC) AS cnt, p.planbatchid +SELECT custid, memberid, to_char(createtime, 'yyyy-mm-dd hh24:mi:ss') AS createtime, planid, auditstate + , to_char(modifytime, 'yyyy-mm-dd hh24:mi:ss') AS modifytime, createid, to_char(custappdate, 'yyyy-mm-dd hh24:mi:ss') AS custappdate, executeState, gmtcreate + , custname, planbatchid +FROM (SELECT custid, memberid, createtime, planid, auditstate + , createid, custappdate, executeState, custname, gmtcreate + , cnt, planbatchid, modifytime + FROM (SELECT p.custid, p.memberid, p.createtime, p.planid, p.auditstate + , p.createid, p.custappdate, p.modifytime, p.gmtcreate, p.executeState + , c.custname, row_number() OVER ( ORDER BY p.memberid ASC, p.createtime DESC) AS cnt, p.planbatchid FROM q_plan p , q_custinfo c WHERE p.custid = c.custid AND p.applytype = 0 AND p.createtime BETWEEN to_date(?, 'yyyy-mm-dd') AND to_date(?, 'yyyy-mm-dd hh24:mi:ss') AND (p.auditstate = ? AND p.executestate = 1) AND auditstate != 3 AND p.memberid IN (?)) t WHERE t.cnt < ?) k WHERE k.cnt > ? -ORDER BY memberid ASC, createtime DESC; \ No newline at end of file +ORDER BY memberid ASC, createtime DESC; diff --git a/src/test/resources/bvt/parser/oracle-24.txt b/src/test/resources/bvt/parser/oracle-24.txt index bd487221f7..b45d6854a4 100644 --- a/src/test/resources/bvt/parser/oracle-24.txt +++ b/src/test/resources/bvt/parser/oracle-24.txt @@ -16,7 +16,8 @@ where xh=1 --------------------------- SELECT INDUSTRY_ID, sale_type, service_type, RISK_TYPE, to_char(gmt_create, 'yyyy-mm-dd hh24:mi:ss') AS gmt_create -FROM (SELECT /*+use_hash(a b c) ordered*/ b.service_type, b.RISK_TYPE, b.sale_type, b.INDUSTRY_ID, b.GMT_CREATE, row_number() OVER (PARTITION BY (b.service_type, b.RISK_TYPE, b.sale_type, b.INDUSTRY_ID) ORDER BY b.GMT_CREATE) AS xh +FROM (SELECT /*+use_hash(a b c) ordered*/ b.service_type, b.RISK_TYPE, b.sale_type, b.INDUSTRY_ID, b.GMT_CREATE + , row_number() OVER (PARTITION BY (b.service_type, b.RISK_TYPE, b.sale_type, b.INDUSTRY_ID) ORDER BY b.GMT_CREATE) AS xh FROM "HT_TASK_FLOW_WA_2" a , "HT_TASK_FLOW_BIZ_WA_2" b , "HT_TASK_FLOW_NODE_WA_2" c WHERE a.id = b.task_flow_id AND a.id = c.task_flow_id AND c.status = 'waiting' AND c.IS_AUTO = 'N' AND a.status = 'running' AND c.name IN (?)) WHERE xh = 1; diff --git a/src/test/resources/bvt/parser/oracle-25.txt b/src/test/resources/bvt/parser/oracle-25.txt index 84eb3bf25f..b2cb802607 100644 --- a/src/test/resources/bvt/parser/oracle-25.txt +++ b/src/test/resources/bvt/parser/oracle-25.txt @@ -49,14 +49,19 @@ SELECT * FROM (SELECT row_.*, rownum AS rownum_ FROM (SELECT * FROM (SELECT results.*, row_number() OVER (PARTITION BY (results.object_id) ORDER BY results.gmt_modified DESC) AS rn - FROM (SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID, sus.OBJECT_TYPE AS OBJECT_TYPE, sus.CONFIRM_TYPE AS CONFIRM_TYPE, sus.OPERATOR AS OPERATOR, sus.FILTER_TYPE AS FILTER_TYPE, sus.MEMBER_ID AS MEMBER_ID, sus.MEMBER_SEQ AS MEMBER_SEQ, sus.RISK_TYPE AS RISK_TYPE, 'Y' AS IS_DRAFT + FROM (SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID + , sus.OBJECT_TYPE AS OBJECT_TYPE, sus.CONFIRM_TYPE AS CONFIRM_TYPE, sus.OPERATOR AS OPERATOR, sus.FILTER_TYPE AS FILTER_TYPE, sus.MEMBER_ID AS MEMBER_ID + , sus.MEMBER_SEQ AS MEMBER_SEQ, sus.RISK_TYPE AS RISK_TYPE, 'Y' AS IS_DRAFT FROM bops_sus_posting sus , ws_product_draft p , member m WHERE 1 = 1 AND p.company_id = m.company_id AND m.login_id = ? AND (p.sale_type IN (?) AND p.id = sus.object_id) UNION - SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID, sus.OBJECT_TYPE AS OBJECT_TYPE, sus.CONFIRM_TYPE AS CONFIRM_TYPE, sus.OPERATOR AS OPERATOR, sus.FILTER_TYPE AS FILTER_TYPE, sus.MEMBER_ID AS MEMBER_ID, sus.MEMBER_SEQ AS MEMBER_SEQ, sus.RISK_TYPE AS RISK_TYPE, 'N' AS IS_DRAFT + SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID + , sus.OBJECT_TYPE AS OBJECT_TYPE, sus.CONFIRM_TYPE AS CONFIRM_TYPE, sus.OPERATOR AS OPERATOR, sus.FILTER_TYPE AS FILTER_TYPE, sus.MEMBER_ID AS MEMBER_ID + , sus.MEMBER_SEQ AS MEMBER_SEQ, sus.RISK_TYPE AS RISK_TYPE, 'N' AS IS_DRAFT FROM bops_sus_posting sus , ws_product p , member m WHERE 1 = 1 AND p.company_id = m.company_id AND m.login_id = ? AND (p.sale_type IN (?) AND p.id = sus.object_id)) results) WHERE rn = 1 ORDER BY gmt_modified DESC) row_ WHERE rownum <= ?) WHERE rownum_ >= ?; +