From 009168b309ad364c90eb929413e414ef2dfeb01d Mon Sep 17 00:00:00 2001 From: magicdoom Date: Sat, 6 Jun 2015 07:58:08 +0800 Subject: [PATCH] =?UTF-8?q?fix=20issue=20#471=20DB2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93SQL=E5=B8=A6ORDER=20BY=E7=9A=84=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=94=9F=E6=88=90=E7=9A=84=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialect/db2/visitor/DB2OutputVisitor.java | 20 ++++++++++++++++++- .../bvt/sql/PagerUtilsTest_Limit_db2_0.java | 11 ++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java index 7d5bf20d37..4e74683d91 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java @@ -15,6 +15,9 @@ */ package com.alibaba.druid.sql.dialect.db2.visitor; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLOrderBy; +import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2ValuesStatement; @@ -31,12 +34,26 @@ public class DB2OutputVisitor extends SQLASTOutputVisitor implements DB2ASTVisit this.visit((SQLSelectQueryBlock) x); if (x.getFirst() != null) { + + //order by 语句必须在FETCH FIRST ROWS ONLY之前 + SQLObject parent= x.getParent(); + if(parent instanceof SQLSelect) + { + SQLOrderBy orderBy= ((SQLSelect) parent).getOrderBy(); + if (orderBy!=null&&orderBy.getItems().size() > 0) { + println(); + print("ORDER BY "); + printAndAccept(orderBy.getItems(), ", "); + ((SQLSelect) parent).setOrderBy(null); + } + } println(); print("FETCH FIRST "); x.getFirst().accept(this); print(" ROWS ONLY"); - } + + } if (x.isForReadOnly()) { println(); print("FOR READ ONLY"); @@ -57,6 +74,7 @@ public class DB2OutputVisitor extends SQLASTOutputVisitor implements DB2ASTVisit return false; } + @Override public void endVisit(DB2SelectQueryBlock x) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java index ca10383607..ea60c2d459 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java @@ -50,4 +50,15 @@ public class PagerUtilsTest_Limit_db2_0 extends TestCase { + "\nWHERE ROWNUM > 20"// + "\n\tAND ROWNUM <= 30", result); } + + public void test_fetch_order() { + String sql="SELECT t.CUSTNAME AS custname\n" + + "FROM CPS_LOAN_INFO t WHERE t.DEL_FLAG = 0\n" + + "ORDER BY t.CREATE_TIME DESC"; + + String limitSql=PagerUtils.limit(sql, JdbcConstants.DB2,0,20) ; + int fetchRowIndex=limitSql.indexOf("FETCH FIRST"); + int orderIndex=limitSql.indexOf("ORDER BY") ; + Assert.assertTrue(fetchRowIndex>orderIndex); + } }