From 585e4ef4ae1bbcefc0019e779b7ec7a87471c223 Mon Sep 17 00:00:00 2001 From: GodzillaHua Date: Fri, 11 Aug 2017 21:21:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?mysql=20limit=20=3F=20=E6=88=96=E8=80=85=20?= =?UTF-8?q?limit=20=3F,=3F=E4=B8=8D=E8=BF=9B=E8=A1=8C=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=8F=82=E6=95=B0=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E4=B8=8D=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/alibaba/druid/sql/PagerUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 66d0a3a5a9..9e05e76784 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -374,6 +374,8 @@ private static boolean limitMySqlQueryBlock(MySqlSelectQueryBlock queryBlock, St if (rowCount <= count && offset <= 0) { return false; } + } else if (check && limit.getRowCount() instanceof SQLVariantRefExpr) { + return false; } limit.setRowCount(new SQLIntegerExpr(count)); From 866a573e0b2b92a46edba9e5fbec9eb8940976ba Mon Sep 17 00:00:00 2001 From: GodzillaHua Date: Fri, 18 Aug 2017 16:51:29 +0800 Subject: [PATCH 2/2] testcase for issue #1899 --- ...Test_Limit_mysql_question_placeholder.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_mysql_question_placeholder.java diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_mysql_question_placeholder.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_mysql_question_placeholder.java new file mode 100644 index 0000000000..44ec2a79f0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_mysql_question_placeholder.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.sql; + +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.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.util.List; + +public class PagerUtilsTest_Limit_mysql_question_placeholder extends TestCase { + + public void testQuestionLimitPlaceholder1(){ + String sql = "select * from test_table limit ?"; + testQuestionLimitPlaceholderInternal(sql); + } + + public void testQuestionLimitPlaceholder2(){ + String sql = "select * from test_table limit ?, ?"; + testQuestionLimitPlaceholderInternal(sql); + } + + private void testQuestionLimitPlaceholderInternal(String sql){ + List statements; + try{ + statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + }catch(ParserException e){ + Assert.fail(e.getMessage()); + return; + } + if (statements == null || statements.size() == 0){ + Assert.fail("no sql found!"); + return; + } + if (statements.size() != 1) { + Assert.fail("sql not support count : " + sql); + return; + } + SQLSelectStatement statement = (SQLSelectStatement)statements.get(0); + if (!(statement instanceof SQLSelectStatement)) { + Assert.fail("sql not support count : " + sql); + return; + } + SQLSelect select = statement.getSelect(); + PagerUtils.limit(select, JdbcConstants.MYSQL, 0, 200, true); + SQLUtils.FormatOption options = new SQLUtils.FormatOption(); + options.setPrettyFormat(false); + options.setUppCase(false); + assertEquals(sql, SQLUtils.toSQLString(select, JdbcConstants.MYSQL, options)); + } + +}