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); + } }