From 7fed345f0a95396941d6b0bc6dafaeab0dca1b53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Wed, 17 Feb 2021 18:09:05 +0800 Subject: [PATCH] bug fix for WallFilter setLimit, fix #2649 --- .../com/alibaba/druid/wall/WallProvider.java | 15 ++++++++++++- .../filter/wall/WallSelectLimitTest_2.java | 22 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 95609632e0..854fe88437 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -34,6 +34,7 @@ import com.alibaba.druid.DbType; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement; import com.alibaba.druid.sql.parser.Lexer; @@ -708,7 +709,19 @@ public abstract class WallProvider { } } else { if ((!updateCheckHandlerEnable) && sql.length() < MAX_SQL_LENGTH) { - sqlStat = addWhiteSql(sql, tableStat, context.getFunctionStats(), syntaxError); + boolean selectLimit = false; + if (config.getSelectLimit() > 0) { + for (SQLStatement stmt : statementList) { + if (stmt instanceof SQLSelectStatement) { + selectLimit = true; + break; + } + } + } + + if (!selectLimit) { + sqlStat = addWhiteSql(sql, tableStat, context.getFunctionStats(), syntaxError); + } } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSelectLimitTest_2.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSelectLimitTest_2.java index f4959f6638..471efe9a88 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSelectLimitTest_2.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSelectLimitTest_2.java @@ -15,7 +15,6 @@ */ package com.alibaba.druid.bvt.filter.wall; -import com.alibaba.druid.DbType; import com.alibaba.druid.sql.PagerUtils; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.wall.WallCheckResult; @@ -42,6 +41,27 @@ public class WallSelectLimitTest_2 extends TestCase { "LIMIT 10", resultSql); } + public void testMySql_0() throws Exception { + String sql = "select * from t"; + WallProvider provider = new MySqlWallProvider(config); + { + WallCheckResult checkResult = provider.check(sql); + String resultSql = checkResult.getSql(); + System.out.println(resultSql); + assertEquals("SELECT *\n" + + "FROM t\n" + + "LIMIT 1000", resultSql); + } + { + WallCheckResult checkResult = provider.check(sql); + String resultSql = checkResult.getSql(); + System.out.println(resultSql); + assertEquals("SELECT *\n" + + "FROM t\n" + + "LIMIT 1000", resultSql); + } + } + public void testPG() throws Exception { String sql = "select * from t limit 10"; WallProvider provider = new PGWallProvider(config);