From 80d19896e0bfb1ef7d80212102dfcd98a08e3888 Mon Sep 17 00:00:00 2001 From: GodzillaHua Date: Wed, 13 Sep 2017 14:42:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93sql=E6=9C=89order=20by=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E6=97=B6=EF=BC=8C=20=E5=88=86=E9=A1=B5=E7=BB=93?= =?UTF-8?q?=E6=9E=9Csql=E4=B8=AD=EF=BC=8C=20join=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1on=E7=9A=84=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/ast/statement/SQLJoinTableSource.java | 4 +++ ...leSelectTest_limit_join_with_order_by.java | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_limit_join_with_order_by.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java index be4eb58a0d..161d8734c5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java @@ -245,6 +245,10 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace x.setRight(right.clone()); } + if(condition != null){ + x.setCondition(condition); + } + for (SQLExpr item : using) { SQLExpr item2 = item.clone(); item2.setParent(x); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_limit_join_with_order_by.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_limit_join_with_order_by.java new file mode 100644 index 0000000000..594c15332c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_limit_join_with_order_by.java @@ -0,0 +1,33 @@ +package com.alibaba.druid.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.PagerUtils; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; + +import java.util.List; + +import static com.alibaba.druid.util.JdbcConstants.ORACLE; + +public class OracleSelectTest_limit_join_with_order_by extends OracleTest { + + /** + * 当sql有order by语句时, 分页结果sql中, join语句丢失on的条件 + */ + public void testLimitJoinWithOrderBy(){ + + String sql = "select * from A a " + + " left join B b on a.id = b.id " + + " where a.id = 10 order by create_time desc"; + + List statementList = SQLUtils.parseStatements(sql, ORACLE); + + SQLSelectStatement select = ((SQLSelectStatement)statementList.get(0)); + + PagerUtils.limit(select.getSelect(), ORACLE, 0, 200, true); + + String expected = "select XX.*, ROWNUM as RN from ( select * from A a left join B b on a.id = b.id where a.id = 10 order by create_time desc ) XX where ROWNUM <= 200"; + assertEquals(expected, SQLUtils.format(select.toString(), ORACLE, new SQLUtils.FormatOption(null))); + } +}